diff --git a/decode.c b/decode.c index 8e81238..66f17db 100644 --- a/decode.c +++ b/decode.c @@ -396,15 +396,6 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address, if (LIKELY(off < len)) ENTRY_UNPACK(table, kind, table[buffer[off++]]); - // Then, walk through ModR/M-encoded opcode extensions. - if ((kind == ENTRY_TABLE8 || kind == ENTRY_TABLE72) && LIKELY(off < len)) - { - if (kind == ENTRY_TABLE72 && (buffer[off] & 0xc0) == 0xc0) - ENTRY_UNPACK(table, kind, table[buffer[off++] - 0xb8]); - else - ENTRY_UNPACK(table, kind, table[(buffer[off] >> 3) & 7]); - } - // Handle mandatory prefixes (which behave like an opcode ext.). if (kind == ENTRY_TABLE_PREFIX) { @@ -417,6 +408,15 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address, ENTRY_UNPACK(table, kind, table[mandatory_prefix]); } + // Then, walk through ModR/M-encoded opcode extensions. + if ((kind == ENTRY_TABLE8 || kind == ENTRY_TABLE72) && LIKELY(off < len)) + { + if (kind == ENTRY_TABLE72 && (buffer[off] & 0xc0) == 0xc0) + ENTRY_UNPACK(table, kind, table[buffer[off++] - 0xb8]); + else + ENTRY_UNPACK(table, kind, table[(buffer[off] >> 3) & 7]); + } + // For VEX prefix, we have to distinguish between VEX.W and VEX.L which may // be part of the opcode. if (kind == ENTRY_TABLE_VEX) diff --git a/parseinstrs.py b/parseinstrs.py index 12324c8..7ac0847 100644 --- a/parseinstrs.py +++ b/parseinstrs.py @@ -288,6 +288,12 @@ class Opcode(NamedTuple): opcode = [] opcode.append((EntryKind.TABLE_ROOT, [self.escape | self.vex << 2])) opcode.append((EntryKind.TABLE256, [self.opc])) + if self.prefix: + if self.prefix == "NFx": + opcode.append((EntryKind.TABLE_PREFIX, [0, 1])) + else: + prefix_val = ["NP", "66", "F3", "F2"].index(self.prefix) + opcode.append((EntryKind.TABLE_PREFIX, [prefix_val])) if self.opcext: opcext_kind = [EntryKind.TABLE8, EntryKind.TABLE72][self.opcext[0]] opcext_val = self.opcext[1] - (0 if self.opcext[1] < 8 else 0xb8) @@ -295,12 +301,6 @@ class Opcode(NamedTuple): if self.extended: last_type, last_indices = opcode[-1] opcode[-1] = last_type, [last_indices[0] + i for i in range(8)] - if self.prefix: - if self.prefix == "NFx": - opcode.append((EntryKind.TABLE_PREFIX, [0, 1])) - else: - prefix_val = ["NP", "66", "F3", "F2"].index(self.prefix) - opcode.append((EntryKind.TABLE_PREFIX, [prefix_val])) if self.vexl in ("0", "1") or self.rexw in ("0", "1"): rexw = {"0": [0], "1": [1<<0], "IG": [0, 1<<0]}[self.rexw or "IG"] vexl = {"0": [0], "1": [1<<1], "IG": [0, 1<<1]}[self.vexl or "IG"]