Support VSIB encoding

This commit is contained in:
Alexis Engelke
2019-04-27 11:16:09 +02:00
parent 1b474a04ac
commit dff78c5a86
3 changed files with 15 additions and 12 deletions

View File

@@ -1,4 +1,5 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@@ -176,7 +177,7 @@ out:
static
int
decode_modrm(const uint8_t* buffer, int len, DecodeMode mode, FdInstr* instr,
PrefixSet prefixes, FdOp* out_o1, FdOp* out_o2)
PrefixSet prefixes, bool vsib, FdOp* out_o1, FdOp* out_o2)
{
int off = 0;
@@ -231,7 +232,7 @@ decode_modrm(const uint8_t* buffer, int len, DecodeMode mode, FdInstr* instr,
out_o1->type = FD_OT_MEM;
instr->idx_scale = scale;
instr->idx_reg = idx == 4 ? FD_REG_NONE : idx;
instr->idx_reg = !vsib && idx == 4 ? FD_REG_NONE : idx;
// RIP-relative addressing only if SIB-byte is absent
if (mod == 0 && rm == 5 && mode == DECODE_64)
@@ -275,6 +276,7 @@ struct InstrDesc
uint8_t gp_instr_width : 1;
uint8_t gp_fixed_operand_size : 3;
uint8_t lock : 1;
uint8_t vsib : 1;
} __attribute__((packed));
#define DESC_HAS_MODRM(desc) (((desc)->operand_indices & (3 << 0)) != 0)
@@ -448,7 +450,7 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address,
operand2 = &instr->operands[DESC_MODREG_IDX(desc)];
retval = decode_modrm(buffer + off, len - off, mode, instr, prefixes,
operand1, operand2);
desc->vsib, operand1, operand2);
if (UNLIKELY(retval < 0))
return -1;
off += retval;

View File

@@ -979,15 +979,14 @@ VEX.66.W0.0f388c RVM XMM XMM XMM - VPMASKMOVD
VEX.66.W1.0f388c RVM XMM XMM XMM - VPMASKMOVQ
VEX.66.W0.0f388e MVR XMM XMM XMM - VPMASKMOVD
VEX.66.W1.0f388e MVR XMM XMM XMM - VPMASKMOVQ
# TODO: VSIB encoding
#VEX.66.W0.0f3890 RMV XMM XMM XMM - VPGATHERDD VSIB
#VEX.66.W1.0f3890 RMV XMM XMM XMM - VPGATHERDQ VSIB
#VEX.66.W0.0f3891 RMV XMM XMM XMM - VPGATHERQD VSIB
#VEX.66.W1.0f3891 RMV XMM XMM XMM - VPGATHERQQ VSIB
#VEX.66.W0.0f3892 RMV XMM XMM XMM - VGATHERDPS VSIB
#VEX.66.W1.0f3892 RMV XMM XMM XMM - VGATHERDPD VSIB
#VEX.66.W0.0f3893 RMV XMM XMM XMM - VGATHERQPS VSIB
#VEX.66.W1.0f3893 RMV XMM XMM XMM - VGATHERQPD VSIB
VEX.66.W0.0f3890 RMV XMM XMM XMM - VPGATHERDD VSIB
VEX.66.W1.0f3890 RMV XMM XMM XMM - VPGATHERDQ VSIB
VEX.66.W0.0f3891 RMV XMM XMM XMM - VPGATHERQD VSIB
VEX.66.W1.0f3891 RMV XMM XMM XMM - VPGATHERQQ VSIB
VEX.66.W0.0f3892 RMV XMM XMM XMM - VGATHERDPS VSIB
VEX.66.W1.0f3892 RMV XMM XMM XMM - VGATHERDPD VSIB
VEX.66.W0.0f3893 RMV XMM XMM XMM - VGATHERQPS VSIB
VEX.66.W1.0f3893 RMV XMM XMM XMM - VGATHERQPD VSIB
VEX.66.W0.0f3896 RVM XMM XMM XMM - VFMADDADD132PS
VEX.66.W1.0f3896 RVM XMM XMM XMM - VFMADDADD132PD
VEX.66.W0.0f3897 RVM XMM XMM XMM - VFMSUBADD132PS

View File

@@ -38,6 +38,7 @@ InstrFlags = bitstruct("InstrFlags", [
"gp_instr_width:1",
"gp_fixed_operand_size:3",
"lock:1",
"vsib:1",
])
assert InstrFlags._encode_size <= 32
@@ -116,6 +117,7 @@ class InstrDesc(namedtuple("InstrDesc", "mnemonic,flags,encoding")):
if "INSTR_WIDTH" in desc[6:]: flags.gp_instr_width = 1
if "IMM_8" in desc[6:]: flags.imm_byte = 1
if "LOCK" in desc[6:]: flags.lock = 1
if "VSIB" in desc[6:]: flags.vsib = 1
return cls(desc[5], frozenset(desc[6:]), flags._encode())
def encode(self, mnemonics_lut):