summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@ginger.bigkitten.com>2008-05-17 11:48:36 -0700
committerDavid Schleef <ds@ginger.bigkitten.com>2008-05-17 11:48:36 -0700
commit54ec478a35384574bd593fc34a06bd7a2f88e4c5 (patch)
tree2b44c7d7158b3b580aa825203efd943d8a6e2b76
parentdb3dd6f982e20135e4702e2fcb47ad9face8ced4 (diff)
downloadliboil-54ec478a35384574bd593fc34a06bd7a2f88e4c5.tar.gz
[orc] convert register allocation to be more cross-platform
-rw-r--r--orc/orcprogram-x86.c13
-rw-r--r--orc/orcprogram.c51
-rw-r--r--orc/orcprogram.h8
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);