]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips32/mips64: Fix the problem with lwl and lwr for mips32 and mips64.
authorDejan Jevtic <dejan.jevtic@valgrind.org>
Mon, 2 Sep 2013 15:35:58 +0000 (15:35 +0000)
committerDejan Jevtic <dejan.jevtic@valgrind.org>
Mon, 2 Sep 2013 15:35:58 +0000 (15:35 +0000)
This patch is fixing the problem with lwl and lwr for mips32 and mips64
that was discovered while running v8 tests for mips32.

git-svn-id: svn://svn.valgrind.org/vex/trunk@2749

VEX/priv/guest_mips_toIR.c

index 926874e7fd134f48361b0ce3fc56643176382578..7c248edae16d1908d0e9f43b8ba8afb976b7a0be 100644 (file)
@@ -12846,10 +12846,13 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          /* rt content - adjusted */
          t5 = newTemp(Ity_I32);
-         assign(t5, binop(Iop_And32, mkNarrowTo32(ty, getIReg(rt)),
-                    binop(Iop_Shr32, mkU32(0xFFFFFFFF), narrowTo(Ity_I8,
-                    binop(Iop_Shl32, binop(Iop_Add32, mkexpr(t4), mkU32(0x1)),
-                    mkU8(0x3))))));
+         assign(t5, binop(Iop_And32,
+                          mkNarrowTo32(ty, getIReg(rt)),
+                          binop(Iop_Shr32,
+                                mkU32(0x00FFFFFF),
+                                      narrowTo(Ity_I8, binop(Iop_Mul32,
+                                                             mkU32(0x08),
+                                                             mkexpr(t4))))));
 
          putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
                                              mkexpr(t3)), True));
@@ -12868,10 +12871,13 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          /* rt content - adjusted */
          t5 = newTemp(Ity_I32);
-         assign(t5, binop(Iop_And32, unop(Iop_64HIto32, getIReg(rt)),
-                    binop(Iop_Shr32, mkU32(0xFFFFFFFF), narrowTo(Ity_I8,
-                    binop(Iop_Shl32, binop(Iop_Add32, mkexpr(t4), mkU32(0x1)),
-                    mkU8(0x3))))));
+         assign(t5, binop(Iop_And32,
+                          mkNarrowTo32(ty, getIReg(rt)),
+                          binop(Iop_Shr32,
+                                mkU32(0x00FFFFFF),
+                                      narrowTo(Ity_I8, binop(Iop_Mul32,
+                                                             mkU32(0x08),
+                                                             mkexpr(t4))))));
 
          putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
                                              mkexpr(t3)), True));
@@ -12887,7 +12893,7 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 #endif
 
          /* t2 = word addr */
-         /* t4 = addr mod 8 */
+         /* t4 = addr mod 4 */
          LWX_SWX_PATTERN;
 
          /* t3 = word content - shifted */
@@ -12898,9 +12904,13 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          /* rt content  - adjusted */
          t5 = newTemp(Ity_I32);
-         assign(t5, binop(Iop_And32, getIReg(rt), binop(Iop_Shr32,
-                    mkU32(0xFFFFFFFF), narrowTo(Ity_I8, binop(Iop_Shl32,
-                    binop(Iop_Add32, mkexpr(t4), mkU32(0x1)), mkU8(0x3))))));
+         assign(t5, binop(Iop_And32,
+                          getIReg(rt),
+                          binop(Iop_Shr32,
+                                mkU32(0x00FFFFFF),
+                                      narrowTo(Ity_I8, binop(Iop_Mul32,
+                                                             mkU32(0x08),
+                                                             mkexpr(t4))))));
 
          putIReg(rt, binop(Iop_Or32, mkexpr(t5), mkexpr(t3)));
       }
@@ -12944,7 +12954,7 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          /* rt content  - adjusted */
          t5 = newTemp(Ity_I32);
-         assign(t5, binop(Iop_And32, unop(Iop_64HIto32, getIReg(rt)),
+         assign(t5, binop(Iop_And32, mkNarrowTo32(ty, getIReg(rt)),
                 unop(Iop_Not32, binop(Iop_Shr32, mkU32(0xFFFFFFFF),
                 narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(0x3)))))));