From: Julian Seward Date: Tue, 4 Oct 2005 20:00:49 +0000 (+0000) Subject: Handle SSE2 pmaddwd. X-Git-Tag: svn/VALGRIND_3_1_1^2~80 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=11c004dcd12342540a138196d42ba6e674b12e58;p=thirdparty%2Fvalgrind.git Handle SSE2 pmaddwd. git-svn-id: svn://svn.valgrind.org/vex/trunk@1411 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index 0e4b6b324a..5ff900e135 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -9591,6 +9591,53 @@ DisResult disInstr_X86_WRK ( goto decode_success; } + /* 66 0F F5 = PMADDWD -- Multiply and add packed integers from + E(xmm or mem) to G(xmm) */ + if (sz == 2 && insn[0] == 0x0F && insn[1] == 0xF5) { + IRTemp s1V = newTemp(Ity_V128); + IRTemp s2V = newTemp(Ity_V128); + IRTemp dV = newTemp(Ity_V128); + IRTemp s1Hi = newTemp(Ity_I64); + IRTemp s1Lo = newTemp(Ity_I64); + IRTemp s2Hi = newTemp(Ity_I64); + IRTemp s2Lo = newTemp(Ity_I64); + IRTemp dHi = newTemp(Ity_I64); + IRTemp dLo = newTemp(Ity_I64); + modrm = insn[2]; + if (epartIsReg(modrm)) { + assign( s1V, getXMMReg(eregOfRM(modrm)) ); + delta += 2+1; + DIP("pmaddwd %s,%s\n", nameXMMReg(eregOfRM(modrm)), + nameXMMReg(gregOfRM(modrm))); + } else { + addr = disAMode ( &alen, sorb, delta+2, dis_buf ); + assign( s1V, loadLE(Ity_V128, mkexpr(addr)) ); + delta += 2+alen; + DIP("pmaddwd %s,%s\n", dis_buf, + nameXMMReg(gregOfRM(modrm))); + } + assign( s2V, getXMMReg(gregOfRM(modrm)) ); + assign( s1Hi, unop(Iop_V128HIto64, mkexpr(s1V)) ); + assign( s1Lo, unop(Iop_V128to64, mkexpr(s1V)) ); + assign( s2Hi, unop(Iop_V128HIto64, mkexpr(s2V)) ); + assign( s2Lo, unop(Iop_V128to64, mkexpr(s2V)) ); + assign( dHi, mkIRExprCCall( + Ity_I64, 0/*regparms*/, + "x86g_calculate_mmx_pmaddwd", + &x86g_calculate_mmx_pmaddwd, + mkIRExprVec_2( mkexpr(s1Hi), mkexpr(s2Hi)) + )); + assign( dLo, mkIRExprCCall( + Ity_I64, 0/*regparms*/, + "x86g_calculate_mmx_pmaddwd", + &x86g_calculate_mmx_pmaddwd, + mkIRExprVec_2( mkexpr(s1Lo), mkexpr(s2Lo)) + )); + assign( dV, binop(Iop_64HLtoV128, mkexpr(dHi), mkexpr(dLo))) ; + putXMMReg(gregOfRM(modrm), mkexpr(dV)); + goto decode_success; + } + /* 66 0F EE = PMAXSW -- 16x8 signed max */ if (sz == 2 && insn[0] == 0x0F && insn[1] == 0xEE) { delta = dis_SSEint_E_to_G( sorb, delta+2,