|
From: <sv...@va...> - 2005-09-13 18:41:17
|
Author: cerion
Date: 2005-09-13 19:41:09 +0100 (Tue, 13 Sep 2005)
New Revision: 1391
Log:
implemented guest-ppc32 lvsl, lvsr using dirty helper function
Modified:
trunk/priv/guest-ppc32/gdefs.h
trunk/priv/guest-ppc32/ghelpers.c
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/gdefs.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/guest-ppc32/gdefs.h 2005-09-13 17:25:41 UTC (rev 1390)
+++ trunk/priv/guest-ppc32/gdefs.h 2005-09-13 18:41:09 UTC (rev 1391)
@@ -133,6 +133,9 @@
=20
extern ULong ppc32g_dirtyhelper_MFTB ( void );
=20
+extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst,
+ UInt vD_idx, UInt sh,
+ UInt dirn );
=20
#endif /* ndef __LIBVEX_GUEST_PPC32_DEFS_H */
=20
Modified: trunk/priv/guest-ppc32/ghelpers.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/guest-ppc32/ghelpers.c 2005-09-13 17:25:41 UTC (rev 1390)
+++ trunk/priv/guest-ppc32/ghelpers.c 2005-09-13 18:41:09 UTC (rev 1391)
@@ -99,6 +99,32 @@
}
=20
=20
+/* CALLED FROM GENERATED CODE */
+/* DIRTY HELPER (reads guest state, writes guest mem) */
+void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst,
+ UInt vD_idx, UInt sh, UInt dirn )
+{
+ vassert( vD_idx <=3D 31 );
+ vassert( sh <=3D 15 );
+ vassert( dirn <=3D 1 );
+ UChar ref[32] =3D { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
+ if (dirn =3D=3D 1) /* shift right */
+ sh =3D 16-sh;
+ /* else shift left */
+
+ U128* pU128_src =3D (U128*)&ref[sh];
+ U128* pU128_dst =3D &gst->guest_VR0 + (vD_idx*sizeof(gst->guest_VR0));
+
+ (*pU128_dst)[0] =3D (*pU128_src)[0];
+ (*pU128_dst)[1] =3D (*pU128_src)[1];
+ (*pU128_dst)[2] =3D (*pU128_src)[2];
+ (*pU128_dst)[3] =3D (*pU128_src)[3];
+}
+
+
/* Helper-function specialiser. */
=20
IRExpr* guest_ppc32_spechelper ( HChar* function_name,
Modified: trunk/priv/guest-ppc32/toIR.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/guest-ppc32/toIR.c 2005-09-13 17:25:41 UTC (rev 1390)
+++ trunk/priv/guest-ppc32/toIR.c 2005-09-13 18:41:09 UTC (rev 1391)
@@ -4865,16 +4865,44 @@
=20
switch (opc2) {
=20
- case 0x006: // lvsl (Load Vector for Shift Left, AV p123)
+ case 0x006: { // lvsl (Load Vector for Shift Left, AV p123)
DIP("lvsl v%d,r%d,r%d\n", vD_addr, rA_addr, rB_addr);
- DIP(" =3D> not implemented\n");
- return False;
+ IRExpr** args =3D mkIRExprVec_3(mkU32(vD_addr), mkexpr(EA), mkU32(=
0));
+ IRDirty* d =3D unsafeIRDirty_0_N (
+ 0/*regparms*/,=20
+ "ppc32g_dirtyhelper_LVS",
+ &ppc32g_dirtyhelper_LVS,
+ args );
+ /* declare guest state effects */
+ d->needsBBP =3D True;
+ d->nFxState =3D 1;
+ d->fxState[0].fx =3D Ifx_Write;
+ d->fxState[0].offset =3D vectorGuestRegOffset(vD_addr);
+ d->fxState[0].size =3D sizeof(U128);
=20
- case 0x026: // lvsr (Load Vector for Shift Right, AV p125)
+ /* execute the dirty call, side-effecting guest state */
+ stmt( IRStmt_Dirty(d) );
+ break;
+ }
+ case 0x026: { // lvsr (Load Vector for Shift Right, AV p125)
DIP("lvsr v%d,r%d,r%d\n", vD_addr, rA_addr, rB_addr);
- DIP(" =3D> not implemented\n");
- return False;
+ IRExpr** args =3D mkIRExprVec_3(mkU32(vD_addr), mkexpr(EA), mkU32(=
1));
+ IRDirty* d =3D unsafeIRDirty_0_N (
+ 0/*regparms*/,=20
+ "ppc32g_dirtyhelper_LVS",
+ &ppc32g_dirtyhelper_LVS,
+ args );
+ /* declare guest state effects */
+ d->needsBBP =3D True;
+ d->nFxState =3D 1;
+ d->fxState[0].fx =3D Ifx_Write;
+ d->fxState[0].offset =3D vectorGuestRegOffset(vD_addr);
+ d->fxState[0].size =3D sizeof(U128);
=20
+ /* execute the dirty call, side-effecting guest state */
+ stmt( IRStmt_Dirty(d) );
+ break;
+ }
case 0x007: // lvebx (Load Vector Element Byte Indexed, AV p119)
DIP("lvebx v%d,r%d,r%d\n", vD_addr, rA_addr, rB_addr);
DIP(" =3D> not implemented\n");
|