decode: Move prefix before other opcode extensions
This commit is contained in:
18
decode.c
18
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)
|
||||
|
||||
@@ -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"]
|
||||
|
||||
Reference in New Issue
Block a user