changeset 554:474270dbff15

Fix ARM code generation and test program
author Michael Pavone <pavone@retrodev.com>
date Sun, 23 Feb 2014 22:17:43 -0800
parents 1af6c1052993
children 5af986d2b9da
files gen_arm.c test_arm.c
diffstat 2 files changed, 6 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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));