diff options
author | iximeow <me@iximeow.net> | 2019-07-21 04:28:48 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-01-12 16:10:13 -0800 |
commit | 5d5feaa456204c3ac40034af9d74ce3d38182f32 (patch) | |
tree | 6a964f475fab21cfaab6c9d5d3935716148ac904 /src/lib.rs | |
parent | a6e827989857bd1b130cbff41ec373871b523b12 (diff) |
many more optimizations
opcode data tables made consistent. apologies for the mem::transmutes,
that's to avoid an extra load and strongly guide the compiler towards
doing a u16 load.
also fix issue where byte iter was a ref to a ref, and other small
changes.
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 2143 |
1 files changed, 1116 insertions, 1027 deletions
@@ -176,7 +176,7 @@ pub enum Operand { RegIndexBaseScale(RegSpec, RegSpec, u8), RegIndexBaseScaleDisp(RegSpec, RegSpec, u8, i32), // Many(Vec<Operand>), - Nothing + Nothing, } impl Operand { @@ -213,7 +213,6 @@ impl Operand { #[cfg(feature="use-serde")] #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] -#[repr(u8)] pub enum RegisterBank { Q, D, W, B, rB, // Quadword, Dword, Word, Byte CR, DR, S, EIP, RIP, EFlags, RFlags, // Control reg, Debug reg, Selector, ... @@ -223,7 +222,6 @@ pub enum RegisterBank { #[allow(non_camel_case_types)] #[cfg(not(feature="use-serde"))] #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -#[repr(u8)] pub enum RegisterBank { Q, D, W, B, rB, // Quadword, Dword, Word, Byte CR, DR, S, EIP, RIP, EFlags, RFlags, // Control reg, Debug reg, Selector, ... @@ -232,23 +230,22 @@ pub enum RegisterBank { } #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -#[repr(u8)] pub enum Segment { DS = 0, CS, ES, FS, GS, SS } #[allow(non_camel_case_types)] #[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[repr(u8)] pub enum Opcode { - ADD = 0, - OR = 1, - ADC = 2, - SBB = 3, - AND = 4, + ADD = 1, + OR = 2, + ADC = 3, + SBB = 4, + AND = 5, XOR = 6, - SUB = 5, - CMP = 7, + SUB = 7, + CMP = 8, + Invalid, XADD, BT, BTS, @@ -436,7 +433,6 @@ pub enum Opcode { CLD, STD, JMPE, - Invalid } #[derive(Debug)] pub struct Instruction { @@ -555,15 +551,16 @@ impl Instruction { #[derive(Debug)] pub struct Prefixes { bits: u8, - rep_prefix: Option<RepPrefix>, + rep_prefix: RepPrefix, rex: PrefixRex, segment: Segment, } #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub enum RepPrefix { - E, - NE + None = 0, + E = 1, + NE = 2, } #[derive(Debug)] @@ -576,7 +573,7 @@ impl Prefixes { fn new(bits: u8) -> Prefixes { Prefixes { bits: bits, - rep_prefix: None, + rep_prefix: RepPrefix::None, rex: PrefixRex { bits: 0 }, segment: Segment::DS, } @@ -602,13 +599,13 @@ impl Prefixes { #[inline] fn set_address_size(&mut self) { self.bits = self.bits | 0x2 } #[inline] - pub fn repne(&self) -> bool { self.rep_prefix == Some(RepPrefix::NE) } + pub fn repne(&self) -> bool { self.rep_prefix == RepPrefix::NE } #[inline] - fn set_repne(&mut self) { self.rep_prefix = Some(RepPrefix::NE); } + fn set_repne(&mut self) { self.rep_prefix = RepPrefix::NE; } #[inline] - pub fn repe(&self) -> bool { self.rep_prefix == Some(RepPrefix::E) } + pub fn repe(&self) -> bool { self.rep_prefix == RepPrefix::E } #[inline] - fn set_repe(&mut self) { self.rep_prefix = Some(RepPrefix::E); } + fn set_repe(&mut self) { self.rep_prefix = RepPrefix::E; } #[inline] pub fn set_lock(&mut self) { self.bits |= 0x4 } #[inline] @@ -738,10 +735,38 @@ pub enum OperandCode { Yb_Xb, Yv_AX, Yv_Xv, - Zb_Ib(u8), - Zv(u8), - Zv_AX(u8), - Zv_Ivq(u8), + Zb_Ib_R0, + Zb_Ib_R1, + Zb_Ib_R2, + Zb_Ib_R3, + Zb_Ib_R4, + Zb_Ib_R5, + Zb_Ib_R6, + Zb_Ib_R7, + Zv_R0, + Zv_R1, + Zv_R2, + Zv_R3, + Zv_R4, + Zv_R5, + Zv_R6, + Zv_R7, + Zv_AX_R0, + Zv_AX_R1, + Zv_AX_R2, + Zv_AX_R3, + Zv_AX_R4, + Zv_AX_R5, + Zv_AX_R6, + Zv_AX_R7, + Zv_Ivq_R0, + Zv_Ivq_R1, + Zv_Ivq_R2, + Zv_Ivq_R3, + Zv_Ivq_R4, + Zv_Ivq_R5, + Zv_Ivq_R6, + Zv_Ivq_R7, Nothing, Implied } @@ -770,301 +795,304 @@ const BITWISE_OPCODE_MAP: [Opcode; 8] = [ Opcode::SAL, Opcode::SAR ]; -fn read_opcode_660f_map<T: Iterator<Item=u8>>(_bytes_iter: &mut T, _instruction: &mut Instruction) -> Option<OperandCode> { +fn read_opcode_660f_map<T: Iterator<Item=u8>>(_bytes_iter: &mut T, _instruction: &mut Instruction) -> Option<OpcodeRecord> { panic!("660f opcode map unsupported".to_string()); } -#[derive(Copy, Clone)] -struct OpcodeInstructionRecord(Opcode, OperandCode); - -const OPCODE_F20F_MAP: [OpcodeInstructionRecord; 256] = [ - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), +const OPCODE_F20F_MAP: [OpcodeRecord; 256] = [ + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x10 - OpcodeInstructionRecord(Opcode::MOVSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::MOVSD, OperandCode::E_G_xmm), - OpcodeInstructionRecord(Opcode::MOVDDUP, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVSD), OperandCode::E_G_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVDDUP), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x20 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::CVTSI2SD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::CVTTSD2SI, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::CVTSD2SI, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CVTSI2SD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CVTTSD2SI), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::CVTSD2SI), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x30 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x40 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x50 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::SQRTSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::ADDSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::MULSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::CVTSD2SS, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::SUBSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::MINSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::DIVSD, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::MAXSD, OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SQRTSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::ADDSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::MULSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::CVTSD2SS), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SUBSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::MINSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::DIVSD), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::MAXSD), OperandCode::G_E_xmm), // 0x60 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x70 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::HADDPS, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::HSUBPS, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::HADDPS), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::HSUBPS), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x80 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x90 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xa0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xb0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xc0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xd0 - OpcodeInstructionRecord(Opcode::ADDSUBPS, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::ADDSUBPS), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xe0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xf0 - OpcodeInstructionRecord(Opcode::LDDQU, OperandCode::G_E_xmm), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::LDDQU), OperandCode::G_E_xmm), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), ]; -fn read_opcode_f20f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OperandCode> { +fn read_opcode_f20f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OpcodeRecord> { match bytes_iter.next() { Some(b) => { instruction.length += 1; let record = OPCODE_F20F_MAP[b as usize]; - instruction.opcode = record.0; - Some(record.1) + if let Interpretation::Instruction(opc) = record.0 { + instruction.opcode = opc; + } else { + unsafe { unreachable_unchecked(); } + } + Some(record) } None => { None } } } -fn read_opcode_f30f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OperandCode> { +fn read_opcode_f30f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OpcodeRecord> { + return None; + /* match bytes_iter.next() { Some(b) => { instruction.length += 1; @@ -1093,299 +1121,304 @@ fn read_opcode_f30f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: & None } } + */ } -const OPCODE_0F_MAP: [OpcodeInstructionRecord; 256] = [ - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::ModRM_0x0f00), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::ModRM_0x0f01), - OpcodeInstructionRecord(Opcode::LAR, OperandCode::Gv_M), - OpcodeInstructionRecord(Opcode::LSL, OperandCode::Gv_M), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::SYSCALL, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::CLTS, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::SYSRET, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::INVD, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::WBINVD, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::UD2, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::NOP, OperandCode::Ev), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), +const OPCODE_0F_MAP: [OpcodeRecord; 256] = [ + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x0f00), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x0f01), + OpcodeRecord(Interpretation::Instruction(Opcode::LAR), OperandCode::Gv_M), + OpcodeRecord(Interpretation::Instruction(Opcode::LSL), OperandCode::Gv_M), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SYSCALL), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CLTS), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SYSRET), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::INVD), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::WBINVD), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::UD2), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::NOP), OperandCode::Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x10 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::NOP, OperandCode::Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::NOP), OperandCode::Ev), // 0x20 - OpcodeInstructionRecord(Opcode::MOV, OperandCode::Rq_Cq_0), - OpcodeInstructionRecord(Opcode::MOV, OperandCode::Rq_Dq_0), - OpcodeInstructionRecord(Opcode::MOV, OperandCode::Cq_Rq_0), - OpcodeInstructionRecord(Opcode::MOV, OperandCode::Dq_Rq_0), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Rq_Cq_0), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Rq_Dq_0), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Cq_Rq_0), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Dq_Rq_0), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x30 - OpcodeInstructionRecord(Opcode::WRMSR, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::RDTSC, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::RDMSR, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::RDPMC, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::WRMSR), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::RDTSC), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::RDMSR), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::RDPMC), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x40 - OpcodeInstructionRecord(Opcode::CMOVO, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNO, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVB, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNB, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVZ, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNZ, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNA, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVA, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVS, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNS, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVP, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVNP, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVL, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVGE, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVLE, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::CMOVG, OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVO), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNO), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVB), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNB), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVZ), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNZ), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNA), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVA), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVS), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNS), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVP), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVNP), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVL), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVGE), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVLE), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMOVG), OperandCode::Gv_Ev), // 0x50 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x60 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x70 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x80 - OpcodeInstructionRecord(Opcode::JO, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNO, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JB, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNB, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JZ, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNZ, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNA, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JA, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JS, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNS, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JP, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JNP, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JL, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JGE, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JLE, OperandCode::Jvds), - OpcodeInstructionRecord(Opcode::JG, OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JO), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNO), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JB), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNB), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JZ), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNZ), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNA), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JA), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JS), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNS), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JP), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JNP), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JL), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JGE), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JLE), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JG), OperandCode::Jvds), // 0x90 - OpcodeInstructionRecord(Opcode::SETO, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETNO, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETB, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETAE, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETZ, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETNZ, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETBE, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETA, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETS, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETNS, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETP, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETNP, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETL, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETGE, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETLE, OperandCode::Eb_R0), - OpcodeInstructionRecord(Opcode::SETG, OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETO), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETNO), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETB), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETAE), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETZ), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETNZ), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETBE), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETA), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETS), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETNS), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETP), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETNP), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETL), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETGE), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETLE), OperandCode::Eb_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::SETG), OperandCode::Eb_R0), // 0xa0 - OpcodeInstructionRecord(Opcode::PUSH, OperandCode::FS), - OpcodeInstructionRecord(Opcode::POP, OperandCode::GS), - OpcodeInstructionRecord(Opcode::CPUID, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::BT, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::PUSH, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::PUSH, OperandCode::GS), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::ModRM_0x0fae), - OpcodeInstructionRecord(Opcode::IMUL, OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::FS), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::GS), + OpcodeRecord(Interpretation::Instruction(Opcode::CPUID), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::BT), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::GS), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x0fae), + OpcodeRecord(Interpretation::Instruction(Opcode::IMUL), OperandCode::Gv_Ev), // 0xb0 - OpcodeInstructionRecord(Opcode::CMPXCHG, OperandCode::Eb_Gb), - OpcodeInstructionRecord(Opcode::CMPXCHG, OperandCode::Ev_Gv), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::MOVZX_b, OperandCode::Gv_Eb), - OpcodeInstructionRecord(Opcode::MOVZX_w, OperandCode::Gv_Ew), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::ModRM_0x0fba), - OpcodeInstructionRecord(Opcode::BTC, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::BSF, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::BSR, OperandCode::Gv_Ev), - OpcodeInstructionRecord(Opcode::MOVSX_b, OperandCode::Gv_Eb), - OpcodeInstructionRecord(Opcode::MOVSX_w, OperandCode::Gv_Ew), + OpcodeRecord(Interpretation::Instruction(Opcode::CMPXCHG), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::CMPXCHG), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVZX_b), OperandCode::Gv_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVZX_w), OperandCode::Gv_Ew), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x0fba), + OpcodeRecord(Interpretation::Instruction(Opcode::BTC), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::BSF), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::BSR), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVSX_b), OperandCode::Gv_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVSX_w), OperandCode::Gv_Ew), // 0xc0 - OpcodeInstructionRecord(Opcode::XADD, OperandCode::Eb_Gb), - OpcodeInstructionRecord(Opcode::XADD, OperandCode::Ev_Gv), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::XADD), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::XADD), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xd0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xe0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xf0 - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), - OpcodeInstructionRecord(Opcode::Invalid, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), ]; -fn read_opcode_0f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OperandCode> { +fn read_opcode_0f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OpcodeRecord> { match bytes_iter.next() { Some(b) => { instruction.length += 1; let record = OPCODE_0F_MAP[b as usize]; - instruction.opcode = record.0; - Some(record.1) + if let Interpretation::Instruction(opc) = record.0 { + instruction.opcode = opc; + } else { + unsafe { unreachable_unchecked(); } + } + Some(record) } None => { None @@ -1395,399 +1428,309 @@ fn read_opcode_0f_map<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mu #[derive(Copy, Clone, PartialEq, Eq)] enum Interpretation { - Instruction, + Instruction(Opcode), Prefix, } #[derive(Copy, Clone)] // this should be a 32-byte struct.. -struct OpcodeRecord(Opcode, Interpretation, OperandCode); +struct OpcodeRecord(Interpretation, OperandCode); const OPCODES: [OpcodeRecord; 256] = [ - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::ADD, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::OR, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::ADC, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::SBB, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::AND, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::SUB, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::XOR, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::CMP, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::ADD), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::OR), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::ADC), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::SBB), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::AND), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::SUB), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::XOR), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::CMP), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0x40: - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), // 0x50: - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(0)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(1)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(2)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(3)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(4)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(5)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(6)), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Zv(7)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(0)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(1)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(2)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(3)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(4)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(5)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(6)), - OpcodeRecord(Opcode::POP, Interpretation::Instruction, OperandCode::Zv(7)), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R1), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R2), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R3), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R4), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R5), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R6), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Zv_R7), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R1), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R2), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R3), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R4), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R5), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R6), + OpcodeRecord(Interpretation::Instruction(Opcode::POP), OperandCode::Zv_R7), // 0x60 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::MOVSXD, Interpretation::Instruction, OperandCode::Gv_Ed), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Ivs), - OpcodeRecord(Opcode::IMUL, Interpretation::Instruction, OperandCode::Gv_Ev_Iv), - OpcodeRecord(Opcode::PUSH, Interpretation::Instruction, OperandCode::Ibs), - OpcodeRecord(Opcode::IMUL, Interpretation::Instruction, OperandCode::Gb_Eb_Ib), - OpcodeRecord(Opcode::INS, Interpretation::Instruction, OperandCode::Yb_DX), - OpcodeRecord(Opcode::INS, Interpretation::Instruction, OperandCode::Yv_DX), - OpcodeRecord(Opcode::OUTS, Interpretation::Instruction, OperandCode::DX_Xb), - OpcodeRecord(Opcode::OUTS, Interpretation::Instruction, OperandCode::DX_Xv), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVSXD), OperandCode::Gv_Ed), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Ivs), + OpcodeRecord(Interpretation::Instruction(Opcode::IMUL), OperandCode::Gv_Ev_Iv), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSH), OperandCode::Ibs), + OpcodeRecord(Interpretation::Instruction(Opcode::IMUL), OperandCode::Gb_Eb_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::INS), OperandCode::Yb_DX), + OpcodeRecord(Interpretation::Instruction(Opcode::INS), OperandCode::Yv_DX), + OpcodeRecord(Interpretation::Instruction(Opcode::OUTS), OperandCode::DX_Xb), + OpcodeRecord(Interpretation::Instruction(Opcode::OUTS), OperandCode::DX_Xv), // 0x70 - OpcodeRecord(Opcode::JO, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNO, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JB, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNB, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JZ, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNZ, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNA, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JA, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JS, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNS, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JP, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JNP, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JL, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JGE, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JLE, Interpretation::Instruction, OperandCode::Jbs), - OpcodeRecord(Opcode::JG, Interpretation::Instruction, OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JO), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNO), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JB), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNB), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JZ), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNZ), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNA), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JA), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JS), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNS), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JP), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JNP), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JL), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JGE), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JLE), OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::JG), OperandCode::Jbs), // 0x80 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0x80_Eb_Ib), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0x81_Ev_Ivs), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0x83_Ev_Ibs), - OpcodeRecord(Opcode::TEST, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::TEST, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Eb_Gb), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Ev_Gv), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Gb_Eb), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Gv_Ev), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Ew_Sw), - OpcodeRecord(Opcode::LEA, Interpretation::Instruction, OperandCode::Gv_M), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Sw_Ew), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0x8f_Ev), - OpcodeRecord(Opcode::NOP, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(1)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(2)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(3)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(4)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(5)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(6)), - OpcodeRecord(Opcode::XCHG, Interpretation::Instruction, OperandCode::Zv_AX(7)), - OpcodeRecord(Opcode::CBW, Interpretation::Instruction, OperandCode::AX_AL), - OpcodeRecord(Opcode::CBW, Interpretation::Instruction, OperandCode::DX_AX), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::WAIT, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::PUSHF, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::POPF, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::SAHF, Interpretation::Instruction, OperandCode::AH), - OpcodeRecord(Opcode::LAHF, Interpretation::Instruction, OperandCode::AH), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::AL_Ob), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::AX_Ov), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Ob_AL), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Ov_AX), - OpcodeRecord(Opcode::MOVS, Interpretation::Instruction, OperandCode::Yb_Xb), - OpcodeRecord(Opcode::MOVS, Interpretation::Instruction, OperandCode::Yv_Xv), - OpcodeRecord(Opcode::CMPS, Interpretation::Instruction, OperandCode::Yb_Xb), - OpcodeRecord(Opcode::CMPS, Interpretation::Instruction, OperandCode::Yv_Xv), - OpcodeRecord(Opcode::TEST, Interpretation::Instruction, OperandCode::AL_Ib), - OpcodeRecord(Opcode::TEST, Interpretation::Instruction, OperandCode::AX_Ivd), - OpcodeRecord(Opcode::STOS, Interpretation::Instruction, OperandCode::Yb_AL), - OpcodeRecord(Opcode::STOS, Interpretation::Instruction, OperandCode::Yv_AX), - OpcodeRecord(Opcode::LODS, Interpretation::Instruction, OperandCode::AL_Xb), - OpcodeRecord(Opcode::LODS, Interpretation::Instruction, OperandCode::AX_Xv), - OpcodeRecord(Opcode::SCAS, Interpretation::Instruction, OperandCode::Yb_AL), - OpcodeRecord(Opcode::SCAS, Interpretation::Instruction, OperandCode::Yv_AX), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x80_Eb_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x81_Ev_Ivs), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x83_Ev_Ibs), + OpcodeRecord(Interpretation::Instruction(Opcode::TEST), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::TEST), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Eb_Gb), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Ev_Gv), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Gb_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Gv_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Ew_Sw), + OpcodeRecord(Interpretation::Instruction(Opcode::LEA), OperandCode::Gv_M), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Sw_Ew), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0x8f_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::NOP), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R1), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R2), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R3), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R4), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R5), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R6), + OpcodeRecord(Interpretation::Instruction(Opcode::XCHG), OperandCode::Zv_AX_R7), + OpcodeRecord(Interpretation::Instruction(Opcode::CBW), OperandCode::AX_AL), + OpcodeRecord(Interpretation::Instruction(Opcode::CBW), OperandCode::DX_AX), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::PUSHF), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::POPF), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::SAHF), OperandCode::AH), + OpcodeRecord(Interpretation::Instruction(Opcode::LAHF), OperandCode::AH), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::AL_Ob), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::AX_Ov), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Ob_AL), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Ov_AX), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVS), OperandCode::Yb_Xb), + OpcodeRecord(Interpretation::Instruction(Opcode::MOVS), OperandCode::Yv_Xv), + OpcodeRecord(Interpretation::Instruction(Opcode::CMPS), OperandCode::Yb_Xb), + OpcodeRecord(Interpretation::Instruction(Opcode::CMPS), OperandCode::Yv_Xv), + OpcodeRecord(Interpretation::Instruction(Opcode::TEST), OperandCode::AL_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::TEST), OperandCode::AX_Ivd), + OpcodeRecord(Interpretation::Instruction(Opcode::STOS), OperandCode::Yb_AL), + OpcodeRecord(Interpretation::Instruction(Opcode::STOS), OperandCode::Yv_AX), + OpcodeRecord(Interpretation::Instruction(Opcode::LODS), OperandCode::AL_Xb), + OpcodeRecord(Interpretation::Instruction(Opcode::LODS), OperandCode::AX_Xv), + OpcodeRecord(Interpretation::Instruction(Opcode::SCAS), OperandCode::Yb_AL), + OpcodeRecord(Interpretation::Instruction(Opcode::SCAS), OperandCode::Yv_AX), // 0xb0 - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(0)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(1)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(2)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(3)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(4)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(5)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(6)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zb_Ib(7)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(0)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(1)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(2)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(3)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(4)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(5)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(6)), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::Zv_Ivq(7)), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R1), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R2), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R3), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R4), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R5), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R6), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zb_Ib_R7), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R0), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R1), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R2), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R3), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R4), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R5), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R6), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::Zv_Ivq_R7), // 0xc0 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xc0_Eb_Ib), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xc1_Ev_Ib), - OpcodeRecord(Opcode::RETURN, Interpretation::Instruction, OperandCode::Iw), - OpcodeRecord(Opcode::RETURN, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::ModRM_0xc6_Eb_Ib), - OpcodeRecord(Opcode::MOV, Interpretation::Instruction, OperandCode::ModRM_0xc7_Ev_Iv), - OpcodeRecord(Opcode::ENTER, Interpretation::Instruction, OperandCode::Iw_Ib), - OpcodeRecord(Opcode::LEAVE, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::RETF, Interpretation::Instruction, OperandCode::Iw), - OpcodeRecord(Opcode::RETF, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::INT, Interpretation::Instruction, OperandCode::I_3), - OpcodeRecord(Opcode::INT, Interpretation::Instruction, OperandCode::Ib), - OpcodeRecord(Opcode::INTO, Interpretation::Instruction, OperandCode::Fw), - OpcodeRecord(Opcode::IRET, Interpretation::Instruction, OperandCode::Fw), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xc0_Eb_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xc1_Ev_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::RETURN), OperandCode::Iw), + OpcodeRecord(Interpretation::Instruction(Opcode::RETURN), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::ModRM_0xc6_Eb_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::MOV), OperandCode::ModRM_0xc7_Ev_Iv), + OpcodeRecord(Interpretation::Instruction(Opcode::ENTER), OperandCode::Iw_Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::LEAVE), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::RETF), OperandCode::Iw), + OpcodeRecord(Interpretation::Instruction(Opcode::RETF), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::INT), OperandCode::I_3), + OpcodeRecord(Interpretation::Instruction(Opcode::INT), OperandCode::Ib), + OpcodeRecord(Interpretation::Instruction(Opcode::INTO), OperandCode::Fw), + OpcodeRecord(Interpretation::Instruction(Opcode::IRET), OperandCode::Fw), // 0xd0 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xd0_Eb_1), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xd1_Ev_1), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xd2_Eb_CL), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xd3_Ev_CL), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xd0_Eb_1), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xd1_Ev_1), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xd2_Eb_CL), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xd3_Ev_CL), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // XLAT - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 d8 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 d9 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 da - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 db - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 dc - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 dd - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 de - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // x86 df - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xe0 // LOOPNZ - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // LOOPZ - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // LOOP - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // JECXZ - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // IN - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // IN - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // OUT - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // OUT - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xe8 - OpcodeRecord(Opcode::CALL, Interpretation::Instruction, OperandCode::Jvds), - OpcodeRecord(Opcode::JMP, Interpretation::Instruction, OperandCode::Jvds), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::JMP, Interpretation::Instruction, OperandCode::Jbs), + OpcodeRecord(Interpretation::Instruction(Opcode::CALL), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::JMP), OperandCode::Jvds), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::JMP), OperandCode::Jbs), // IN - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // IN - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // OUT - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // OUT - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), // 0xf0 - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), // ICEBP? - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), + OpcodeRecord(Interpretation::Prefix, OperandCode::Nothing), // 0xf4 - OpcodeRecord(Opcode::HLT, Interpretation::Instruction, OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::HLT), OperandCode::Nothing), // CMC - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xf6), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xf7), - OpcodeRecord(Opcode::CLC, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::STC, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::CLI, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::STI, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::CLD, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::STD, Interpretation::Instruction, OperandCode::Nothing), - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xfe_Eb), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xf6), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xf7), + OpcodeRecord(Interpretation::Instruction(Opcode::CLC), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::STC), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CLI), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::STI), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::CLD), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::STD), OperandCode::Nothing), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xfe_Eb), // TODO: test 0xff /3 - OpcodeRecord(Opcode::Invalid, Interpretation::Instruction, OperandCode::ModRM_0xff_Ev), + OpcodeRecord(Interpretation::Instruction(Opcode::Invalid), OperandCode::ModRM_0xff_Ev), ]; -fn read_opcode<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<OperandCode> { - let mut alternate_opcode_map: Option<OpcodeMap> = None; - use std::hint::unreachable_unchecked; -// use std::intrinsics::unlikely; - instruction.prefixes = Prefixes::new(0); - loop { - match bytes_iter.next() { - Some(b) => { - instruction.length += 1; - let record = OPCODES[b as usize]; - if record.1 == Interpretation::Instruction { - instruction.opcode = record.0; - return Some(record.2); - } else { - match b { - 0x0f => { - return match alternate_opcode_map { - Some(OpcodeMap::Map66) => { - read_opcode_660f_map(bytes_iter, instruction) - }, - Some(OpcodeMap::MapF2) => { - read_opcode_f20f_map(bytes_iter, instruction) - }, - Some(OpcodeMap::MapF3) => { - read_opcode_f30f_map(bytes_iter, instruction) - }, - None => { - read_opcode_0f_map(bytes_iter, instruction) - } - }; - }, - 0x26 => { - instruction.prefixes.set_es(); - alternate_opcode_map = None; - }, - 0x2e => { - instruction.prefixes.set_cs(); - alternate_opcode_map = None; - }, - 0x36 => { - instruction.prefixes.set_ss(); - alternate_opcode_map = None; - }, - 0x3e => { - instruction.prefixes.set_ds(); - alternate_opcode_map = None; - }, - x if x < 0x50 => { - // x86_32 inc/dec - // x86_64 rex - instruction.prefixes.rex_mut().from(x); - }, - 0x64 => { - instruction.prefixes.set_fs(); - alternate_opcode_map = None; - }, - 0x65 => { - instruction.prefixes.set_gs(); - alternate_opcode_map = None; - }, - 0x66 => { - instruction.prefixes.set_operand_size(); - alternate_opcode_map = Some(OpcodeMap::Map66); - }, - 0x67 => { - instruction.prefixes.set_address_size(); - alternate_opcode_map = None; - }, - 0xf0 => { - instruction.prefixes.set_lock(); - }, - 0xf2 => { - instruction.prefixes.set_repnz(); - alternate_opcode_map = Some(OpcodeMap::MapF2); - }, - 0xf3 => { - instruction.prefixes.set_rep(); - alternate_opcode_map = Some(OpcodeMap::MapF3); - }, - _ => { unsafe { unreachable_unchecked(); } } - } - } - }, - None => { - return None; - } - } - } -} - #[allow(non_snake_case)] fn read_E<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruction, modrm: u8, width: u8, result: usize) -> Option<()> { let bank = width_to_gp_reg_bank(width, instr.prefixes.rex().present()); @@ -1801,17 +1744,16 @@ fn read_E_xmm<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruction, #[allow(non_snake_case)] fn read_E_anybank<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruction, modrm: u8, _width: u8, result: usize, reg_bank: RegisterBank) -> Option<()> { let modbits = (modrm >> 6); - let m = modrm & 7; let addr_width = if instr.prefixes.address_size() { 4 } else { 8 }; if modbits == 0b11 { - instr.operands[result] = Operand::Register(RegSpec::from_parts(m, instr.prefixes.rex().b(), reg_bank)) - } else if m == 5 && modbits == 0b00 { + instr.operands[result] = Operand::Register(RegSpec::from_parts(modrm & 7, instr.prefixes.rex().b(), reg_bank)) + } else if (modrm & 7) == 5 && modbits == 0b00 { let disp = read_num(bytes_iter, 4, &mut instr.length); instr.operands[result] = Operand::RegDisp( if addr_width == 8 { RegSpec::RIP() } else { RegSpec::EIP() }, disp as i32 ); - } else if m == 4 { + } else if (modrm & 7) == 4 { let sibbyte = match bytes_iter.next() { Some(b) => b, None => { return None; } //Err("Out of bytes".to_string()) @@ -1912,7 +1854,7 @@ fn read_E_anybank<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruct } } } else { - let reg = RegSpec::gp_from_parts(m, instr.prefixes.rex().b(), addr_width, instr.prefixes.rex().present()); + let reg = RegSpec::gp_from_parts(modrm & 7, instr.prefixes.rex().b(), addr_width, instr.prefixes.rex().present()); if modbits == 0b00 { instr.operands[result] = Operand::RegDeref(reg); @@ -1940,41 +1882,45 @@ fn width_to_gp_reg_bank(width: u8, rex: bool) -> RegisterBank { } } -pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut Instruction) -> Option<()> { +pub fn read_instr<T: Iterator<Item=u8>>(mut bytes_iter: T, instruction: &mut Instruction) -> Option<()> { let mut alternate_opcode_map: Option<OpcodeMap> = None; use std::hint::unreachable_unchecked; // use std::intrinsics::unlikely; instruction.prefixes = Prefixes::new(0); - let operand_code = loop { + let record: OpcodeRecord = loop { +// let operand_code = loop { match bytes_iter.next() { Some(b) => { instruction.length += 1; - let record = OPCODES[b as usize]; - if record.1 == Interpretation::Instruction { - instruction.opcode = record.0; - break record.2; + let record: u16 = (unsafe { std::mem::transmute::<&'static [OpcodeRecord], &'static [u16]>(&OPCODES[..]) })[b as usize]; + if let Interpretation::Instruction(opcode) = (unsafe { std::mem::transmute::<u16, OpcodeRecord>(record) }).0 { + instruction.opcode = opcode; + break unsafe { std::mem::transmute::<u16, OpcodeRecord>(record) }; } else { match b { + x if (x & 0xf0 == 0x40) => { + // x86_32 inc/dec + // x86_64 rex + instruction.prefixes.rex_mut().from(x); + }, 0x0f => { - let opc = match alternate_opcode_map { + if let Some(record) = match alternate_opcode_map { Some(OpcodeMap::Map66) => { - read_opcode_660f_map(bytes_iter, instruction) + read_opcode_660f_map(&mut bytes_iter, instruction) }, Some(OpcodeMap::MapF2) => { - read_opcode_f20f_map(bytes_iter, instruction) + read_opcode_f20f_map(&mut bytes_iter, instruction) }, Some(OpcodeMap::MapF3) => { - read_opcode_f30f_map(bytes_iter, instruction) + read_opcode_f30f_map(&mut bytes_iter, instruction) }, None => { - read_opcode_0f_map(bytes_iter, instruction) + read_opcode_0f_map(&mut bytes_iter, instruction) } - }; - match opc { - Some(o) => { - break o; - }, - None => { return None; } + } { + break record; + } else { + return None; } }, 0x26 => { @@ -1993,11 +1939,6 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In instruction.prefixes.set_ds(); alternate_opcode_map = None; }, - x if x < 0x50 => { - // x86_32 inc/dec - // x86_64 rex - instruction.prefixes.rex_mut().from(x); - }, 0x64 => { instruction.prefixes.set_fs(); alternate_opcode_map = None; @@ -2034,6 +1975,9 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } } }; + read_operands(bytes_iter, instruction, record.1) +} +pub fn read_operands<T: Iterator<Item=u8>>(mut bytes_iter: T, instruction: &mut Instruction, operand_code: OperandCode) -> Option<()> { match operand_code { /* Gv_Ev_Iv, @@ -2083,21 +2027,21 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In */ OperandCode::Eb_R0 => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); if (modrm & 0b00111000) != 0 { instruction.opcode = Opcode::Invalid; return None; // Err("Invalid modr/m for opcode 0xc6".to_owned()); } - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); }, OperandCode::AL_Ob => { let _addr_width = if instruction.prefixes.address_size() { 4 } else { 8 }; // stupid RCT thing: let addr_width = if instruction.prefixes.address_size() { 2 } else { 4 }; let opwidth = 1; - let imm = read_num(bytes_iter, addr_width, &mut instruction.length); + let imm = read_num(&mut bytes_iter, addr_width, &mut instruction.length); instruction.operands = [ Operand::Register(RegSpec::gp_from_parts(0, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), if instruction.prefixes.address_size() { @@ -2112,7 +2056,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In // stupid RCT thing: let addr_width = if instruction.prefixes.address_size() { 2 } else { 4 }; let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let imm = read_num(bytes_iter, addr_width, &mut instruction.length); + let imm = read_num(&mut bytes_iter, addr_width, &mut instruction.length); instruction.operands = [ Operand::Register(RegSpec::gp_from_parts(0, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), if instruction.prefixes.address_size() { @@ -2127,7 +2071,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In // stupid RCT thing: let addr_width = if instruction.prefixes.address_size() { 2 } else { 4 }; let opwidth = 1; - let imm = read_num(bytes_iter, addr_width, &mut instruction.length); + let imm = read_num(&mut bytes_iter, addr_width, &mut instruction.length); instruction.operands = [ if instruction.prefixes.address_size() { Operand::DisplacementU32(imm as u32) @@ -2142,7 +2086,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In // stupid RCT thing: let addr_width = if instruction.prefixes.address_size() { 2 } else { 4 }; let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let imm = read_num(bytes_iter, addr_width, &mut instruction.length); + let imm = read_num(&mut bytes_iter, addr_width, &mut instruction.length); instruction.operands = [ if instruction.prefixes.address_size() { Operand::DisplacementU32(imm as u32) @@ -2154,46 +2098,46 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } OperandCode::ModRM_0x80_Eb_Ib => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - let num = read_num(bytes_iter, 1, &mut instruction.length) as i8; + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let num = read_num(&mut bytes_iter, 1, &mut instruction.length) as i8; instruction.opcode = base_opcode_map((modrm >> 3) & 7); instruction.operands[1] = Operand::ImmediateI8(num); }, OperandCode::ModRM_0x81_Ev_Ivs => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - let imm = read_imm_signed(bytes_iter, if opwidth == 8 { 4 } else { opwidth }, opwidth, &mut instruction.length).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let imm = read_imm_signed(&mut bytes_iter, if opwidth == 8 { 4 } else { opwidth }, opwidth, &mut instruction.length).unwrap(); instruction.opcode = base_opcode_map((modrm >> 3) & 7); instruction.operands[1] = imm; }, OperandCode::ModRM_0xc0_Eb_Ib => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - let num = read_num(bytes_iter, 1, &mut instruction.length) as i8; + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let num = read_num(&mut bytes_iter, 1, &mut instruction.length) as i8; instruction.opcode = BITWISE_OPCODE_MAP[((modrm >> 3) & 7) as usize].clone(); instruction.operands[1] = Operand::ImmediateI8(num); }, OperandCode::ModRM_0xc1_Ev_Ib => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - let num = read_num(bytes_iter, 1, &mut instruction.length) as i8; + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let num = read_num(&mut bytes_iter, 1, &mut instruction.length) as i8; instruction.opcode = BITWISE_OPCODE_MAP[((modrm >> 3) & 7) as usize].clone(); instruction.operands[1] = Operand::ImmediateI8(num); }, OperandCode::ModRM_0xc6_Eb_Ib => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - let num = read_num(bytes_iter, 1, &mut instruction.length) as i8; + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let num = read_num(&mut bytes_iter, 1, &mut instruction.length) as i8; if (modrm & 0b00111000) != 0 { instruction.opcode = Opcode::Invalid; return None; // Err("Invalid modr/m for opcode 0xc6".to_owned()); @@ -2203,41 +2147,41 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In }, OperandCode::ModRM_0xc7_Ev_Iv => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); if (modrm & 0b00111000) != 0 { instruction.opcode = Opcode::Invalid; return None; // Err("Invalid modr/m for opcode 0xc7".to_string()); } - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.opcode = Opcode::MOV; - instruction.operands[1] = read_imm_unsigned(bytes_iter, opwidth, &mut instruction.length).unwrap(); + instruction.operands[1] = read_imm_unsigned(&mut bytes_iter, opwidth, &mut instruction.length).unwrap(); }, OperandCode::ModRM_0xd0_Eb_1 => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.opcode = BITWISE_OPCODE_MAP[((modrm >> 3) & 7) as usize].clone(); instruction.operands[1] = Operand::ImmediateI8(1); }, OperandCode::ModRM_0xd1_Ev_1 => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.opcode = BITWISE_OPCODE_MAP[((modrm >> 3) & 7) as usize].clone(); instruction.operands[1] = Operand::ImmediateI8(1); }, OperandCode::ModRM_0xf6 => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); match (modrm >> 3) & 7 { 0 | 1 => { instruction.opcode = Opcode::TEST; - instruction.operands[1] = read_imm_signed(bytes_iter, 1, opwidth, &mut instruction.length).unwrap(); + instruction.operands[1] = read_imm_signed(&mut bytes_iter, 1, opwidth, &mut instruction.length).unwrap(); }, 2 => { instruction.opcode = Opcode::NOT; @@ -2264,13 +2208,13 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In }, OperandCode::ModRM_0xf7 => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); match ((modrm >> 3) & 7) { 0 | 1 => { instruction.opcode = Opcode::TEST; let numwidth = if opwidth == 8 { 4 } else { opwidth }; - instruction.operands[1] = read_imm_signed(bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap(); + instruction.operands[1] = read_imm_signed(&mut bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap(); }, 2 => { instruction.opcode = Opcode::NOT; @@ -2297,9 +2241,9 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In }, OperandCode::ModRM_0xfe_Eb => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.opcode = [ Opcode::INC, Opcode::DEC, @@ -2314,9 +2258,9 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } OperandCode::ModRM_0xff_Ev => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); let opcode = [ Opcode::INC, Opcode::DEC, @@ -2332,54 +2276,54 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } OperandCode::Ev => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.operands[1] = Operand::Nothing; }, OperandCode::Eb_Gb => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.operands[1] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Ev_Gv => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.operands[1] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Gb_Eb => { let opwidth = 1; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Gv_Eb => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Gv_Ew => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); - read_E(bytes_iter, instruction, modrm, 2, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, 2, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Ew_Sw => { let opwidth = 2; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // check r if ((modrm >> 3) & 7) > 5 { @@ -2394,12 +2338,12 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In instruction.operands[0] = Operand::Register(RegSpec { bank: RegisterBank::W, num: modrm & 7}); } else { - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } }, OperandCode::Sw_Ew => { let opwidth = 2; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // check r if ((modrm >> 3) & 7) > 5 { @@ -2414,52 +2358,100 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In instruction.operands[1] = Operand::Register(RegSpec { bank: RegisterBank::W, num: modrm & 7}); } else { - read_E(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); } }, // TODO: verify M OperandCode::Gv_Ed => { let opwidth = 4; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // println!("mod_bits: {:2b}, r: {:3b}, m: {:3b}", mod_bits, r, m); - read_E(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::Gv_Ev | OperandCode::Gv_M => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // println!("mod_bits: {:2b}, r: {:3b}, m: {:3b}", mod_bits, r, m); - read_E(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::gp_from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), opwidth, instruction.prefixes.rex().present())); }, OperandCode::E_G_xmm => { let opwidth = 8; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // println!("mod_bits: {:2b}, r: {:3b}, m: {:3b}", mod_bits, r, m); - read_E_xmm(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E_xmm(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.operands[1] = Operand::Register(RegSpec::from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), RegisterBank::X)); }, OperandCode::G_E_xmm => { let opwidth = 8; - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); // println!("mod_bits: {:2b}, r: {:3b}, m: {:3b}", mod_bits, r, m); - read_E_xmm(bytes_iter, instruction, modrm, opwidth, 1).unwrap(); + read_E_xmm(&mut bytes_iter, instruction, modrm, opwidth, 1).unwrap(); instruction.operands[0] = Operand::Register(RegSpec::from_parts((modrm >> 3) & 7, instruction.prefixes.rex().r(), RegisterBank::X)); }, - OperandCode::Zv_Ivq(opcode_byte) => { + OperandCode::Zv_Ivq_R0 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(0, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R1 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(1, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R2 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(2, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R3 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(3, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R4 => { let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - let reg_idx = opcode_byte & 0x7; instruction.operands = [ - Operand::Register(RegSpec::gp_from_parts(reg_idx, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), - read_imm_ivq(bytes_iter, opwidth, &mut instruction.length).unwrap() + Operand::Register(RegSpec::gp_from_parts(4, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R5 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(5, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R6 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(6, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zv_Ivq_R7 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(7, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present())), + read_imm_ivq(&mut bytes_iter, opwidth, &mut instruction.length).unwrap() ]; }, OperandCode::AL_Ib => { @@ -2467,7 +2459,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In let numwidth = 1; instruction.operands = [ Operand::Register(RegSpec::al()), - read_imm_signed(bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap() + read_imm_signed(&mut bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap() ]; } OperandCode::AX_Ivd => { @@ -2475,64 +2467,161 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In let numwidth = if opwidth == 8 { 4 } else { opwidth }; instruction.operands = [ Operand::Register(RegSpec::gp_from_parts(0, false, opwidth, false)), - read_imm_signed(bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap() + read_imm_signed(&mut bytes_iter, numwidth, opwidth, &mut instruction.length).unwrap() ]; } - OperandCode::Zb_Ib(opcode_byte) => { - let reg_idx = opcode_byte & 0x7; + OperandCode::Zb_Ib_R0 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(0, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R1 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(1, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R2 => { instruction.operands = [ - Operand::Register(RegSpec::gp_from_parts(reg_idx, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), - read_imm_unsigned(bytes_iter, 1, &mut instruction.length).unwrap() + Operand::Register(RegSpec::gp_from_parts(2, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R3 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(3, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R4 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(4, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R5 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(5, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R6 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(6, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() + ]; + }, + OperandCode::Zb_Ib_R7 => { + instruction.operands = [ + Operand::Register(RegSpec::gp_from_parts(7, instruction.prefixes.rex().b(), 1, instruction.prefixes.rex().present())), + read_imm_unsigned(&mut bytes_iter, 1, &mut instruction.length).unwrap() ]; }, OperandCode::Iw => { instruction.operands = [ - read_imm_unsigned(bytes_iter, 2, &mut instruction.length).unwrap(), + read_imm_unsigned(&mut bytes_iter, 2, &mut instruction.length).unwrap(), Operand::Nothing ]; } OperandCode::Jbs => { // TODO: arch width (8 in 64, 4 in 32, 2 in 16) instruction.operands = [ - read_imm_signed(bytes_iter, 1, 8, &mut instruction.length).unwrap(), + read_imm_signed(&mut bytes_iter, 1, 8, &mut instruction.length).unwrap(), Operand::Nothing ]; }, OperandCode::Ibs => { instruction.operands = [ - read_imm_signed(bytes_iter, 1, 8, &mut instruction.length).unwrap(), + read_imm_signed(&mut bytes_iter, 1, 8, &mut instruction.length).unwrap(), Operand::Nothing ]; }, OperandCode::Ivs => { let opwidth = imm_width_from_prefixes_64(SizeCode::vd, &instruction.prefixes); instruction.operands = [ - read_imm_unsigned(bytes_iter, opwidth, &mut instruction.length).unwrap(), + read_imm_unsigned(&mut bytes_iter, opwidth, &mut instruction.length).unwrap(), Operand::Nothing ]; }, OperandCode::ModRM_0x83_Ev_Ibs => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let opwidth = imm_width_from_prefixes_64(SizeCode::vqp, &instruction.prefixes); - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); instruction.opcode = base_opcode_map((modrm >> 3) & 7); - instruction.operands[1] = read_imm_signed(bytes_iter, 1, opwidth, &mut instruction.length).unwrap(); + instruction.operands[1] = read_imm_signed(&mut bytes_iter, 1, opwidth, &mut instruction.length).unwrap(); + }, + OperandCode::Zv_R0 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 0, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R1 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 1, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R2 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 2, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R3 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 3, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R4 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 4, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R5 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 5, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; + }, + OperandCode::Zv_R6 => { + let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); + instruction.operands = [Operand::Register( + RegSpec::gp_from_parts( + 6, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + ) + ), Operand::Nothing]; }, - OperandCode::Zv(opcode_byte) => { + OperandCode::Zv_R7 => { let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); instruction.operands = [Operand::Register( RegSpec::gp_from_parts( - opcode_byte & 0b111, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() + 7, instruction.prefixes.rex().b(), opwidth, instruction.prefixes.rex().present() ) ), Operand::Nothing]; }, OperandCode::Jvds => { - let offset = read_num(bytes_iter, 4, &mut instruction.length); + let offset = read_num(&mut bytes_iter, 4, &mut instruction.length); instruction.operands = [Operand::ImmediateI32(offset as i32), Operand::Nothing]; } OperandCode::ModRM_0x0f00 => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let r = (modrm >> 3) & 7; if r == 0 { instruction.opcode = Opcode::SLDT; @@ -2563,11 +2652,11 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { unreachable!("r <= 8"); } - read_E(bytes_iter, instruction, modrm, 2, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, 2, 0).unwrap(); } OperandCode::ModRM_0x0f01 => { let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let r = (modrm >> 3) & 7; if r == 0 { let mod_bits = modrm >> 6; @@ -2577,7 +2666,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { instruction.opcode = Opcode::SGDT; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } } else if r == 1 { let mod_bits = modrm >> 6; @@ -2589,7 +2678,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { instruction.opcode = Opcode::SIDT; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } } else if r == 2 { let mod_bits = modrm >> 6; @@ -2601,7 +2690,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { instruction.opcode = Opcode::LGDT; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } } else if r == 3 { let mod_bits = modrm >> 6; @@ -2613,20 +2702,20 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { instruction.opcode = Opcode::LIDT; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } } else if r == 4 { // TODO: this permits storing only to word-size registers // spec suggets this might do something different for f.ex rdi.unwrap() instruction.opcode = Opcode::SMSW; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, 2, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, 2, 0).unwrap(); } else if r == 5 { panic!("Unsupported instruction: 0x0f01 with modrm: __ 101 ___"); } else if r == 6 { instruction.opcode = Opcode::LMSW; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, 2, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, 2, 0).unwrap(); } else if r == 7 { let mod_bits = modrm >> 6; let m = modrm & 7; @@ -2644,14 +2733,14 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } else { instruction.opcode = Opcode::INVLPG; instruction.operands[1] = Operand::Nothing; - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); } } else { unreachable!("r <= 8"); } } OperandCode::ModRM_0x0fae => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let r = (modrm >> 3) & 7; let mod_bits = modrm >> 6; match r { @@ -2728,11 +2817,11 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } _ => { unreachable!("r < 6"); } } - read_E(bytes_iter, instruction, modrm, 8, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, 8, 0).unwrap(); } OperandCode::ModRM_0x0fba => { let opwidth = imm_width_from_prefixes_64(SizeCode::vq, &instruction.prefixes); - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let r = (modrm >> 3) & 7; match r { 0 | 1 | 2 | 3 => { @@ -2756,13 +2845,13 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In } } - read_E(bytes_iter, instruction, modrm, opwidth, 0).unwrap(); + read_E(&mut bytes_iter, instruction, modrm, opwidth, 0).unwrap(); - instruction.operands[1] = read_imm_signed(bytes_iter, 1, 1, &mut instruction.length).unwrap(); + instruction.operands[1] = read_imm_signed(&mut bytes_iter, 1, 1, &mut instruction.length).unwrap(); } OperandCode::Rq_Cq_0 => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let mut m = modrm & 7; let mut r = (modrm >> 3) & 7; if instruction.prefixes.rex().r() { @@ -2777,7 +2866,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In ]; } OperandCode::Rq_Dq_0 => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let mut m = modrm & 7; let mut r = (modrm >> 3) & 7; if instruction.prefixes.rex().r() { @@ -2792,7 +2881,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In ]; } OperandCode::Cq_Rq_0 => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let mut m = modrm & 7; let mut r = (modrm >> 3) & 7; if instruction.prefixes.rex().r() { @@ -2807,7 +2896,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In ]; } OperandCode::Dq_Rq_0 => { - let modrm = read_modrm(bytes_iter, &mut instruction.length).unwrap(); + let modrm = read_modrm(&mut bytes_iter, &mut instruction.length).unwrap(); let mut m = modrm & 7; let mut r = (modrm >> 3) & 7; if instruction.prefixes.rex().r() { @@ -2848,7 +2937,7 @@ pub fn read_instr<T: Iterator<Item=u8>>(bytes_iter: &mut T, instruction: &mut In pub fn decode_one<'b, T: IntoIterator<Item=u8>>(bytes: T, instr: &'b mut Instruction) -> Option<()> { let mut bytes_iter = bytes.into_iter(); instr.length = 0; - read_instr(&mut bytes_iter, instr) + read_instr(bytes_iter, instr) } /* match read_opcode(&mut bytes_iter, instr) { |