]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
mips64: do not use 64-bit loads for lwl/lwr instructions
authorPetar Jovanovic <mips32r2@gmail.com>
Wed, 24 Jun 2015 18:47:39 +0000 (18:47 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Wed, 24 Jun 2015 18:47:39 +0000 (18:47 +0000)
As reported in BZ #346562, lwl/lwr were implemented incorrectly using
64-bit loads. This has led to incorrect "invalid read of size 8"
warnings. This patch fixes it, and it does some formatting to make the
code more readable.

Original version of the patch proposed by Crestez Dan Leonard.

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

VEX/priv/guest_mips_toIR.c

index 84d2608ff5baf35f499d5b47a9bf8b19a596d582..887a1fc2397c7fa5e0d5212f8dd83cc1b04b33f3 100644 (file)
@@ -13788,40 +13788,27 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
          t1 = newTemp(Ity_I64);
 #if defined (_MIPSEL)
          assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
-         /* t2 = word addr */
-         /* t4 = addr mod 4 */
-         LWX_SWX_PATTERN64;
-
-         /* t3 = word content - shifted */
-         t3 = newTemp(Ity_I32);
-         assign(t3, binop(Iop_Shl32, mkNarrowTo32(ty, load(Ity_I64,
-                          mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
-                    binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
-
-         /* rt content - adjusted */
-         t5 = newTemp(Ity_I32);
-         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));
 #elif defined (_MIPSEB)
-         assign(t1, binop(Iop_Xor64, mkU64(0x3),
-                binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm)))));
+         assign(t1, binop(Iop_Xor64,
+                          mkU64(0x03),
+                          binop(Iop_Add64,
+                                getIReg(rs),
+                                mkU64(extend_s_16to64(imm)))));
+#endif
          /* t2 = word addr */
          /* t4 = addr mod 4 */
          LWX_SWX_PATTERN64;
 
          /* t3 = word content - shifted */
          t3 = newTemp(Ity_I32);
-         assign(t3, binop(Iop_Shl32, unop(Iop_64HIto32, load(Ity_I64,
-                          mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
-                    binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
+         assign(t3, binop(Iop_Shl32,
+                          load(Ity_I32, mkexpr(t2)),
+                          narrowTo(Ity_I8,
+                                   binop(Iop_Shl32,
+                                         binop(Iop_Sub32,
+                                               mkU32(0x03),
+                                               mkexpr(t4)),
+                                         mkU8(3)))));
 
          /* rt content - adjusted */
          t5 = newTemp(Ity_I32);
@@ -13835,7 +13822,6 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
                                              mkexpr(t3)), True));
-#endif
       } else {
          /* t1 = addr */
          t1 = newTemp(Ity_I32);
@@ -13877,34 +13863,23 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
          t1 = newTemp(Ity_I64);
 #if defined (_MIPSEL)
          assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
-         /* t2 = word addr */
-         /* t4 = addr mod 8 */
-         LWX_SWX_PATTERN64;
-
-         /* t3 = word content - shifted */
-         t3 = newTemp(Ity_I32);
-         assign(t3, binop(Iop_Shr32, mkNarrowTo32(ty, load(Ity_I64,mkexpr(t2))),
-                    narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
-
-         /* rt content  - adjusted */
-         t5 = newTemp(Ity_I32);
-         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)))))));
-
-         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
-                                       mkexpr(t3)), True));
 #elif defined (_MIPSEB)
-         assign(t1, binop(Iop_Xor64, mkU64(0x3), binop(Iop_Add64, getIReg(rs),
-                          mkU64(extend_s_16to64(imm)))));
+         assign(t1, binop(Iop_Xor64,
+                          mkU64(0x3),
+                          binop(Iop_Add64,
+                                getIReg(rs),
+                                mkU64(extend_s_16to64(imm)))));
+#endif
          /* t2 = word addr */
          /* t4 = addr mod 4 */
          LWX_SWX_PATTERN64;
 
          /* t3 = word content - shifted */
          t3 = newTemp(Ity_I32);
-         assign(t3, binop(Iop_Shr32, unop(Iop_64HIto32, load(Ity_I64,mkexpr(t2))),
-                    narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
+         assign(t3, binop(Iop_Shr32,
+                          load(Ity_I32, mkexpr(t2)),
+                          narrowTo(Ity_I8,
+                                   binop(Iop_Shl32, mkexpr(t4), mkU8(0x03)))));
 
          /* rt content  - adjusted */
          t5 = newTemp(Ity_I32);
@@ -13914,7 +13889,6 @@ static DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
 
          putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
                                        mkexpr(t3)), True));
-#endif
 
       } else {
          /* t1 = addr */