From: Petar Jovanovic Date: Mon, 3 Apr 2017 14:30:13 +0000 (+0000) Subject: mips64: sign-extend results from dirty helper X-Git-Tag: svn/VALGRIND_3_13_0^2~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11e644d965f9645d82ff8dbcd54db239f44ae794;p=thirdparty%2Fvalgrind.git mips64: sign-extend results from dirty helper Values returned from the dirty helper may not be sign-extended, so let's make sure the values get passed as sign-extended for Ity_I32, Ity_I16, and Ity_I8 cases. At the same time, we can remove now redundant sign-extensions introduced in VEX r3304. This fixes memcheck/test/bug340392 on some MIPS64 boards. Patch by Aleksandar Rikalo. git-svn-id: svn://svn.valgrind.org/vex/trunk@3342 --- diff --git a/VEX/priv/host_mips_defs.c b/VEX/priv/host_mips_defs.c index ac5b9a74b3..ce202d121c 100644 --- a/VEX/priv/host_mips_defs.c +++ b/VEX/priv/host_mips_defs.c @@ -1584,15 +1584,8 @@ void getRegUsage_MIPSInstr(HRegUsage * u, const MIPSInstr * i, Bool mode64) addHRegUse(u, HRmWrite, i->Min.Shft.dst); return; case Min_Cmp: - if (i->Min.Cmp.sz32 && mode64 && - (i->Min.Cmp.cond != MIPScc_EQ) && - (i->Min.Cmp.cond != MIPScc_NE)) { - addHRegUse(u, HRmModify, i->Min.Cmp.srcL); - addHRegUse(u, HRmModify, i->Min.Cmp.srcR); - } else { - addHRegUse(u, HRmRead, i->Min.Cmp.srcL); - addHRegUse(u, HRmRead, i->Min.Cmp.srcR); - } + addHRegUse(u, HRmRead, i->Min.Cmp.srcL); + addHRegUse(u, HRmRead, i->Min.Cmp.srcR); addHRegUse(u, HRmWrite, i->Min.Cmp.dst); return; case Min_Unary: @@ -2761,68 +2754,35 @@ Int emit_MIPSInstr ( /*MB_MOD*/Bool* is_profInc, UInt r_srcL = iregNo(i->Min.Cmp.srcL, mode64); UInt r_srcR = iregNo(i->Min.Cmp.srcR, mode64); UInt r_dst = iregNo(i->Min.Cmp.dst, mode64); - Bool sz32 = i->Min.Cmp.sz32; switch (i->Min.Cmp.cond) { case MIPScc_EQ: /* xor r_dst, r_srcL, r_srcR sltiu r_dst, r_dst, 1 */ p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); - if (mode64 && sz32) { - /* sll r_dst, r_dst, 0 */ - p = mkFormS(p, 0, r_dst, 0, r_dst, 0, 0); - } p = mkFormI(p, 11, r_dst, r_dst, 1); break; case MIPScc_NE: /* xor r_dst, r_srcL, r_srcR sltu r_dst, zero, r_dst */ p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 38); - if (mode64 && sz32) { - /* sll r_dst, r_dst, 0 */ - p = mkFormS(p, 0, r_dst, 0, r_dst, 0, 0); - } p = mkFormR(p, 0, 0, r_dst, r_dst, 0, 43); break; case MIPScc_LT: - if (mode64 && sz32) { - /* sll r_srcL, r_srcL, 0 - sll r_srcR, r_srcR, 0 */ - p = mkFormS(p, 0, r_srcL, 0, r_srcL, 0, 0); - p = mkFormS(p, 0, r_srcR, 0, r_srcR, 0, 0); - } /* slt r_dst, r_srcL, r_srcR */ p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 42); break; case MIPScc_LO: - if (mode64 && sz32) { - /* sll r_srcL, r_srcL, 0 - sll r_srcR, r_srcR, 0 */ - p = mkFormS(p, 0, r_srcL, 0, r_srcL, 0, 0); - p = mkFormS(p, 0, r_srcR, 0, r_srcR, 0, 0); - } /* sltu r_dst, r_srcL, r_srcR */ p = mkFormR(p, 0, r_srcL, r_srcR, r_dst, 0, 43); break; case MIPScc_LE: - if (mode64 && sz32) { - /* sll r_srcL, r_srcL, 0 - sll r_srcR, r_srcR, 0 */ - p = mkFormS(p, 0, r_srcL, 0, r_srcL, 0, 0); - p = mkFormS(p, 0, r_srcR, 0, r_srcR, 0, 0); - } /* slt r_dst, r_srcR, r_srcL xori r_dst, r_dst, 1 */ p = mkFormR(p, 0, r_srcR, r_srcL, r_dst, 0, 42); p = mkFormI(p, 14, r_dst, r_dst, 1); break; case MIPScc_LS: - if (mode64 && sz32) { - /* sll r_srcL, r_srcL, 0 - sll r_srcR, r_srcR, 0 */ - p = mkFormS(p, 0, r_srcL, 0, r_srcL, 0, 0); - p = mkFormS(p, 0, r_srcR, 0, r_srcR, 0, 0); - } /* sltu r_dst, rsrcR, r_srcL xori r_dsr, r_dst, 1 */ p = mkFormR(p, 0, r_srcR, r_srcL, r_dst, 0, 43); diff --git a/VEX/priv/host_mips_isel.c b/VEX/priv/host_mips_isel.c index aa72318941..b09d2db26e 100644 --- a/VEX/priv/host_mips_isel.c +++ b/VEX/priv/host_mips_isel.c @@ -3843,7 +3843,9 @@ static void iselStmt(ISelEnv * env, IRStmt * stmt) /* The returned value is in $v0. Park it in the register associated with tmp. */ HReg r_dst = lookupIRTemp(env, d->tmp); - addInstr(env, mk_iMOVds_RR(r_dst, hregMIPS_GPR2(mode64))); + addInstr(env, MIPSInstr_Shft(Mshft_SLL, True, r_dst, + hregMIPS_GPR2(mode64), + MIPSRH_Imm(False, 0))); vassert(rloc.pri == RLPri_Int); vassert(addToSp == 0); return;