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

David Schleef ds at kemper.freedesktop.org
Tue May 20 14:12:12 PDT 2008


 orc/orcprogram-x86.c |    8 -----
 orc/orcprogram.c     |   70 ++++++++++++++++++++++++++++++++++++---------------
 orc/orcprogram.h     |   16 ++++++++++-
 3 files changed, 66 insertions(+), 28 deletions(-)

New commits:
commit 87e3d77bd3a3398ea22c7645817ceeea547dc7eb
Author: David Schleef <ds at ginger.bigkitten.com>
Date:   Tue May 20 14:11:54 2008 -0700

    [orc] rearranging code in order to add OilRegister

diff --git a/orc/orcprogram-x86.c b/orc/orcprogram-x86.c
index 1eeab2e..6bb6353 100644
--- a/orc/orcprogram-x86.c
+++ b/orc/orcprogram-x86.c
@@ -177,7 +177,7 @@ orc_program_reset_alloc (OrcProgram *program)
 }
 
 void
-orc_program_compile_x86 (OrcProgram *program)
+orc_program_assemble_x86 (OrcProgram *program)
 {
   int j;
   int k;
@@ -186,10 +186,6 @@ orc_program_compile_x86 (OrcProgram *program)
   OrcVariable *args[10];
   OrcRule *rule;
 
-  orc_program_allocate_codemem (program);
-
-  orc_program_rewrite_vars (program);
-
   x86_emit_prologue (program);
 
   x86_emit_mov_memoffset_reg (program, 4, (int)G_STRUCT_OFFSET(OrcExecutor,n),
@@ -294,8 +290,6 @@ orc_program_compile_x86 (OrcProgram *program)
 
 
   x86_do_fixups (program);
-
-  orc_program_dump_code (program);
 }
 
 
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 8930127..753a237 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -8,6 +8,10 @@
 
 #include <orc/orcprogram.h>
 
+void orc_program_assign_rules (OrcProgram *program);
+void orc_program_rewrite_vars (OrcProgram *program);
+void orc_program_rewrite_vars2 (OrcProgram *program);
+void orc_program_do_regs (OrcProgram *program);
 
 OrcProgram *
 orc_program_new (void)
@@ -125,6 +129,38 @@ orc_program_append (OrcProgram *program, const char *name, int arg0,
   program->n_insns++;
 }
 
+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_compile (OrcProgram *program)
+{
+  orc_program_assign_rules (program);
+  orc_program_rewrite_vars (program);
+
+  orc_program_do_regs (program);
+
+  orc_program_reset_alloc (program);
+  orc_program_rewrite_vars2 (program);
+
+  orc_program_allocate_codemem (program);
+  orc_program_assemble_x86 (program);
+
+  orc_program_dump_code (program);
+}
+
 void
 orc_program_assign_rules (OrcProgram *program)
 {
@@ -146,25 +182,9 @@ 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)
 {
-  int i;
   int j;
   int k;
   OrcInstruction *insn;
@@ -172,10 +192,6 @@ orc_program_rewrite_vars (OrcProgram *program)
   int var;
   int actual_var;
 
-  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;
@@ -241,6 +257,20 @@ orc_program_rewrite_vars (OrcProgram *program)
       program->vars[actual_var].last_use = j;
     }
   }
+}
+
+void
+orc_program_do_regs (OrcProgram *program)
+{
+
+}
+
+void
+orc_program_rewrite_vars2 (OrcProgram *program)
+{
+  int i;
+  int j;
+  int k;
 
   for(j=0;j<program->n_insns;j++){
 #if 1
diff --git a/orc/orcprogram.h b/orc/orcprogram.h
index 99df8d1..3db95a5 100644
--- a/orc/orcprogram.h
+++ b/orc/orcprogram.h
@@ -11,6 +11,7 @@ typedef struct _OrcOpcode OrcOpcode;
 typedef struct _OrcArgument OrcArgument;
 typedef struct _OrcInstruction OrcInstruction;
 typedef struct _OrcProgram OrcProgram;
+typedef struct _OrcRegister OrcRegister;
 typedef struct _OrcRule OrcRule;
 typedef struct _OrcFixup OrcFixup;
 
@@ -105,6 +106,15 @@ struct _OrcFixup {
   int label;
 };
 
+struct _OrcRegister {
+  int var;
+
+  int is_chained;
+  int chained_reg;
+
+  int merge;
+};
+
 struct _OrcProgram {
   OrcInstruction insns[100];
   int n_insns;
@@ -115,6 +125,9 @@ struct _OrcProgram {
   OrcInstruction *insn;
   int rule_set;
 
+  OrcRegister registers[100];
+  int n_regs;
+
   unsigned char *code;
   void *code_exec;
   unsigned char *codeptr;
@@ -164,7 +177,8 @@ void orc_program_append (OrcProgram *p, const char *opcode, int arg0, int arg1,
 
 void orc_x86_init (void);
 
-void orc_program_compile_x86 (OrcProgram *p);
+void orc_program_compile (OrcProgram *p);
+void orc_program_assemble_x86 (OrcProgram *p);
 void orc_program_free (OrcProgram *program);
 
 int orc_program_add_temporary (OrcProgram *program, const char *type, const char *name);


More information about the Liboil-commit mailing list