|
From: <sv...@va...> - 2005-10-04 11:43:47
|
Author: sewardj
Date: 2005-10-04 12:43:37 +0100 (Tue, 04 Oct 2005)
New Revision: 1410
Log:
Implement SSE2 psadbw.
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/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
--- trunk/priv/guest-x86/toIR.c 2005-10-03 11:39:02 UTC (rev 1409)
+++ trunk/priv/guest-x86/toIR.c 2005-10-04 11:43:37 UTC (rev 1410)
@@ -7960,8 +7960,7 @@
=20
/* ***--- this is an MMX class insn introduced in SSE1 ---*** */
/* 0F F6 =3D PSADBW -- sum of 8Ux8 absolute differences */
- if (insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xF6) {
- vassert(sz =3D=3D 4);
+ if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xF6) {
do_MMX_preamble();
delta =3D dis_MMXop_regmem_to_reg (=20
sorb, delta+2, insn[1], "psadbw", False );
@@ -9746,6 +9745,53 @@
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 (sz =3D=3D 2 && 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(eregOfRM(modrm)) );
+ delta +=3D 2+1;
+ DIP("psadbw %s,%s\n", nameXMMReg(eregOfRM(modrm)),
+ nameXMMReg(gregOfRM(modrm)));
+ } else {
+ addr =3D disAMode ( &alen, sorb, delta+2, dis_buf );
+ assign( s1V, loadLE(Ity_V128, mkexpr(addr)) );
+ delta +=3D 2+alen;
+ DIP("psadbw %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_psadbw",=20
+ &x86g_calculate_mmx_psadbw,
+ mkIRExprVec_2( mkexpr(s1Hi), mkexpr(s2Hi))
+ ));
+ assign( dLo, mkIRExprCCall(
+ Ity_I64, 0/*regparms*/,
+ "x86g_calculate_mmx_psadbw",=20
+ &x86g_calculate_mmx_psadbw,
+ 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 70 =3D PSHUFD -- rearrange 4x32 from E(xmm or mem) to G(xmm)=
*/
if (sz =3D=3D 2 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x70) {
Int order;
|