From: Petar Jovanovic Date: Wed, 24 Jun 2015 18:47:39 +0000 (+0000) Subject: mips64: do not use 64-bit loads for lwl/lwr instructions X-Git-Tag: svn/VALGRIND_3_11_0^2~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec43f68328f1c1e693410bd8999ca922c21c97cc;p=thirdparty%2Fvalgrind.git mips64: do not use 64-bit loads for lwl/lwr instructions 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 --- diff --git a/VEX/priv/guest_mips_toIR.c b/VEX/priv/guest_mips_toIR.c index 84d2608ff5..887a1fc239 100644 --- a/VEX/priv/guest_mips_toIR.c +++ b/VEX/priv/guest_mips_toIR.c @@ -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 */