From: Cerion Armour-Brown Date: Tue, 13 Sep 2005 18:41:09 +0000 (+0000) Subject: implemented guest-ppc32 lvsl, lvsr using dirty helper function X-Git-Tag: svn/VALGRIND_3_1_1^2~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5dff299d9e08046021e30b3b929deaac6e97ee3a;p=thirdparty%2Fvalgrind.git implemented guest-ppc32 lvsl, lvsr using dirty helper function git-svn-id: svn://svn.valgrind.org/vex/trunk@1391 --- diff --git a/VEX/priv/guest-ppc32/gdefs.h b/VEX/priv/guest-ppc32/gdefs.h index cf06b5aa8d..db854cc0c6 100644 --- a/VEX/priv/guest-ppc32/gdefs.h +++ b/VEX/priv/guest-ppc32/gdefs.h @@ -133,6 +133,9 @@ enum { extern ULong ppc32g_dirtyhelper_MFTB ( void ); +extern void ppc32g_dirtyhelper_LVS ( VexGuestPPC32State* gst, + UInt vD_idx, UInt sh, + UInt dirn ); #endif /* ndef __LIBVEX_GUEST_PPC32_DEFS_H */ diff --git a/VEX/priv/guest-ppc32/ghelpers.c b/VEX/priv/guest-ppc32/ghelpers.c index 7703bf42fa..d1635666c1 100644 --- a/VEX/priv/guest-ppc32/ghelpers.c +++ b/VEX/priv/guest-ppc32/ghelpers.c @@ -99,6 +99,32 @@ ULong ppc32g_dirtyhelper_MFTB ( void ) } +/* 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 <= 31 ); + vassert( sh <= 15 ); + vassert( dirn <= 1 ); + UChar ref[32] = { 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 == 1) /* shift right */ + sh = 16-sh; + /* else shift left */ + + U128* pU128_src = (U128*)&ref[sh]; + U128* pU128_dst = &gst->guest_VR0 + (vD_idx*sizeof(gst->guest_VR0)); + + (*pU128_dst)[0] = (*pU128_src)[0]; + (*pU128_dst)[1] = (*pU128_src)[1]; + (*pU128_dst)[2] = (*pU128_src)[2]; + (*pU128_dst)[3] = (*pU128_src)[3]; +} + + /* Helper-function specialiser. */ IRExpr* guest_ppc32_spechelper ( HChar* function_name, diff --git a/VEX/priv/guest-ppc32/toIR.c b/VEX/priv/guest-ppc32/toIR.c index f611e40ce4..5caea6d11f 100644 --- a/VEX/priv/guest-ppc32/toIR.c +++ b/VEX/priv/guest-ppc32/toIR.c @@ -4865,16 +4865,44 @@ static Bool dis_av_load ( UInt theInstr ) switch (opc2) { - 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(" => not implemented\n"); - return False; - - case 0x026: // lvsr (Load Vector for Shift Right, AV p125) + IRExpr** args = mkIRExprVec_3(mkU32(vD_addr), mkexpr(EA), mkU32(0)); + IRDirty* d = unsafeIRDirty_0_N ( + 0/*regparms*/, + "ppc32g_dirtyhelper_LVS", + &ppc32g_dirtyhelper_LVS, + args ); + /* declare guest state effects */ + d->needsBBP = True; + d->nFxState = 1; + d->fxState[0].fx = Ifx_Write; + d->fxState[0].offset = vectorGuestRegOffset(vD_addr); + d->fxState[0].size = sizeof(U128); + + /* 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(" => not implemented\n"); - return False; - + IRExpr** args = mkIRExprVec_3(mkU32(vD_addr), mkexpr(EA), mkU32(1)); + IRDirty* d = unsafeIRDirty_0_N ( + 0/*regparms*/, + "ppc32g_dirtyhelper_LVS", + &ppc32g_dirtyhelper_LVS, + args ); + /* declare guest state effects */ + d->needsBBP = True; + d->nFxState = 1; + d->fxState[0].fx = Ifx_Write; + d->fxState[0].offset = vectorGuestRegOffset(vD_addr); + d->fxState[0].size = sizeof(U128); + + /* 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(" => not implemented\n");