No longer store sizes as bitfields

On most (x86) processors, using bitfields is low than using slightly
more memory.
This commit is contained in:
Alexis Engelke
2019-01-13 16:19:41 +01:00
parent 5bdafbbcf0
commit 9d3f34bcc6
2 changed files with 15 additions and 37 deletions

View File

@@ -456,40 +456,19 @@ decode(const uint8_t* buffer, int len, DecodeMode mode, Instr* instr)
instr->segment = RI_DS; instr->segment = RI_DS;
} }
uint8_t op_size_log = 0; uint8_t op_size = 0;
if (desc->gp_size_8) if (desc->gp_size_8)
{ op_size = 1;
op_size_log = 1;
}
else if (mode == DECODE_64 && (prefixes & PREFIX_REXW)) else if (mode == DECODE_64 && (prefixes & PREFIX_REXW))
{ op_size = 8;
op_size_log = 4;
}
else if (prefixes & PREFIX_OPSZ) else if (prefixes & PREFIX_OPSZ)
{ op_size = 2;
op_size_log = 2;
}
#if defined(ARCH_X86_64)
else if (mode == DECODE_64 && desc->gp_size_def64) else if (mode == DECODE_64 && desc->gp_size_def64)
{ op_size = 8;
op_size_log = 4;
}
#endif
else else
{ op_size = 4;
op_size_log = 3;
}
uint8_t op_size = (1 << op_size_log) >> 1; instr->op_size = UNLIKELY(desc->gp_instr_width) ? op_size : 0;
if (UNLIKELY(desc->gp_instr_width))
{
instr->width = op_size_log;
}
else
{
instr->width = 0;
}
uint8_t vec_size = 16; uint8_t vec_size = 16;
if (prefixes & PREFIX_VEXL) if (prefixes & PREFIX_VEXL)
@@ -498,11 +477,10 @@ decode(const uint8_t* buffer, int len, DecodeMode mode, Instr* instr)
} }
// Compute address size. // 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) if (prefixes & PREFIX_ADDRSZ)
addr_size_log -= 1; addr_size >>= 1;
instr->addr_size = addr_size_log; instr->addr_size = addr_size;
uint8_t addr_size = (1 << addr_size_log) >> 1;
uint8_t operand_sizes[4] = { uint8_t operand_sizes[4] = {
0, 1 << desc->gp_fixed_operand_size, op_size, vec_size 0, 1 << desc->gp_fixed_operand_size, op_size, vec_size

View File

@@ -116,9 +116,9 @@ struct Instr
{ {
uint16_t type; uint16_t type;
struct Operand operands[4]; struct Operand operands[4];
uint8_t segment : 3; uint8_t segment;
uint8_t width : 3; uint8_t op_size;
uint8_t addr_size : 2; uint8_t addr_size;
/** /**
* Encoded as 1 << (scale - 1) **or** no scaled register at all if zero. * Encoded as 1 << (scale - 1) **or** no scaled register at all if zero.
@@ -137,8 +137,8 @@ struct Instr
typedef struct Instr Instr; typedef struct Instr Instr;
#define INSTR_SEGMENT(instr) ((instr)->segment) #define INSTR_SEGMENT(instr) ((instr)->segment)
#define INSTR_WIDTH(instr) ((1 << (instr)->width) >> 1) #define INSTR_WIDTH(instr) ((instr)->op_size)
#define INSTR_ADDRSZ(instr) ((1 << (instr)->addr_size) >> 1) #define INSTR_ADDRSZ(instr) ((instr)->addr_size)
#define INSTR_HAS_REP(instr) ((instr)->prefixes & PREFIX_REP) #define INSTR_HAS_REP(instr) ((instr)->prefixes & PREFIX_REP)
#define INSTR_HAS_REPNZ(instr) ((instr)->prefixes & PREFIX_REPNZ) #define INSTR_HAS_REPNZ(instr) ((instr)->prefixes & PREFIX_REPNZ)
#define INSTR_HAS_LOCK(instr) ((instr)->prefixes & PREFIX_LOCK) #define INSTR_HAS_LOCK(instr) ((instr)->prefixes & PREFIX_LOCK)