summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-20 14:11:54 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-20 14:11:54 -0700
commit87e3d77bd3a3398ea22c7645817ceeea547dc7eb (patch)
treee151c22e77c3a425bf50bf446c0d1020a84245cd
parentb1b8fdccc0981ef32a17030d19d3d153509c20db (diff)
downloadliboil-87e3d77bd3a3398ea22c7645817ceeea547dc7eb.tar.gz
[orc] rearranging code in order to add OilRegister
-rw-r--r--orc/orcprogram-x86.c8
-rw-r--r--orc/orcprogram.c70
-rw-r--r--orc/orcprogram.h16
3 files changed, 66 insertions, 28 deletions
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);