|
From: <sv...@va...> - 2005-12-15 21:33:52
|
Author: sewardj
Date: 2005-12-15 21:33:50 +0000 (Thu, 15 Dec 2005)
New Revision: 1496
Log:
Make suitable changes for ppc32/ppc64 following recent x86/amd64
dispatch changes. Note, this doesn't change the generated code at
all.
Modified:
trunk/priv/host-ppc32/hdefs.c
trunk/priv/host-ppc32/hdefs.h
Modified: trunk/priv/host-ppc32/hdefs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-ppc32/hdefs.c 2005-12-15 15:45:20 UTC (rev 1495)
+++ trunk/priv/host-ppc32/hdefs.c 2005-12-15 21:33:50 UTC (rev 1496)
@@ -227,6 +227,7 @@
(*arr)[i++] =3D hregPPC_GPR12(mode64);
}
// GPR13 =3D thread specific pointer
+ // GPR 14 and above are callee save. Yay.
(*arr)[i++] =3D hregPPC_GPR14(mode64);
(*arr)[i++] =3D hregPPC_GPR15(mode64);
(*arr)[i++] =3D hregPPC_GPR16(mode64);
@@ -243,9 +244,12 @@
(*arr)[i++] =3D hregPPC_GPR27(mode64);
(*arr)[i++] =3D hregPPC_GPR28(mode64);
(*arr)[i++] =3D hregPPC_GPR29(mode64);
- // GPR30 AltiVec spill reg temporary
- // GPR31 =3D GuestStatePtr
+ // GPR30 is reserved as AltiVec spill reg temporary
+ // GPR31 is reserved for the GuestStatePtr
=20
+ /* Don't waste the reg-allocs's time trawling through zillions of
+ FP registers - they mostly will never be used. We'll tolerate
+ the occasional extra spill instead. */
(*arr)[i++] =3D hregPPC32_FPR0();
(*arr)[i++] =3D hregPPC32_FPR1();
(*arr)[i++] =3D hregPPC32_FPR2();
@@ -254,32 +258,8 @@
(*arr)[i++] =3D hregPPC32_FPR5();
(*arr)[i++] =3D hregPPC32_FPR6();
(*arr)[i++] =3D hregPPC32_FPR7();
-/*
- (*arr)[i++] =3D hregPPC32_FPR8();
- (*arr)[i++] =3D hregPPC32_FPR9();
- (*arr)[i++] =3D hregPPC32_FPR10();
- (*arr)[i++] =3D hregPPC32_FPR11();
- (*arr)[i++] =3D hregPPC32_FPR12();
- (*arr)[i++] =3D hregPPC32_FPR13();
- (*arr)[i++] =3D hregPPC32_FPR14();
- (*arr)[i++] =3D hregPPC32_FPR15();
- (*arr)[i++] =3D hregPPC32_FPR16();
- (*arr)[i++] =3D hregPPC32_FPR17();
- (*arr)[i++] =3D hregPPC32_FPR18();
- (*arr)[i++] =3D hregPPC32_FPR19();
- (*arr)[i++] =3D hregPPC32_FPR20();
- (*arr)[i++] =3D hregPPC32_FPR21();
- (*arr)[i++] =3D hregPPC32_FPR22();
- (*arr)[i++] =3D hregPPC32_FPR23();
- (*arr)[i++] =3D hregPPC32_FPR24();
- (*arr)[i++] =3D hregPPC32_FPR25();
- (*arr)[i++] =3D hregPPC32_FPR26();
- (*arr)[i++] =3D hregPPC32_FPR27();
- (*arr)[i++] =3D hregPPC32_FPR28();
- (*arr)[i++] =3D hregPPC32_FPR29();
- (*arr)[i++] =3D hregPPC32_FPR30();
- (*arr)[i++] =3D hregPPC32_FPR31();
-*/
+
+ /* Same deal re Altivec */
(*arr)[i++] =3D hregPPC32_VR0();
(*arr)[i++] =3D hregPPC32_VR1();
(*arr)[i++] =3D hregPPC32_VR2();
@@ -288,32 +268,7 @@
(*arr)[i++] =3D hregPPC32_VR5();
(*arr)[i++] =3D hregPPC32_VR6();
(*arr)[i++] =3D hregPPC32_VR7();
-/*
- (*arr)[i++] =3D hregPPC32_VR8();
- (*arr)[i++] =3D hregPPC32_VR9();
- (*arr)[i++] =3D hregPPC32_VR10();
- (*arr)[i++] =3D hregPPC32_VR11();
- (*arr)[i++] =3D hregPPC32_VR12();
- (*arr)[i++] =3D hregPPC32_VR13();
- (*arr)[i++] =3D hregPPC32_VR14();
- (*arr)[i++] =3D hregPPC32_VR15();
- (*arr)[i++] =3D hregPPC32_VR16();
- (*arr)[i++] =3D hregPPC32_VR17();
- (*arr)[i++] =3D hregPPC32_VR18();
- (*arr)[i++] =3D hregPPC32_VR19();
- (*arr)[i++] =3D hregPPC32_VR20();
- (*arr)[i++] =3D hregPPC32_VR21();
- (*arr)[i++] =3D hregPPC32_VR22();
- (*arr)[i++] =3D hregPPC32_VR23();
- (*arr)[i++] =3D hregPPC32_VR24();
- (*arr)[i++] =3D hregPPC32_VR25();
- (*arr)[i++] =3D hregPPC32_VR26();
- (*arr)[i++] =3D hregPPC32_VR27();
- (*arr)[i++] =3D hregPPC32_VR28();
- (*arr)[i++] =3D hregPPC32_VR29();
- (*arr)[i++] =3D hregPPC32_VR30();
- (*arr)[i++] =3D hregPPC32_VR31();
-*/
+
vassert(i =3D=3D *nregs);
}
=20
@@ -1263,7 +1218,9 @@
vex_printf("if (%s) ", showPPC32CondCode(i->Pin.Goto.cond));
}
vex_printf("{ ");
- if (i->Pin.Goto.jk !=3D Ijk_Boring) {
+ if (i->Pin.Goto.jk !=3D Ijk_Boring
+ && i->Pin.Goto.jk !=3D Ijk_Call
+ && i->Pin.Goto.jk !=3D Ijk_Ret) {
vex_printf("li %%r31,$");
ppIRJumpKind(i->Pin.Goto.jk);
vex_printf(" ; ");
@@ -1670,7 +1627,12 @@
addRegUsage_PPC32RI(u, i->Pin.Goto.dst);
/* GPR3 holds destination address from Pin_Goto */
addHRegUse(u, HRmWrite, hregPPC_GPR3(mode64));
- if (i->Pin.Goto.jk !=3D Ijk_Boring)
+ if (i->Pin.Goto.jk !=3D Ijk_Boring
+ && i->Pin.Goto.jk !=3D Ijk_Call
+ && i->Pin.Goto.jk !=3D Ijk_Ret)
+ /* note, this is irrelevant since the guest state pointer
+ register is not actually available to the allocator.
+ But still .. */
addHRegUse(u, HRmWrite, GuestStatePtr(mode64));
return;
case Pin_CMov:
@@ -2437,9 +2399,14 @@
=20
/* Emit an instruction into buf and return the number of bytes used.
Note that buf is not the insn's final place, and therefore it is
- imperative to emit position-independent code. */
+ imperative to emit position-independent code.=20
=20
-Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i, Bool mode64 )
+ Note, dispatch should always be NULL since ppc32/ppc64 backends
+ use a call-return scheme to get from the dispatcher to generated
+ code and back.
+*/
+Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32Instr* i,=20
+ Bool mode64, void* dispatch )
{
UChar* p =3D &buf[0];
UChar* ptmp =3D p;
@@ -2789,6 +2756,8 @@
PPC32CondCode cond =3D i->Pin.Goto.cond;
UInt r_dst;
ULong imm_dst;
+
+ vassert(dispatch =3D=3D NULL);
=20
/* First off, if this is conditional, create a conditional
jump over the rest of it. */
Modified: trunk/priv/host-ppc32/hdefs.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-ppc32/hdefs.h 2005-12-15 15:45:20 UTC (rev 1495)
+++ trunk/priv/host-ppc32/hdefs.h 2005-12-15 21:33:50 UTC (rev 1496)
@@ -88,9 +88,9 @@
extern HReg hregPPC_GPR26 ( Bool mode64 );
extern HReg hregPPC_GPR27 ( Bool mode64 );
extern HReg hregPPC_GPR28 ( Bool mode64 );
-extern HReg hregPPC_GPR29 ( Bool mode64 );
-extern HReg hregPPC_GPR30 ( Bool mode64 );
-extern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr
+extern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
+extern HReg hregPPC_GPR30 ( Bool mode64 ); // we use as VMX spill tempor=
ary
+extern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-save=
d)
=20
extern HReg hregPPC32_FPR0 ( void );
extern HReg hregPPC32_FPR1 ( void );
@@ -783,7 +783,8 @@
extern void getRegUsage_PPC32Instr ( HRegUsage*, PPC32Instr*, Bo=
ol mode64 );
extern void mapRegs_PPC32Instr ( HRegRemap*, PPC32Instr* , B=
ool mode64);
extern Bool isMove_PPC32Instr ( PPC32Instr*, HReg*, HReg* )=
;
-extern Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32=
Instr*, Bool mode64 );
+extern Int emit_PPC32Instr ( UChar* buf, Int nbuf, PPC32=
Instr*,=20
+ Bool mode64, void* dispatch=
);
extern PPC32Instr* genSpill_PPC32 ( HReg rreg, UShort offsetB, =
Bool mode64 );
extern PPC32Instr* genReload_PPC32 ( HReg rreg, UShort offsetB, =
Bool mode64 );
extern void getAllocableRegs_PPC32 ( Int*, HReg**, Bool mode64 )=
;
|