[Liboil-commit] orc/orcprogram-x86.c orc/orcprogram.c orc/orcprogram.h

David Schleef ds at kemper.freedesktop.org
Sat May 17 11:49:20 PDT 2008


 orc/orcprogram-x86.c |   13 +++++++++++++
 orc/orcprogram.c     |   51 +++++++++++++++++++++++++--------------------------
 orc/orcprogram.h     |    8 ++++++--
 3 files changed, 44 insertions(+), 28 deletions(-)

New commits:
commit 54ec478a35384574bd593fc34a06bd7a2f88e4c5
Author: David Schleef <ds at ginger.bigkitten.com>
Date:   Sat May 17 11:48:36 2008 -0700

    [orc] convert register allocation to be more cross-platform

diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c
index b32bd2c..c669cca 100644
--- a/orc/orcprogram-x86.c
+++ b/orc/orcprogram-x86.c
@@ -146,6 +146,19 @@ orc_x86_init (void)
 }
 
 void
+orc_program_reset_alloc (OrcProgram *program)
+{
+  int i;
+
+  for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+8;i++){
+    program->alloc_regs[i] = 0;
+  }
+  program->alloc_regs[X86_ECX] = 1;
+  program->alloc_regs[X86_ESP] = 1;
+  program->alloc_regs[X86_EBP] = 1;
+}
+
+void
 orc_program_compile_x86 (OrcProgram *program)
 {
   int j;
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index f93a1b9..f13953c 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -132,6 +132,20 @@ orc_program_assign_rules (OrcProgram *program)
   }
 }
 
+int
+orc_program_allocate_register (OrcProgram *program, int data_reg)
+{
+  int i;
+
+  for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+8;i++){
+    if (program->alloc_regs[i] == 0) {
+      program->alloc_regs[i]++;
+      return i;
+    }
+  }
+  g_print("register overflow\n");
+  return 0;
+}
 
 void
 orc_program_rewrite_vars (OrcProgram *program)
@@ -143,10 +157,11 @@ orc_program_rewrite_vars (OrcProgram *program)
   OrcOpcode *opcode;
   int var;
   int actual_var;
-  int alloc[8] = { 0, 1, 0, 0, 1, 1, 0, 0 };
 
   orc_program_assign_rules (program);
 
+  orc_program_reset_alloc (program);
+
   for(j=0;j<program->n_insns;j++){
     insn = program->insns + j;
     opcode = insn->opcode;
@@ -224,19 +239,11 @@ orc_program_rewrite_vars (OrcProgram *program)
       int dest = program->insns[j].args[0];
       if (program->vars[src1].last_use == j) {
         if (program->vars[src1].first_use == j) {
-          for(k=0;k<8;k++){
-            if (alloc[k] == 0) {
-              program->vars[src1].alloc = k + ORC_GP_REG_BASE;
-              alloc[k] = 1;
-              program->used_regs[k] = 1;
-              break;
-            }
-          }
-          if (k==8) {
-            g_print("register overflow\n");
-          }
+          k = orc_program_allocate_register (program, FALSE);
+          program->vars[src1].alloc = k;
+          program->used_regs[k] = 1;
         }
-        alloc[program->vars[src1].alloc - ORC_GP_REG_BASE]++;
+        program->alloc_regs[program->vars[src1].alloc]++;
         program->vars[dest].alloc = program->vars[src1].alloc;
       }
     }
@@ -245,27 +252,19 @@ orc_program_rewrite_vars (OrcProgram *program)
     for(i=0;i<program->n_vars;i++){
       if (program->vars[i].first_use == j) {
         if (program->vars[i].alloc) continue;
-        for(k=0;k<8;k++){
-          if (alloc[k] == 0) {
-            program->vars[i].alloc = k + ORC_GP_REG_BASE;
-            alloc[k] = 1;
-            program->used_regs[k] = 1;
-            break;
-          }
-        }
-        if (k==8) {
-          g_print("register overflow\n");
-        }
+        k = orc_program_allocate_register (program, FALSE);
+        program->vars[i].alloc = k;
+        program->used_regs[k] = 1;
       }
     }
     for(i=0;i<program->n_vars;i++){
       if (program->vars[i].last_use == j) {
-        alloc[program->vars[i].alloc - ORC_GP_REG_BASE]--;
+        program->alloc_regs[program->vars[i].alloc]--;
       }
     }
   }
 
-#if 1
+#if 0
   for(i=0;i<program->n_vars;i++){
     g_print("# %2d: %2d %2d %d\n",
         i,
diff --git a/orc/orcprogram.h b/orc/orcprogram.h
index bc7b3f3..d0fb38f 100644
--- a/orc/orcprogram.h
+++ b/orc/orcprogram.h
@@ -18,6 +18,8 @@ typedef struct _OrcFixup OrcFixup;
 typedef void (*OrcOpcodeEmulateFunc)(OrcExecutor *ex, void *user);
 typedef void (*OrcRuleEmitFunc)(OrcProgram *p, void *user, OrcInstruction *insn);
 
+#define ORC_N_REGS 64
+
 struct _OrcType {
   char *name;
   int size;
@@ -104,8 +106,8 @@ struct _OrcProgram {
 
   int error;
 
-  int used_regs[8];
-  int alloc_regs[8];
+  int used_regs[ORC_N_REGS];
+  int alloc_regs[ORC_N_REGS];
 };
 
 struct _OrcExecutor {
@@ -168,6 +170,8 @@ int orc_program_add_constant (OrcProgram *program, const char *type, int value,
 void orc_program_append (OrcProgram *program, const char *opcode, int arg0,
     int arg1, int arg2);
 
+void orc_program_reset_alloc (OrcProgram *program);
+
 
 OrcType * orc_type_get (const char *name);
 void orc_type_register (const char *name, int size);


More information about the Liboil-commit mailing list