|
From: <sv...@va...> - 2006-08-28 13:15:25
|
Author: sewardj
Date: 2006-08-28 14:15:19 +0100 (Mon, 28 Aug 2006)
New Revision: 1643
Log:
Merge r1632 (fix for: amd64->IR: 0x66 0xF 0xF6 0xC4 (psadbw,SSE2))
Modified:
branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
Modified: branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2006-08-25 12:52:19 U=
TC (rev 1642)
+++ branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2006-08-28 13:15:19 U=
TC (rev 1643)
@@ -11111,6 +11111,54 @@
goto decode_success;
}
=20
+ /* 66 0F F6 =3D PSADBW -- 2 x (8x8 -> 48 zeroes ++ u16) Sum Abs Diffs
+ from E(xmm or mem) to G(xmm) */
+ if (have66noF2noF3(pfx) && sz =3D=3D 2=20
+ && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xF6) {
+ IRTemp s1V =3D newTemp(Ity_V128);
+ IRTemp s2V =3D newTemp(Ity_V128);
+ IRTemp dV =3D newTemp(Ity_V128);
+ IRTemp s1Hi =3D newTemp(Ity_I64);
+ IRTemp s1Lo =3D newTemp(Ity_I64);
+ IRTemp s2Hi =3D newTemp(Ity_I64);
+ IRTemp s2Lo =3D newTemp(Ity_I64);
+ IRTemp dHi =3D newTemp(Ity_I64);
+ IRTemp dLo =3D newTemp(Ity_I64);
+ modrm =3D insn[2];
+ if (epartIsReg(modrm)) {
+ assign( s1V, getXMMReg(eregOfRexRM(pfx,modrm)) );
+ delta +=3D 2+1;
+ DIP("psadbw %s,%s\n", nameXMMReg(eregOfRexRM(pfx,modrm)),
+ nameXMMReg(gregOfRexRM(pfx,modrm)));
+ } else {
+ addr =3D disAMode ( &alen, pfx, delta+2, dis_buf, 0 );
+ assign( s1V, loadLE(Ity_V128, mkexpr(addr)) );
+ delta +=3D 2+alen;
+ DIP("psadbw %s,%s\n", dis_buf,
+ nameXMMReg(gregOfRexRM(pfx,modrm)));
+ }
+ assign( s2V, getXMMReg(gregOfRexRM(pfx,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*/,
+ "amd64g_calculate_mmx_psadbw",=20
+ &amd64g_calculate_mmx_psadbw,
+ mkIRExprVec_2( mkexpr(s1Hi), mkexpr(s2Hi))
+ ));
+ assign( dLo, mkIRExprCCall(
+ Ity_I64, 0/*regparms*/,
+ "amd64g_calculate_mmx_psadbw",=20
+ &amd64g_calculate_mmx_psadbw,
+ mkIRExprVec_2( mkexpr(s1Lo), mkexpr(s2Lo))
+ ));
+ assign( dV, binop(Iop_64HLtoV128, mkexpr(dHi), mkexpr(dLo))) ;
+ putXMMReg(gregOfRexRM(pfx,modrm), mkexpr(dV));
+ goto decode_success;
+ }
+
/* 66 0F 70 =3D PSHUFD -- rearrange 4x32 from E(xmm or mem) to G(xmm)=
*/
if (have66noF2noF3(pfx) && sz =3D=3D 2=20
&& insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x70) {
|