summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@wendolyne.(none)>2008-05-24 20:27:36 -0700
committerDavid Schleef <ds@wendolyne.(none)>2008-05-24 20:27:36 -0700
commiteebf9ef1eda07482656cab3d9932ee3f5058cf95 (patch)
treea6652663796f3beab6c013807b7d9b986c2caa11
parentb04fe9a67a8f071224650b7ad77598955a1c7d77 (diff)
downloadliboil-eebf9ef1eda07482656cab3d9932ee3f5058cf95.tar.gz
[orc] powerpc fixes
-rw-r--r--orc/orcexecutor.c1
-rw-r--r--orc/orcprogram-powerpc.c88
-rw-r--r--orc/orcprogram.c4
3 files changed, 56 insertions, 37 deletions
diff --git a/orc/orcexecutor.c b/orc/orcexecutor.c
index 732e0f4..a8f976e 100644
--- a/orc/orcexecutor.c
+++ b/orc/orcexecutor.c
@@ -64,7 +64,6 @@ orc_executor_emulate (OrcExecutor *ex)
//printf("n_insns %d\n", program->n_insns);
for(i=0;i<ex->n;i++){
- printf("%d\n", i);
for(j=0;j<program->n_insns;j++){
insn = program->insns + j;
opcode = insn->opcode;
diff --git a/orc/orcprogram-powerpc.c b/orc/orcprogram-powerpc.c
index 8d22e38..543b95b 100644
--- a/orc/orcprogram-powerpc.c
+++ b/orc/orcprogram-powerpc.c
@@ -88,7 +88,39 @@ enum {
POWERPC_V28,
POWERPC_V29,
POWERPC_V30,
- POWERPC_V31
+ POWERPC_V31,
+ POWERPC_F0 = ORC_VEC2_REG_BASE,
+ POWERPC_F1,
+ POWERPC_F2,
+ POWERPC_F3,
+ POWERPC_F4,
+ POWERPC_F5,
+ POWERPC_F6,
+ POWERPC_F7,
+ POWERPC_F8,
+ POWERPC_F9,
+ POWERPC_F10,
+ POWERPC_F11,
+ POWERPC_F12,
+ POWERPC_F13,
+ POWERPC_F14,
+ POWERPC_F15,
+ POWERPC_F16,
+ POWERPC_F17,
+ POWERPC_F18,
+ POWERPC_F19,
+ POWERPC_F20,
+ POWERPC_F21,
+ POWERPC_F22,
+ POWERPC_F23,
+ POWERPC_F24,
+ POWERPC_F25,
+ POWERPC_F26,
+ POWERPC_F27,
+ POWERPC_F28,
+ POWERPC_F29,
+ POWERPC_F30,
+ POWERPC_F31
};
const char *
@@ -124,36 +156,6 @@ powerpc_regnum (int i)
return (i-ORC_GP_REG_BASE)&0x1f;
}
-int
-orc_program_powerpc_allocate_register (OrcProgram *program, int data_reg)
-{
- int i;
-
- if (!data_reg) {
- for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+32;i++){
- if (program->alloc_regs[i] == 0) {
- program->alloc_regs[i]++;
- program->used_regs[i] = 1;
- return i;
- }
- }
- } else {
- for(i=ORC_GP_REG_BASE+32;i<ORC_GP_REG_BASE+64;i++){
- if (program->alloc_regs[i] == 0) {
- program->alloc_regs[i]++;
- program->used_regs[i] = 1;
- return i;
- }
- }
- }
- printf("register overflow\n");
- return 0;
-}
-
-
-void orc_program_rewrite_vars (OrcProgram *program);
-void orc_program_dump (OrcProgram *program);
-
void
powerpc_emit(OrcProgram *program, unsigned int insn)
{
@@ -354,13 +356,27 @@ orc_program_powerpc_init (OrcProgram *program)
{
int i;
- for(i=ORC_GP_REG_BASE;i<ORC_GP_REG_BASE+64;i++){
- program->alloc_regs[i] = 0;
+ for(i=0;i<32;i++){
+ program->valid_regs[POWERPC_R0+i] = 1;
+ program->valid_regs[POWERPC_F0+i] = 1;
+ program->valid_regs[POWERPC_V0+i] = 1;
+ }
+ program->valid_regs[POWERPC_R0] = 0; /* used for temp space */
+ program->valid_regs[POWERPC_R1] = 0; /* stack pointer */
+ program->valid_regs[POWERPC_R2] = 0; /* TOC pointer */
+ program->valid_regs[POWERPC_R3] = 0; /* pointer to OrcExecutor */
+ program->valid_regs[POWERPC_R13] = 0; /* reserved */
+ program->valid_regs[POWERPC_V0] = 0; /* used for temp space */
+
+ for(i=14;i<32;i++){
+ program->save_regs[POWERPC_R0 + i] = 1;
+ program->save_regs[POWERPC_F0 + i] = 1;
}
- for(i=0;i<9;i++){
- program->alloc_regs[POWERPC_R0 + i] = 1;
+ for(i=20;i<32;i++){
+ program->save_regs[POWERPC_V0 + i] = 1;
}
- program->alloc_regs[POWERPC_V0] = 1;
+
+ program->data_register_class = 2;
}
void
diff --git a/orc/orcprogram.c b/orc/orcprogram.c
index 30e595b..b64d41a 100644
--- a/orc/orcprogram.c
+++ b/orc/orcprogram.c
@@ -21,7 +21,11 @@ orc_program_new (void)
p = malloc(sizeof(OrcProgram));
memset (p, 0, sizeof(OrcProgram));
+#if defined(HAVE_POWERPC)
+ p->rule_set = ORC_RULE_ALTIVEC_1;
+#else
p->rule_set = ORC_RULE_MMX_1;
+#endif
p->n_per_loop = 1;
p->loop_shift = 0;