|
From: <sv...@va...> - 2007-03-11 19:34:17
|
Author: sewardj
Date: 2007-03-11 19:34:13 +0000 (Sun, 11 Mar 2007)
New Revision: 1740
Log:
Tolerate redundant REX.W prefix produced by Mono for 'fsqrt' (a lame
kludge).
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/priv/guest-amd64/toIR.c
===================================================================
--- trunk/priv/guest-amd64/toIR.c 2007-03-09 18:07:00 UTC (rev 1739)
+++ trunk/priv/guest-amd64/toIR.c 2007-03-11 19:34:13 UTC (rev 1740)
@@ -12375,9 +12375,21 @@
case 0xDC:
case 0xDD:
case 0xDE:
- case 0xDF:
- if (haveF2orF3(pfx)) goto decode_failure;
- if (sz == 4 && haveNo66noF2noF3(pfx)) {
+ case 0xDF: {
+ Bool redundantREXWok = False;
+
+ if (haveF2orF3(pfx))
+ goto decode_failure;
+
+ /* kludge to tolerate redundant rex.w prefixes (should do this
+ properly one day) */
+ /* mono 1.1.18.1 produces 48 D9 FA, which is rex.w fsqrt */
+ if ( (opc == 0xD9 && getUChar(delta+0) == 0xFA)/*fsqrt*/ )
+ redundantREXWok = True;
+
+ if ( (sz == 4
+ || (sz == 8 && redundantREXWok))
+ && haveNo66noF2noF3(pfx)) {
Long delta0 = delta;
Bool decode_OK = False;
delta = dis_FPU ( &decode_OK, pfx, delta );
@@ -12389,6 +12401,7 @@
} else {
goto decode_failure;
}
+ }
/* ------------------------ INT ------------------------ */
|