break;
case 2: /* call Ev */
/* Ignore any sz value and operate as if sz==8. */
- if (!(sz == 4 || sz == 8)) goto unhandled;
+ if (!(sz == 4 || sz == 8)) goto unhandledR;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, getIRegE(sz,pfx,modrm));
break;
case 4: /* jmp Ev */
/* Ignore any sz value and operate as if sz==8. */
- if (!(sz == 4 || sz == 8)) goto unhandled;
+ if (!(sz == 4 || sz == 8)) goto unhandledR;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, getIRegE(sz,pfx,modrm));
vassert(dres->whatNext == Dis_StopHere);
showSz = False;
break;
- default:
+ case 6: /* PUSH Ev */
+ /* There is no encoding for 32-bit operand size; hence ... */
+ if (sz == 4) sz = 8;
+ if (sz == 8 || sz == 2) {
+ ty = szToITy(sz); /* redo it, since sz might have changed */
+ t3 = newTemp(ty);
+ assign(t3, getIRegE(sz,pfx,modrm));
+ t2 = newTemp(Ity_I64);
+ assign( t2, binop(Iop_Sub64,getIReg64(R_RSP),mkU64(sz)) );
+ putIReg64(R_RSP, mkexpr(t2) );
+ storeLE( mkexpr(t2), mkexpr(t3) );
+ break;
+ } else {
+ goto unhandledR; /* awaiting test case */
+ }
+ default:
+ unhandledR:
*decode_OK = False;
return delta;
}
break;
case 2: /* call Ev */
/* Ignore any sz value and operate as if sz==8. */
- if (!(sz == 4 || sz == 8)) goto unhandled;
+ if (!(sz == 4 || sz == 8)) goto unhandledM;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, loadLE(Ity_I64,mkexpr(addr)));
break;
case 4: /* JMP Ev */
/* Ignore any sz value and operate as if sz==8. */
- if (!(sz == 4 || sz == 8)) goto unhandled;
+ if (!(sz == 4 || sz == 8)) goto unhandledM;
sz = 8;
t3 = newTemp(Ity_I64);
assign(t3, loadLE(Ity_I64,mkexpr(addr)));
case 6: /* PUSH Ev */
/* There is no encoding for 32-bit operand size; hence ... */
if (sz == 4) sz = 8;
- if (!(sz == 8 || sz == 2)) goto unhandled;
- if (sz == 8) {
- t3 = newTemp(Ity_I64);
- assign(t3, loadLE(Ity_I64,mkexpr(addr)));
+ if (sz == 8 || sz == 2) {
+ ty = szToITy(sz); /* redo it, since sz might have changed */
+ t3 = newTemp(ty);
+ assign(t3, loadLE(ty,mkexpr(addr)));
t2 = newTemp(Ity_I64);
assign( t2, binop(Iop_Sub64,getIReg64(R_RSP),mkU64(sz)) );
putIReg64(R_RSP, mkexpr(t2) );
storeLE( mkexpr(t2), mkexpr(t3) );
break;
} else {
- goto unhandled; /* awaiting test case */
+ goto unhandledM; /* awaiting test case */
}
default:
- unhandled:
+ unhandledM:
*decode_OK = False;
return delta;
}