|
From: <sv...@va...> - 2007-04-29 10:07:21
|
Author: sewardj
Date: 2007-04-29 11:07:20 +0100 (Sun, 29 Apr 2007)
New Revision: 1754
Log:
Merge r1740 (Tolerate redundant REX.W prefix produced by Mono for
'fsqrt' (a lame kludge).)
Modified:
branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
Modified: branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c
===================================================================
--- branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2007-04-29 09:57:48 UTC (rev 1753)
+++ branches/VEX_3_2_BRANCH/priv/guest-amd64/toIR.c 2007-04-29 10:07:20 UTC (rev 1754)
@@ -12363,9 +12363,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 );
@@ -12377,6 +12389,7 @@
} else {
goto decode_failure;
}
+ }
/* ------------------------ INT ------------------------ */
|