|
From: <sv...@va...> - 2006-05-12 17:47:26
|
Author: sewardj
Date: 2006-05-12 18:47:21 +0100 (Fri, 12 May 2006)
New Revision: 1612
Log:
(1) Fix longstanding bug causing erroneous register zeroing for 'btl'.
(2) Implement 16-bit versions of bt/bts/btr/btc. (Fixes #125607)
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-05-12 14:04:48 UTC (rev 1611)
+++ trunk/priv/guest-amd64/toIR.c 2006-05-12 17:47:21 UTC (rev 1612)
@@ -6905,7 +6905,11 @@
/* Move reg operand from stack back to reg */
if (epartIsReg(modrm)) {
/* t_esp still points at it. */
- putIRegE(sz, pfx, modrm, loadLE(szToITy(sz), mkexpr(t_rsp)) );
+ /* only write the reg if actually modifying it; doing otherwise
+ zeroes the top half erroneously when doing btl due to
+ standard zero-extend rule */
+ if (op !=3D BtOpNone)
+ putIRegE(sz, pfx, modrm, loadLE(szToITy(sz), mkexpr(t_rsp)) );
putIReg64(R_RSP, binop(Iop_Add64, mkexpr(t_rsp), mkU64(sz)) );
}
=20
@@ -13354,22 +13358,22 @@
=20
case 0xA3: /* BT Gv,Ev */
if (haveF2orF3(pfx)) goto decode_failure;
- if (sz !=3D 8 && sz !=3D 4) goto decode_failure;
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
delta =3D dis_bt_G_E ( pfx, sz, delta, BtOpNone );
break;
case 0xB3: /* BTR Gv,Ev */
if (haveF2orF3(pfx)) goto decode_failure;
- if (sz !=3D 8 && sz !=3D 4) goto decode_failure;
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
delta =3D dis_bt_G_E ( pfx, sz, delta, BtOpReset );
break;
case 0xAB: /* BTS Gv,Ev */
if (haveF2orF3(pfx)) goto decode_failure;
- if (sz !=3D 8 && sz !=3D 4) goto decode_failure;
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
delta =3D dis_bt_G_E ( pfx, sz, delta, BtOpSet );
break;
case 0xBB: /* BTC Gv,Ev */
if (haveF2orF3(pfx)) goto decode_failure;
- if (sz !=3D 8 && sz !=3D 4) goto decode_failure;
+ if (sz !=3D 8 && sz !=3D 4 && sz !=3D 2) goto decode_failure;
delta =3D dis_bt_G_E ( pfx, sz, delta, BtOpComp );
break;
=20
|