DIP("j%s-8 0x%llx\n", name_AMD64Condcode(opc - 0x70), d64);
break;
- case 0xE3: /* JRCXZ or perhaps JECXZ, depending on OSO ? Intel
- manual says it depends on address size override,
- which doesn't sound right to me. But the amd manual
- alsay says that, so I guess it is. In which case 8
- is the only valid size. */
- if (have66orF2orF3(pfx) || haveASO(pfx)) goto decode_failure;
+ case 0xE3:
+ /* JRCXZ or JECXZ, depending address size override. */
+ if (have66orF2orF3(pfx)) goto decode_failure;
d64 = (guest_RIP_bbstart+delta+1) + getSDisp8(delta);
delta++;
- stmt( IRStmt_Exit( binop(Iop_CmpEQ64, getIReg64(R_RCX), mkU64(0)),
- Ijk_Boring,
- IRConst_U64(d64))
- );
- DIP("jrcxz 0x%llx\n", d64);
+ if (haveASO(pfx)) {
+ /* 32-bit */
+ stmt( IRStmt_Exit( binop(Iop_CmpEQ64,
+ unop(Iop_32Uto64, getIReg32(R_RCX)),
+ mkU64(0)),
+ Ijk_Boring,
+ IRConst_U64(d64))
+ );
+ DIP("jecxz 0x%llx\n", d64);
+ } else {
+ /* 64-bit */
+ stmt( IRStmt_Exit( binop(Iop_CmpEQ64,
+ getIReg64(R_RCX),
+ mkU64(0)),
+ Ijk_Boring,
+ IRConst_U64(d64))
+ );
+ DIP("jrcxz 0x%llx\n", d64);
+ }
break;
case 0xE0: /* LOOPNE disp8: decrement count, jump if count != 0 && ZF==0 */