parseinstrs: Simplify opkind lookup

This commit is contained in:
Alexis Engelke
2020-06-30 21:02:31 +02:00
parent e7b5982ba9
commit 08490d4503

View File

@@ -83,36 +83,48 @@ ENCODINGS = {
"MVR": InstrFlags(modrm_idx=0^3, modreg_idx=2^3, vexreg_idx=1^3), "MVR": InstrFlags(modrm_idx=0^3, modreg_idx=2^3, vexreg_idx=1^3),
} }
OPKIND_LOOKUP = { class OpKind(NamedTuple):
size: int
kind: str
SZ_OP = -1
SZ_VEC = -2
K_MEM = "mem"
K_IMM = "imm"
OPKINDS = {
# sizeidx (0, fixedsz, opsz, vecsz), fixedsz (log2), regtype # sizeidx (0, fixedsz, opsz, vecsz), fixedsz (log2), regtype
"-": (0, 0, 7), "IMM": OpKind(OpKind.SZ_OP, OpKind.K_IMM),
"IMM": (2, 0, 7), "IMM8": OpKind(1, OpKind.K_IMM),
"IMM8": (1, 0, 7), "IMM16": OpKind(2, OpKind.K_IMM),
"IMM16": (1, 1, 7), "IMM32": OpKind(4, OpKind.K_IMM),
"IMM32": (1, 2, 7), "GP": OpKind(OpKind.SZ_OP, "GP"),
"GP": (2, 0, 0), "GP8": OpKind(1, "GP"),
"GP8": (1, 0, 0), "GP16": OpKind(2, "GP"),
"GP16": (1, 1, 0), "GP32": OpKind(4, "GP"),
"GP32": (1, 2, 0), "GP64": OpKind(8, "GP"),
"GP64": (1, 3, 0), "MMX": OpKind(8, "MMX"),
"MMX": (1, 3, 4), "XMM": OpKind(OpKind.SZ_VEC, "XMM"),
"XMM": (3, 0, 2), "XMM8": OpKind(1, "XMM"),
"XMM8": (1, 0, 2), "XMM16": OpKind(2, "XMM"),
"XMM16": (1, 1, 2), "XMM32": OpKind(4, "XMM"),
"XMM32": (1, 2, 2), "XMM64": OpKind(8, "XMM"),
"XMM64": (1, 3, 2), "XMM128": OpKind(16, "XMM"),
"XMM128": (1, 4, 2), "XMM256": OpKind(32, "XMM"),
"XMM256": (1, 5, 2), "SREG": OpKind(0, "SEG"),
"SREG": (0, 0, 7), "FPU": OpKind(10, "FPU"),
"FPU": (0, 0, 1), "MEMZ": OpKind(0, OpKind.K_MEM),
"MEMZ": (0, 0, 7), "MEM8": OpKind(1, OpKind.K_MEM),
"MEM8": (1, 0, 7), "MEM16": OpKind(2, OpKind.K_MEM),
"MEM16": (1, 1, 7), "MEM32": OpKind(4, OpKind.K_MEM),
"MEM32": (1, 2, 7), "MEM64": OpKind(8, OpKind.K_MEM),
"MEM64": (1, 3, 7), "MASK8": OpKind(1, "MASK"),
"BND": (0, 0, 5), "MASK16": OpKind(2, "MASK"),
"CR": (0, 0, 7), "MASK32": OpKind(4, "MASK"),
"DR": (0, 0, 7), "MASK64": OpKind(8, "MASK"),
"BND": OpKind(0, "BND"),
"CR": OpKind(0, "CR"),
"DR": OpKind(0, "DR"),
} }
class InstrDesc(NamedTuple): class InstrDesc(NamedTuple):
@@ -121,10 +133,16 @@ class InstrDesc(NamedTuple):
operands: Tuple[str, ...] operands: Tuple[str, ...]
flags: FrozenSet[str] flags: FrozenSet[str]
OPKIND_REGTYS = {"GP": 0, "FPU": 1, "XMM": 2, "MASK": 3, "MMX": 4, "BND": 5}
OPKIND_SIZES = {
0: (0,0), 1: (1,0), 2: (1,1), 4: (1,2), 8: (1,3), 16: (1,4), 32: (1,5),
OpKind.SZ_OP: (2,0), OpKind.SZ_VEC: (3,0),
}
@classmethod @classmethod
def parse(cls, desc): def parse(cls, desc):
desc = desc.split() desc = desc.split()
operands = tuple(op for op in desc[1:5] if op != "-") operands = tuple(OPKINDS[op] for op in desc[1:5] if op != "-")
return cls(desc[5], desc[0], operands, frozenset(desc[6:])) return cls(desc[5], desc[0], operands, frozenset(desc[6:]))
def encode(self): def encode(self):
@@ -132,7 +150,8 @@ class InstrDesc(NamedTuple):
fixed_opsz = set() fixed_opsz = set()
for i, opkind in enumerate(self.operands): for i, opkind in enumerate(self.operands):
enc_size, fixed_size, reg_type = OPKIND_LOOKUP[opkind] enc_size, fixed_size = self.OPKIND_SIZES.get(opkind.size, (0, 0))
reg_type = self.OPKIND_REGTYS.get(opkind.kind, 7)
if enc_size == 1: fixed_opsz.add(fixed_size) if enc_size == 1: fixed_opsz.add(fixed_size)
setattr(flags, "op%d_size"%i, enc_size) setattr(flags, "op%d_size"%i, enc_size)
if i < 3: if i < 3: