diff options
Diffstat (limited to 'src/long_mode')
-rw-r--r-- | src/long_mode/evex.rs | 2 | ||||
-rw-r--r-- | src/long_mode/mod.rs | 21 |
2 files changed, 19 insertions, 4 deletions
diff --git a/src/long_mode/evex.rs b/src/long_mode/evex.rs index da90d29..adfd014 100644 --- a/src/long_mode/evex.rs +++ b/src/long_mode/evex.rs @@ -1,6 +1,6 @@ // use crate::long_mode::{OperandSpec, DecodeError, RegSpec, RegisterBank, Instruction, Opcode}; use crate::long_mode::{DecodeError, RegSpec, RegisterBank, Instruction, Opcode}; -use crate::long_mode::{read_modrm, read_E_xmm, read_E_ymm, read_E_zmm, read_imm_unsigned}; +use crate::long_mode::{read_modrm, read_E_vex, read_imm_unsigned}; include!("../shared/generated_evex.in"); include!("../shared/evex.in"); diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs index 60a18c5..e0dff7c 100644 --- a/src/long_mode/mod.rs +++ b/src/long_mode/mod.rs @@ -4317,6 +4317,8 @@ impl PrefixVex { fn w(&self) -> bool { (self.bits & 0x08) == 0x08 } #[inline] fn l(&self) -> bool { (self.bits & 0x10) == 0x10 } + #[inline] + fn compressed_disp(&self) -> bool { (self.bits & 0x20) == 0x20 } } #[derive(Debug, Copy, Clone)] @@ -4403,6 +4405,15 @@ impl Prefixes { } #[inline] + fn apply_compressed_disp(&mut self, state: bool) { + if state { + self.rex.bits |= 0x20; + } else { + self.rex.bits &= 0xdf; + } + } + + #[inline] fn rex_from(&mut self, bits: u8) { self.rex.bits = bits; } @@ -5427,11 +5438,15 @@ pub(self) fn read_E_ymm<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut In } } #[allow(non_snake_case)] -pub(self) fn read_E_zmm<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruction, modrm: u8, length: &mut u8) -> Result<OperandSpec, DecodeError> { +pub(self) fn read_E_vex<T: Iterator<Item=u8>>(bytes_iter: &mut T, instr: &mut Instruction, modrm: u8, length: &mut u8, bank: RegisterBank) -> Result<OperandSpec, DecodeError> { if modrm >= 0b11000000 { - read_modrm_reg(instr, modrm, RegisterBank::Z) + read_modrm_reg(instr, modrm, bank) } else { - read_M(bytes_iter, instr, modrm, length) + let res = read_M(bytes_iter, instr, modrm, length)?; + if (modrm & 0b01_000_000) == 0b01_000_000 { + instr.prefixes.apply_compressed_disp(true); + } + Ok(res) } } |