diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2008-05-20 14:11:54 -0700 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2008-05-20 14:11:54 -0700 |
commit | 87e3d77bd3a3398ea22c7645817ceeea547dc7eb (patch) | |
tree | e151c22e77c3a425bf50bf446c0d1020a84245cd | |
parent | b1b8fdccc0981ef32a17030d19d3d153509c20db (diff) | |
download | liboil-87e3d77bd3a3398ea22c7645817ceeea547dc7eb.tar.gz |
[orc] rearranging code in order to add OilRegister
-rw-r--r-- | orc/orcprogram-x86.c | 8 | ||||
-rw-r--r-- | orc/orcprogram.c | 70 | ||||
-rw-r--r-- | orc/orcprogram.h | 16 |
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); |