|
From: <sv...@va...> - 2006-04-13 22:06:40
|
Author: sewardj
Date: 2006-04-13 23:06:35 +0100 (Thu, 13 Apr 2006)
New Revision: 1604
Log:
Fix for instruction-decoding failures reported in #124499.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/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
--- trunk/priv/guest-amd64/toIR.c 2006-04-12 17:30:46 UTC (rev 1603)
+++ trunk/priv/guest-amd64/toIR.c 2006-04-13 22:06:35 UTC (rev 1604)
@@ -8838,8 +8838,12 @@
=20
/* 0F 50 =3D MOVMSKPS - move 4 sign bits from 4 x F32 in xmm(E)
to 4 lowest bits of ireg(G) */
- if (haveNo66noF2noF3(pfx) && sz =3D=3D 4=20
+ if (haveNo66noF2noF3(pfx) && (sz =3D=3D 4 || sz =3D=3D 8)
&& insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x50) {
+ /* sz =3D=3D 8 is a kludge to handle insns with REX.W redundantly
+ set to 1, which has been known to happen:
+ 4c 0f 50 d9 rex64X movmskps %xmm1,%r11d
+ */
modrm =3D getUChar(delta+2);
if (epartIsReg(modrm)) {
Int src;
@@ -10341,8 +10345,12 @@
=20
/* 66 0F 50 =3D MOVMSKPD - move 2 sign bits from 2 x F64 in xmm(E) to
2 lowest bits of ireg(G) */
- if (have66noF2noF3(pfx) && sz =3D=3D 2=20
+ if (have66noF2noF3(pfx) && (sz =3D=3D 2 || sz =3D=3D 8)
&& insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x50) {
+ /* sz =3D=3D 8 is a kludge to handle insns with REX.W redundantly
+ set to 1, which has been known to happen:
+ 66 4c 0f 50 d9 rex64X movmskpd %xmm1,%r11d
+ */
modrm =3D getUChar(delta+2);
if (epartIsReg(modrm)) {
Int src;
@@ -13759,11 +13767,12 @@
break;
}
=20
+ case 0x0E: /* FEMMS */
case 0x77: /* EMMS */
if (sz !=3D 4)
goto decode_failure;
do_EMMS_preamble();
- DIP("emms\n");
+ DIP("{f}emms\n");
break;
=20
/* =3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- unimp2 =3D-=3D-=3D-=3D-=3D=
-=3D-=3D-=3D-=3D-=3D-=3D */
|