From 9d3f34bcc62ed5b4323cc4018f9b505c7a354c50 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Sun, 13 Jan 2019 16:19:41 +0100 Subject: [PATCH] No longer store sizes as bitfields On most (x86) processors, using bitfields is low than using slightly more memory. --- decode.c | 42 ++++++++++-------------------------------- decode.h | 10 +++++----- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/decode.c b/decode.c index d7b1734..d1f1f84 100644 --- a/decode.c +++ b/decode.c @@ -456,40 +456,19 @@ decode(const uint8_t* buffer, int len, DecodeMode mode, Instr* instr) instr->segment = RI_DS; } - uint8_t op_size_log = 0; + uint8_t op_size = 0; if (desc->gp_size_8) - { - op_size_log = 1; - } + op_size = 1; else if (mode == DECODE_64 && (prefixes & PREFIX_REXW)) - { - op_size_log = 4; - } + op_size = 8; else if (prefixes & PREFIX_OPSZ) - { - op_size_log = 2; - } -#if defined(ARCH_X86_64) + op_size = 2; else if (mode == DECODE_64 && desc->gp_size_def64) - { - op_size_log = 4; - } -#endif + op_size = 8; else - { - op_size_log = 3; - } + op_size = 4; - uint8_t op_size = (1 << op_size_log) >> 1; - - if (UNLIKELY(desc->gp_instr_width)) - { - instr->width = op_size_log; - } - else - { - instr->width = 0; - } + instr->op_size = UNLIKELY(desc->gp_instr_width) ? op_size : 0; uint8_t vec_size = 16; if (prefixes & PREFIX_VEXL) @@ -498,11 +477,10 @@ decode(const uint8_t* buffer, int len, DecodeMode mode, Instr* instr) } // Compute address size. - uint8_t addr_size_log = mode == DECODE_64 ? 4 : 3; + uint8_t addr_size = mode == DECODE_64 ? 8 : 4; if (prefixes & PREFIX_ADDRSZ) - addr_size_log -= 1; - instr->addr_size = addr_size_log; - uint8_t addr_size = (1 << addr_size_log) >> 1; + addr_size >>= 1; + instr->addr_size = addr_size; uint8_t operand_sizes[4] = { 0, 1 << desc->gp_fixed_operand_size, op_size, vec_size diff --git a/decode.h b/decode.h index d24264d..c81323e 100644 --- a/decode.h +++ b/decode.h @@ -116,9 +116,9 @@ struct Instr { uint16_t type; struct Operand operands[4]; - uint8_t segment : 3; - uint8_t width : 3; - uint8_t addr_size : 2; + uint8_t segment; + uint8_t op_size; + uint8_t addr_size; /** * Encoded as 1 << (scale - 1) **or** no scaled register at all if zero. @@ -137,8 +137,8 @@ struct Instr typedef struct Instr Instr; #define INSTR_SEGMENT(instr) ((instr)->segment) -#define INSTR_WIDTH(instr) ((1 << (instr)->width) >> 1) -#define INSTR_ADDRSZ(instr) ((1 << (instr)->addr_size) >> 1) +#define INSTR_WIDTH(instr) ((instr)->op_size) +#define INSTR_ADDRSZ(instr) ((instr)->addr_size) #define INSTR_HAS_REP(instr) ((instr)->prefixes & PREFIX_REP) #define INSTR_HAS_REPNZ(instr) ((instr)->prefixes & PREFIX_REPNZ) #define INSTR_HAS_LOCK(instr) ((instr)->prefixes & PREFIX_LOCK)