# HG changeset patch # User Michael Pavone # Date 1393222663 28800 # Node ID 474270dbff155880c19c39cee3783588aa4c3e16 # Parent 1af6c105299376d01b1c2e57b1f454048356fe9b Fix ARM code generation and test program diff -r 1af6c1052993 -r 474270dbff15 gen_arm.c --- a/gen_arm.c Sun Feb 23 21:37:19 2014 -0800 +++ b/gen_arm.c Sun Feb 23 22:17:43 2014 -0800 @@ -51,7 +51,7 @@ #define PUSH (OP_STR | PRE_IND | OFF_IMM | SZ_W | WRITE_B | DIR_DOWN | sizeof(uint32_t) | (sp << 16)) #define POP (OP_LDR | POST_IND | OFF_IMM | SZ_W | DIR_UP | sizeof(uint32_t) | (sp << 16)) #define PUSHM (OP_STM | PRE_IND | SZ_W | WRITE_B | DIR_DOWN | (sp << 16)) -#define POPM (OP_LDM | POST_IND | SZ_W | DIR_UP | (sp << 16)) +#define POPM (OP_LDM | POST_IND | SZ_W | WRITE_B | DIR_UP | (sp << 16)) #define IMMED 0x2000000u #define REG 0u @@ -87,7 +87,7 @@ void check_alloc_code(code_info *code) { - if (code->cur = code->last) { + if (code->cur == code->last) { size_t size = CODE_ALLOC_SIZE; uint32_t *next_code = alloc_code(&size); if (!next_code) { @@ -127,7 +127,7 @@ uint32_t data_proc(code_info *code, uint32_t cond, uint32_t op, uint32_t set_cond, uint32_t dst, uint32_t src1, uint32_t src2) { check_alloc_code(code); - *(code->cur++) = cond | op | set_cond | (dst << 16) | (src1 << 12) | src2; + *(code->cur++) = cond | op | set_cond | (src1 << 16) | (dst << 12) | src2; return CODE_OK; } @@ -135,10 +135,10 @@ uint32_t data_proci(code_info *code, uint32_t cond, uint32_t op, uint32_t set_cond, uint32_t dst, uint32_t src1, uint32_t immed) { immed = make_immed(immed); - if (immed = INVALID_IMMED) { + if (immed == INVALID_IMMED) { return immed; } - return data_proc(code, cond, op, set_cond, dst, src1, immed); + return data_proc(code, cond, op | IMMED, set_cond, dst, src1, immed); } //TODO: support shifted register for op2 diff -r 1af6c1052993 -r 474270dbff15 test_arm.c --- a/test_arm.c Sun Feb 23 21:37:19 2014 -0800 +++ b/test_arm.c Sun Feb 23 22:17:43 2014 -0800 @@ -20,7 +20,7 @@ bl(&code, fib); add(&code, r0, r4, r0, NO_COND); popm(&code, LR | R4); - bx(&code, LR); + bx(&code, lr); fib_fun fibc = (fib_fun)fib; printf("fib(10): %d\n", fibc(10));