Fixes to build runnable arm code
authorDavid Schleef <ds@schleef.org>
Wed, 25 Mar 2009 03:05:18 +0000 (20:05 -0700)
committerDavid Schleef <ds@schleef.org>
Wed, 25 Mar 2009 03:05:18 +0000 (20:05 -0700)
orc/arm.c
orc/arm.h
orc/orcprogram-arm.c

index 1e58751..3e5cd7f 100644 (file)
--- a/orc/arm.c
+++ b/orc/arm.c
@@ -18,7 +18,7 @@
 const char *
 arm_reg_name (int reg)
 {
-#if 1
+#if 0
   static const char *gp_regs[] = {
     "a1", "a2", "a3", "a4",
     "v1", "v2", "v3", "v4",
@@ -29,7 +29,8 @@ arm_reg_name (int reg)
     "r0", "r1", "r2", "r3",
     "r4", "r5", "r6", "r7",
     "r8", "r9", "r10", "r11",
-    "r12", "r13", "r14", "r15" };
+    "ip", "sp", "lr", "pc" };
+    //"r12", "r13", "r14", "r15" };
 #endif
 
   if (reg < ORC_GP_REG_BASE || reg >= ORC_GP_REG_BASE+16) {
@@ -215,6 +216,23 @@ arm_emit_sub (OrcCompiler *compiler, int dest, int src1, int src2)
 }
 
 void
+arm_emit_add_imm (OrcCompiler *compiler, int dest, int src1, int value)
+{
+  uint32_t code;
+
+  code = 0xe2800000;
+  code |= (src1&0xf) << 16;
+  code |= (dest&0xf) << 12;
+  code |= (value) << 0;
+
+  ORC_ASM_CODE(compiler,"  add %s, %s, #%d\n",
+      arm_reg_name (dest),
+      arm_reg_name (src1),
+      value);
+  arm_emit (compiler, code);
+}
+
+void
 arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value)
 {
   uint32_t code;
index 5fc382f..4baf584 100644 (file)
--- a/orc/arm.h
+++ b/orc/arm.h
@@ -4,6 +4,8 @@
 
 #include <orc/orcprogram.h>
 
+#define ARM_R0 (ORC_GP_REG_BASE+0)
+
 #define ARM_A1 (ORC_GP_REG_BASE+0)
 #define ARM_A2 (ORC_GP_REG_BASE+1)
 #define ARM_A3 (ORC_GP_REG_BASE+2)
@@ -67,6 +69,7 @@ void arm_emit_loadimm (OrcCompiler *compiler, int dest, int imm);
 
 void arm_emit_add (OrcCompiler *compiler, int dest, int src1, int src2);
 void arm_emit_sub (OrcCompiler *compiler, int dest, int src1, int src2);
+void arm_emit_add_imm (OrcCompiler *compiler, int dest, int src1, int value);
 void arm_emit_sub_imm (OrcCompiler *compiler, int dest, int src1, int value);
 void arm_emit_cmp_imm (OrcCompiler *compiler, int src1, int value);
 
index a6f04c7..596fa89 100644 (file)
@@ -15,7 +15,7 @@
 
 #define SIZE 65536
 
-int arm_exec_ptr = ARM_V1;
+int arm_exec_ptr = ARM_R0;
 
 void arm_emit_loop (OrcCompiler *compiler);
 
@@ -108,10 +108,10 @@ orc_compiler_arm_init (OrcCompiler *compiler)
 {
   int i;
 
-  for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+16;i++){
+  for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+9;i++){
     compiler->valid_regs[i] = 1;
   }
-  compiler->valid_regs[ARM_V1] = 0;
+  compiler->valid_regs[ARM_R0] = 0;
   //compiler->valid_regs[ARM_SB] = 0;
   compiler->valid_regs[ARM_IP] = 0;
   compiler->valid_regs[ARM_SP] = 0;
@@ -337,9 +337,10 @@ arm_emit_loop (OrcCompiler *compiler)
     if (compiler->vars[k].vartype == ORC_VAR_TYPE_SRC ||
         compiler->vars[k].vartype == ORC_VAR_TYPE_DEST) {
       if (compiler->vars[k].ptr_register) {
-        //arm_emit_add_imm_reg (compiler, arm_ptr_size,
-        //    compiler->vars[k].size << compiler->loop_shift,
-        //    compiler->vars[k].ptr_register);
+        arm_emit_add_imm (compiler,
+            compiler->vars[k].ptr_register,
+            compiler->vars[k].ptr_register,
+            compiler->vars[k].size << compiler->loop_shift);
       } else {
         //arm_emit_add_imm_memoffset (compiler, arm_ptr_size,
         //    compiler->vars[k].size << compiler->loop_shift,