decode: Remove use of ARCH_* macros

This commit is contained in:
Alexis Engelke
2021-01-02 16:25:25 +01:00
parent 64a9984fa0
commit 90cce987f0

View File

@@ -98,10 +98,10 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
unsigned kind = ENTRY_TABLE_ROOT; unsigned kind = ENTRY_TABLE_ROOT;
switch (mode_int) switch (mode_int)
{ {
#if defined(ARCH_386) #if defined(FD_TABLE_OFFSET_32)
case 32: table_idx = FD_TABLE_OFFSET_32; mode = DECODE_32; break; case 32: table_idx = FD_TABLE_OFFSET_32; mode = DECODE_32; break;
#endif #endif
#if defined(ARCH_X86_64) #if defined(FD_TABLE_OFFSET_64)
case 64: table_idx = FD_TABLE_OFFSET_64; mode = DECODE_64; break; case 64: table_idx = FD_TABLE_OFFSET_64; mode = DECODE_64; break;
#endif #endif
default: return FD_ERR_INTERNAL; default: return FD_ERR_INTERNAL;
@@ -118,7 +118,6 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
int rex_off = -1; int rex_off = -1;
instr->segment = FD_REG_NONE; instr->segment = FD_REG_NONE;
#if defined(ARCH_386)
if (mode == DECODE_32) { if (mode == DECODE_32) {
while (LIKELY(off < len)) while (LIKELY(off < len))
{ {
@@ -142,8 +141,6 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
off++; off++;
} }
} }
#endif
#if defined(ARCH_X86_64)
if (mode == DECODE_64) { if (mode == DECODE_64) {
while (LIKELY(off < len)) while (LIKELY(off < len))
{ {
@@ -171,7 +168,6 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
off++; off++;
} }
} }
#endif
prefix_end: prefix_end:
// REX prefix is only considered if it is the last prefix. // REX prefix is only considered if it is the last prefix.
@@ -340,10 +336,8 @@ prefix_end:
{ {
FdOp* op_modreg = &instr->operands[DESC_MODREG_IDX(desc)]; FdOp* op_modreg = &instr->operands[DESC_MODREG_IDX(desc)];
unsigned reg_idx = mod_reg; unsigned reg_idx = mod_reg;
#if defined(ARCH_X86_64)
if (!is_seg && !UNLIKELY(op_modreg->misc == FD_RT_MMX)) if (!is_seg && !UNLIKELY(op_modreg->misc == FD_RT_MMX))
reg_idx += prefix_rex & PREFIX_REXR ? 8 : 0; reg_idx += prefix_rex & PREFIX_REXR ? 8 : 0;
#endif
if (is_cr && (~0x011d >> reg_idx) & 1) if (is_cr && (~0x011d >> reg_idx) & 1)
return FD_ERR_UD; return FD_ERR_UD;
@@ -368,10 +362,8 @@ prefix_end:
return FD_ERR_UD; return FD_ERR_UD;
uint8_t reg_idx = rm; uint8_t reg_idx = rm;
#if defined(ARCH_X86_64)
if (LIKELY(op_modrm->misc == FD_RT_GPL || op_modrm->misc == FD_RT_VEC)) if (LIKELY(op_modrm->misc == FD_RT_GPL || op_modrm->misc == FD_RT_VEC))
reg_idx += prefix_rex & PREFIX_REXB ? 8 : 0; reg_idx += prefix_rex & PREFIX_REXB ? 8 : 0;
#endif
op_modrm->type = FD_OT_REG; op_modrm->type = FD_OT_REG;
op_modrm->reg = reg_idx; op_modrm->reg = reg_idx;
} }
@@ -388,9 +380,7 @@ prefix_end:
uint8_t sib = buffer[off++]; uint8_t sib = buffer[off++];
unsigned scale = (sib & 0xc0) >> 6; unsigned scale = (sib & 0xc0) >> 6;
unsigned idx = (sib & 0x38) >> 3; unsigned idx = (sib & 0x38) >> 3;
#if defined(ARCH_X86_64)
idx += prefix_rex & PREFIX_REXX ? 8 : 0; idx += prefix_rex & PREFIX_REXX ? 8 : 0;
#endif
base = sib & 0x07; base = sib & 0x07;
if (!vsib && idx == 4) if (!vsib && idx == 4)
idx = FD_REG_NONE; idx = FD_REG_NONE;
@@ -439,10 +429,8 @@ prefix_end:
// If there is no ModRM, but a Mod-Reg, its opcode-encoded. // If there is no ModRM, but a Mod-Reg, its opcode-encoded.
FdOp* operand = &instr->operands[DESC_MODREG_IDX(desc)]; FdOp* operand = &instr->operands[DESC_MODREG_IDX(desc)];
uint8_t reg_idx = buffer[off - 1] & 7; uint8_t reg_idx = buffer[off - 1] & 7;
#if defined(ARCH_X86_64)
// Only used for GP registers, therefore always apply REX.B. // Only used for GP registers, therefore always apply REX.B.
reg_idx += prefix_rex & PREFIX_REXB ? 8 : 0; reg_idx += prefix_rex & PREFIX_REXB ? 8 : 0;
#endif
operand->type = FD_OT_REG; operand->type = FD_OT_REG;
operand->reg = reg_idx; operand->reg = reg_idx;
} }