|
From: <sv...@va...> - 2006-12-26 02:25:49
|
Author: sewardj
Date: 2006-12-26 02:25:46 +0000 (Tue, 26 Dec 2006)
New Revision: 1698
Log:
Merge r1678 (jcxz (x86))
Modified:
branches/VEX_3_2_BRANCH/priv/guest-x86/toIR.c
Modified: branches/VEX_3_2_BRANCH/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
--- branches/VEX_3_2_BRANCH/priv/guest-x86/toIR.c 2006-12-26 02:24:12 UTC=
(rev 1697)
+++ branches/VEX_3_2_BRANCH/priv/guest-x86/toIR.c 2006-12-26 02:25:46 UTC=
(rev 1698)
@@ -10834,6 +10834,28 @@
=20
after_sse_decoders:
=20
+ /* ---------------------------------------------------- */
+ /* --- deal with misc 0x67 pfxs (addr size override) -- */
+ /* ---------------------------------------------------- */
+
+ /* 67 E3 =3D JCXZ (for JECXZ see below) */
+ if (insn[0] =3D=3D 0x67 && insn[1] =3D=3D 0xE3 && sz =3D=3D 4) {
+ delta +=3D 2;
+ d32 =3D (((Addr32)guest_EIP_bbstart)+delta+1) + getSDisp8(delta);
+ delta ++;
+ stmt( IRStmt_Exit(
+ binop(Iop_CmpEQ16, getIReg(2,R_ECX), mkU16(0)),
+ Ijk_Boring,
+ IRConst_U32(d32)
+ ));
+ DIP("jcxz 0x%x\n", d32);
+ goto decode_success;
+ }
+
+ /* ---------------------------------------------------- */
+ /* --- start of the baseline insn decoder -- */
+ /* ---------------------------------------------------- */
+
/* Get the primary opcode. */
opc =3D getIByte(delta); delta++;
=20
@@ -11164,21 +11186,16 @@
DIP("j%s-8 0x%x\n", name_X86Condcode(opc - 0x70), d32);
break;
=20
- case 0xE3: /* JECXZ or perhaps JCXZ, depending on OSO ? Intel
- manual says it depends on address size override. */
+ case 0xE3: /* JECXZ (for JCXZ see above) */
if (sz !=3D 4) goto decode_failure;
d32 =3D (((Addr32)guest_EIP_bbstart)+delta+1) + getSDisp8(delta);
- delta++;
- ty =3D szToITy(sz);
+ delta ++;
stmt( IRStmt_Exit(
- binop(mkSizedOp(ty,Iop_CmpEQ8),
- getIReg(sz,R_ECX),
- mkU(ty,0)),
+ binop(Iop_CmpEQ32, getIReg(4,R_ECX), mkU32(0)),
Ijk_Boring,
- IRConst_U32(d32))=20
- );
-
- DIP("j%sz 0x%x\n", nameIReg(sz, R_ECX), d32);
+ IRConst_U32(d32)
+ ));
+ DIP("jecxz 0x%x\n", d32);
break;
=20
case 0xE0: /* LOOPNE disp8: decrement count, jump if count !=3D 0 && =
ZF=3D=3D0 */
|