case 3: break; // SBB
case 4: op8 = Iop_And8; break; case 5: op8 = Iop_Sub8; break;
case 6: op8 = Iop_Xor8; break; case 7: op8 = Iop_Sub8; break;
+ /*NOTREACHED*/
default: vpanic("dis_Grp1(amd64): unhandled case");
}
ULong dis_Grp2 ( Prefix pfx,
Long delta, UChar modrm,
Int am_sz, Int d_sz, Int sz, IRExpr* shift_expr,
- HChar* shift_expr_txt )
+ HChar* shift_expr_txt, Bool* decode_OK )
{
/* delta on entry points at the modrm byte. */
HChar dis_buf[50];
IRTemp dst1 = newTemp(ty);
IRTemp addr = IRTemp_INVALID;
+ *decode_OK = True;
+
vassert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
/* Put value to shift/rotate in dst0. */
isRotateC = False;
switch (gregLO3ofRM(modrm)) { case 2: case 3: isRotateC = True; }
+ if (gregLO3ofRM(modrm) == 6) {
+ *decode_OK = False;
+ return delta;
+ }
+
if (!isShift && !isRotate && !isRotateC) {
- vex_printf("\ncase %d\n", gregLO3ofRM(modrm));
+ /*NOTREACHED*/
vpanic("dis_Grp2(Reg): unhandled case(amd64)");
}
case 4: op64 = Iop_Shl64; break;
case 5: op64 = Iop_Shr64; break;
case 7: op64 = Iop_Sar64; break;
+ /*NOTREACHED*/
default: vpanic("dis_Grp2:shift"); break;
}
/* Group 3 extended opcodes. */
static
-ULong dis_Grp3 ( Prefix pfx, Int sz, Long delta )
+ULong dis_Grp3 ( Prefix pfx, Int sz, Long delta, Bool* decode_OK )
{
Long d64;
UChar modrm;
IRType ty = szToITy(sz);
IRTemp t1 = newTemp(ty);
IRTemp dst1, src, dst0;
+ *decode_OK = True;
modrm = getUChar(delta);
if (epartIsReg(modrm)) {
switch (gregLO3ofRM(modrm)) {
nameIRegE(sz, pfx, modrm));
break;
}
+ case 1:
+ *decode_OK = False;
+ return delta;
case 2: /* NOT */
delta++;
putIRegE(sz, pfx, modrm,
nameIRegE(sz, pfx, modrm));
break;
default:
- vex_printf(
- "unhandled Grp3(R) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp3(amd64)");
+ /*NOTREACHED*/
+ vpanic("Grp3(amd64,R)");
}
} else {
addr = disAMode ( &len, pfx, delta, dis_buf,
DIP("test%c $%lld, %s\n", nameISize(sz), d64, dis_buf);
break;
}
- /* probably OK, but awaiting test case */
+ case 1:
+ *decode_OK = False;
+ return delta;
case 2: /* NOT */
storeLE( mkexpr(addr), unop(mkSizedOp(ty,Iop_Not8), mkexpr(t1)));
DIP("not%c %s\n", nameISize(sz), dis_buf);
DIP("idiv%c %s\n", nameISize(sz), dis_buf);
break;
default:
- vex_printf(
- "unhandled Grp3(M) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp3(amd64)");
+ /*NOTREACHED*/
+ vpanic("Grp3(amd64,M)");
}
}
return delta;
/* Group 4 extended opcodes. */
static
-ULong dis_Grp4 ( Prefix pfx, Long delta )
+ULong dis_Grp4 ( Prefix pfx, Long delta, Bool* decode_OK )
{
Int alen;
UChar modrm;
IRTemp t1 = newTemp(ty);
IRTemp t2 = newTemp(ty);
+ *decode_OK = True;
+
modrm = getUChar(delta);
if (epartIsReg(modrm)) {
assign(t1, getIRegE(1, pfx, modrm));
setFlags_INC_DEC( False, t2, ty );
break;
default:
- vex_printf(
- "unhandled Grp4(R) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp4(amd64,R)");
+ *decode_OK = False;
+ return delta;
}
delta++;
DIP("%sb %s\n", nameGrp4(gregLO3ofRM(modrm)),
setFlags_INC_DEC( False, t2, ty );
break;
default:
- vex_printf(
- "unhandled Grp4(M) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp4(amd64,M)");
+ *decode_OK = False;
+ return delta;
}
delta += alen;
DIP("%sb %s\n", nameGrp4(gregLO3ofRM(modrm)), dis_buf);
/* Group 5 extended opcodes. */
static
ULong dis_Grp5 ( VexAbiInfo* vbi,
- Prefix pfx, Int sz, Long delta, DisResult* dres )
+ Prefix pfx, Int sz, Long delta,
+ DisResult* dres, Bool* decode_OK )
{
Int len;
UChar modrm;
IRTemp t3 = IRTemp_INVALID;
Bool showSz = True;
+ *decode_OK = True;
+
modrm = getUChar(delta);
if (epartIsReg(modrm)) {
assign(t1, getIRegE(sz,pfx,modrm));
showSz = False;
break;
default:
- vex_printf(
- "unhandled Grp5(R) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp5(amd64)");
+ *decode_OK = False;
+ return delta;
}
delta++;
DIP("%s%c %s\n", nameGrp5(gregLO3ofRM(modrm)),
}
default:
unhandled:
- vex_printf(
- "unhandled Grp5(M) case %d\n", (Int)gregLO3ofRM(modrm));
- vpanic("Grp5(amd64)");
+ *decode_OK = False;
+ return delta;
}
delta += len;
DIP("%s%c %s\n", nameGrp5(gregLO3ofRM(modrm)),
/* ------------------------ (Grp2 extensions) ---------- */
- case 0xC0: /* Grp2 Ib,Eb */
+ case 0xC0: { /* Grp2 Ib,Eb */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d64 = getUChar(delta + am_sz);
sz = 1;
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- mkU8(d64 & 0xFF), NULL );
+ mkU8(d64 & 0xFF), NULL, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
-
- case 0xC1: /* Grp2 Ib,Ev */
+ }
+ case 0xC1: { /* Grp2 Ib,Ev */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d_sz = 1;
d64 = getUChar(delta + am_sz);
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- mkU8(d64 & 0xFF), NULL );
+ mkU8(d64 & 0xFF), NULL, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
-
- case 0xD0: /* Grp2 1,Eb */
+ }
+ case 0xD0: { /* Grp2 1,Eb */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d64 = 1;
sz = 1;
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- mkU8(d64), NULL );
+ mkU8(d64), NULL, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
-
- case 0xD1: /* Grp2 1,Ev */
+ }
+ case 0xD1: { /* Grp2 1,Ev */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d_sz = 0;
d64 = 1;
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- mkU8(d64), NULL );
+ mkU8(d64), NULL, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
-
- case 0xD2: /* Grp2 CL,Eb */
+ }
+ case 0xD2: { /* Grp2 CL,Eb */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d_sz = 0;
sz = 1;
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- getIRegCL(), "%cl" );
+ getIRegCL(), "%cl", &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
-
- case 0xD3: /* Grp2 CL,Ev */
+ }
+ case 0xD3: { /* Grp2 CL,Ev */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
modrm = getUChar(delta);
am_sz = lengthAMode(pfx,delta);
d_sz = 0;
delta = dis_Grp2 ( pfx, delta, modrm, am_sz, d_sz, sz,
- getIRegCL(), "%cl" );
+ getIRegCL(), "%cl", &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
+ }
/* ------------------------ (Grp3 extensions) ---------- */
- case 0xF6: /* Grp3 Eb */
+ case 0xF6: { /* Grp3 Eb */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
- delta = dis_Grp3 ( pfx, 1, delta );
+ delta = dis_Grp3 ( pfx, 1, delta, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
- case 0xF7: /* Grp3 Ev */
+ }
+ case 0xF7: { /* Grp3 Ev */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
- delta = dis_Grp3 ( pfx, sz, delta );
+ delta = dis_Grp3 ( pfx, sz, delta, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
+ }
/* ------------------------ (Grp4 extensions) ---------- */
- case 0xFE: /* Grp4 Eb */
+ case 0xFE: { /* Grp4 Eb */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
- delta = dis_Grp4 ( pfx, delta );
+ delta = dis_Grp4 ( pfx, delta, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
+ }
/* ------------------------ (Grp5 extensions) ---------- */
- case 0xFF: /* Grp5 Ev */
+ case 0xFF: { /* Grp5 Ev */
+ Bool decode_OK = True;
if (haveF2orF3(pfx)) goto decode_failure;
- delta = dis_Grp5 ( vmi, pfx, sz, delta, &dres );
+ delta = dis_Grp5 ( vmi, pfx, sz, delta, &dres, &decode_OK );
+ if (!decode_OK) goto decode_failure;
break;
+ }
/* ------------------------ Escapes to 2-byte opcodes -- */