|
From: <sv...@va...> - 2010-09-30 13:37:43
|
Author: sewardj
Date: 2010-09-30 14:37:31 +0100 (Thu, 30 Sep 2010)
New Revision: 2056
Log:
Handle the undocumented but apparently-actually-used instruction
MOVSWW [tentative fix]. Fixes #250799.
Modified:
trunk/priv/guest_x86_toIR.c
Modified: trunk/priv/guest_x86_toIR.c
===================================================================
--- trunk/priv/guest_x86_toIR.c 2010-09-30 10:51:56 UTC (rev 2055)
+++ trunk/priv/guest_x86_toIR.c 2010-09-30 13:37:31 UTC (rev 2056)
@@ -2166,9 +2166,16 @@
{
UChar rm = getIByte(delta);
if (epartIsReg(rm)) {
- putIReg(szd, gregOfRM(rm),
- unop(mkWidenOp(szs,szd,sign_extend),
- getIReg(szs,eregOfRM(rm))));
+ if (szd == szs) {
+ // mutant case. See #250799
+ putIReg(szd, gregOfRM(rm),
+ getIReg(szs,eregOfRM(rm)));
+ } else {
+ // normal case
+ putIReg(szd, gregOfRM(rm),
+ unop(mkWidenOp(szs,szd,sign_extend),
+ getIReg(szs,eregOfRM(rm))));
+ }
DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
nameISize(szs), nameISize(szd),
nameIReg(szs,eregOfRM(rm)),
@@ -2181,10 +2188,16 @@
Int len;
HChar dis_buf[50];
IRTemp addr = disAMode ( &len, sorb, delta, dis_buf );
-
- putIReg(szd, gregOfRM(rm),
- unop(mkWidenOp(szs,szd,sign_extend),
- loadLE(szToITy(szs),mkexpr(addr))));
+ if (szd == szs) {
+ // mutant case. See #250799
+ putIReg(szd, gregOfRM(rm),
+ loadLE(szToITy(szs),mkexpr(addr)));
+ } else {
+ // normal case
+ putIReg(szd, gregOfRM(rm),
+ unop(mkWidenOp(szs,szd,sign_extend),
+ loadLE(szToITy(szs),mkexpr(addr))));
+ }
DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
nameISize(szs), nameISize(szd),
dis_buf, nameIReg(szd,gregOfRM(rm)));
@@ -14608,9 +14621,9 @@
break;
case 0xBF: /* MOVSXw Ew,Gv */
- if (sz != 4)
+ if (sz != 4 && /* accept movsww, sigh, see #250799 */sz != 2)
goto decode_failure;
- delta = dis_movx_E_G ( sorb, delta, 2, 4, True );
+ delta = dis_movx_E_G ( sorb, delta, 2, sz, True );
break;
//-- /* =-=-=-=-=-=-=-=-=-=-= MOVNTI -=-=-=-=-=-=-=-=-= */
|