diff options
author | David Schleef <ds@ginger.bigkitten.com> | 2008-05-17 11:48:36 -0700 |
---|---|---|
committer | David Schleef <ds@ginger.bigkitten.com> | 2008-05-17 11:48:36 -0700 |
commit | 54ec478a35384574bd593fc34a06bd7a2f88e4c5 (patch) | |
tree | 2b44c7d7158b3b580aa825203efd943d8a6e2b76 | |
parent | db3dd6f982e20135e4702e2fcb47ad9face8ced4 (diff) | |
download | liboil-54ec478a35384574bd593fc34a06bd7a2f88e4c5.tar.gz |
[orc] convert register allocation to be more cross-platform
-rw-r--r-- | orc/orcprogram-x86.c | 13 | ||||
-rw-r--r-- | orc/orcprogram.c | 51 | ||||
-rw-r--r-- | orc/orcprogram.h | 8 |
3 files changed, 44 insertions, 28 deletions
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); |