Skip to content

Commit ff1e441

Browse files
committed
amd64: Support lods rep prefixes
1 parent 1ac1f89 commit ff1e441

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

priv/guest_amd64_toIR.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21023,11 +21023,27 @@ Long dis_ESC_NONE (
2102321023
delta = dis_op_imm_A( sz, False, Iop_And8, False, delta, "test" );
2102421024
return delta;
2102521025

21026-
case 0xAC: /* LODS, no REP prefix */
21026+
case 0xAC:
2102721027
case 0xAD:
21028-
dis_string_op( dis_LODS, ( opc == 0xAC ? 1 : sz ), "lods", pfx );
21029-
return delta;
21030-
21028+
/* F2 AC/AD: rep lodsb/rep lods{w,l,q} */
21029+
/* F3 AC/AD: repne lodsb/repne lods{w,l,q} */
21030+
if (haveF2(pfx) || haveF3(pfx)) {
21031+
if (opc == 0xAC)
21032+
sz = 1;
21033+
dis_REP_op ( dres, AMD64CondAlways, dis_LODS, sz,
21034+
guest_RIP_curr_instr,
21035+
guest_RIP_bbstart+delta, "rep lods", pfx );
21036+
vassert(dres->whatNext == Dis_StopHere);
21037+
return delta;
21038+
}
21039+
/* AC/AD: lodsb/lods{w,l,q} */
21040+
if (!haveF2(pfx) && !haveF3(pfx)) {
21041+
if (opc == 0xAC)
21042+
sz = 1;
21043+
dis_string_op( dis_LODS, sz, "lods", pfx );
21044+
return delta;
21045+
}
21046+
goto decode_failure;
2103121047
case 0xAE:
2103221048
case 0xAF:
2103321049
/* F2 AE/AF: repne scasb/repne scas{w,l,q} */

0 commit comments

Comments
 (0)