]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
implemented guest-ppc32 lvsl, lvsr using dirty helper function
authorCerion Armour-Brown <cerion@valgrind.org>
Tue, 13 Sep 2005 18:41:09 +0000 (18:41 +0000)
committerCerion Armour-Brown <cerion@valgrind.org>
Tue, 13 Sep 2005 18:41:09 +0000 (18:41 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@1391

VEX/priv/guest-ppc32/gdefs.h
VEX/priv/guest-ppc32/ghelpers.c
VEX/priv/guest-ppc32/toIR.c

index cf06b5aa8d57e725d0a9815427d90f212a2a01ed..db854cc0c645880d92f55e87414a835f734279a9 100644 (file)
@@ -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 */
 
index 7703bf42fa15450807520bcbc1f8356320f4934e..d1635666c1020fb9e53a4ffaf7fbc613867d77c5 100644 (file)
@@ -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,
index f611e40ce4c218ec20f1b36f7138b544dcdd1ab7..5caea6d11f7aaafe76d5cca4267412f04f491eaa 100644 (file)
@@ -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");