diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/long_mode/display.rs | 7 | ||||
-rw-r--r-- | src/long_mode/mod.rs | 28 |
2 files changed, 15 insertions, 20 deletions
diff --git a/src/long_mode/display.rs b/src/long_mode/display.rs index 9ba128d..4b799f2 100644 --- a/src/long_mode/display.rs +++ b/src/long_mode/display.rs @@ -105,11 +105,12 @@ impl fmt::Display for Segment { // register names are grouped by indices scaled by 16. // xmm, ymm, zmm all get two indices. const REG_NAMES: &[&'static str] = &[ - "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d", + "", "", "", "", "", "", "", "", + "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w", - "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", "", "", "", "", "", "", "", "", + "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d", "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b", + "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", "cr15", "dr0", "dr1", "dr2", "dr3", "dr4", "dr5", "dr6", "dr7", "dr8", "dr9", "dr10", "dr11", "dr12", "dr13", "dr14", "dr15", "es", "cs", "ss", "ds", "fs", "gs", "", "", diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 723b669..34f1d34 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -956,9 +956,9 @@ impl RegisterClass { /// return the size of this register class, in bytes pub fn width(&self) -> u8 { match self.kind { - RegisterBank::Q => 8, - RegisterBank::D => 4, - RegisterBank::W => 2, + RegisterBank::Q => self.kind as u8, + RegisterBank::D => self.kind as u8, + RegisterBank::W => self.kind as u8, RegisterBank::B | RegisterBank::rB => { 1 @@ -1008,7 +1008,7 @@ impl RegisterClass { #[cfg_attr(feature="use-serde", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] enum RegisterBank { - Q = 0, D = 2, W = 4, B = 6, rB = 8, // Quadword, Dword, Word, Byte + Q = 8, D = 4, W = 2, B = 1, rB = 6, // Quadword, Dword, Word, Byte CR = 10, DR = 12, S = 14, EIP = 30, RIP = 31, EFlags = 32, RFlags = 33, // Control reg, Debug reg, Selector, ... X = 15, Y = 19, Z = 23, // XMM, YMM, ZMM ST = 27, MM = 28, // ST, MM regs (x87, mmx) @@ -6135,18 +6135,11 @@ fn read_M< #[inline] fn width_to_gp_reg_bank(width: u8, rex: bool) -> RegisterBank { - // transform (width, rex) into an index into an index into a LUT, instead of branching as - // `match` would. - let index = (width.trailing_zeros() << 1) | (rex as u32); - - const BANK_LUT: [RegisterBank; 8] = [ - RegisterBank::B, RegisterBank::rB, - RegisterBank::W, RegisterBank::W, - RegisterBank::D, RegisterBank::D, - RegisterBank::Q, RegisterBank::Q, - ]; - - *BANK_LUT.get(index as usize).unwrap_or_else(|| unsafe { unreachable_unchecked() }) + if width == 1 && rex { + RegisterBank::rB + } else { + unsafe { std::mem::transmute::<u8, RegisterBank>(width) } + } } #[inline(always)] @@ -6578,8 +6571,9 @@ fn read_with_annotations< let mut next_rec = OPCODES[nextb as usize]; instruction.prefixes = Prefixes::new(0); + const RAXRAXRAXRAX: [RegSpec; 4] = [RegSpec::rax(); 4]; // default x86_64 registers to `[rax; 4]` - instruction.regs = unsafe { core::mem::transmute(0u64) }; + instruction.regs = RAXRAXRAXRAX; // default operands to [RegRRR, Nothing, Nothing, Nothing] instruction.operands = unsafe { core::mem::transmute(0x00_00_00_01) }; |