|
From: <sv...@va...> - 2006-11-12 22:25:28
|
Author: sewardj
Date: 2006-11-12 22:25:21 +0000 (Sun, 12 Nov 2006)
New Revision: 1672
Log:
Implement 'xlat' (fixes #125959 and #135012).
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/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-x86/toIR.c 2006-10-19 03:01:09 UTC (rev 1671)
+++ trunk/priv/guest-x86/toIR.c 2006-11-12 22:25:21 UTC (rev 1672)
@@ -12041,23 +12041,23 @@
codegen_xchg_eAX_Reg ( sz, opc - 0x90 );
break;
=20
-//-- /* ------------------------ XLAT ----------------------- */
-//--=20
-//-- case 0xD7: /* XLAT */
-//-- t1 =3D newTemp(cb); t2 =3D newTemp(cb);
-//-- uInstr2(cb, GET, sz, ArchReg, R_EBX, TempReg, t1); /* get eBX=
*/
-//-- handleSegOverride( cb, sorb, t1 ); /* make t1 D=
S:eBX */
-//-- uInstr2(cb, GET, 1, ArchReg, R_AL, TempReg, t2); /* get AL */
-//-- /* Widen %AL to 32 bits, so it's all defined when we add it. =
*/
-//-- uInstr1(cb, WIDEN, 4, TempReg, t2);
-//-- uWiden(cb, 1, False);
-//-- uInstr2(cb, ADD, sz, TempReg, t2, TempReg, t1); /* add AL to=
eBX */
-//-- uInstr2(cb, LOAD, 1, TempReg, t1, TempReg, t2); /* get byte =
at t1 into t2 */
-//-- uInstr2(cb, PUT, 1, TempReg, t2, ArchReg, R_AL); /* put byte =
into AL */
-//--=20
-//-- DIP("xlat%c [ebx]\n", nameISize(sz));
-//-- break;
+ /* ------------------------ XLAT ----------------------- */
=20
+ case 0xD7: /* XLAT */
+ if (sz !=3D 4) goto decode_failure; /* sz =3D=3D 2 is also allowed=
(0x66) */
+ putIReg(=20
+ 1,=20
+ R_EAX/*AL*/,
+ loadLE(Ity_I8,=20
+ handleSegOverride(=20
+ sorb,=20
+ binop(Iop_Add32,=20
+ getIReg(4, R_EBX),=20
+ unop(Iop_8Uto32, getIReg(1, R_EAX/*AL*/))))));
+
+ DIP("xlat%c [ebx]\n", nameISize(sz));
+ break;
+
/* ------------------------ IN / OUT ----------------------- */
=20
case 0xE4: /* IN imm8, AL */
|