aboutsummaryrefslogtreecommitdiff
path: root/src/protected_mode/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/protected_mode/mod.rs')
-rw-r--r--src/protected_mode/mod.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/protected_mode/mod.rs b/src/protected_mode/mod.rs
index 6f052c6..0df8cee 100644
--- a/src/protected_mode/mod.rs
+++ b/src/protected_mode/mod.rs
@@ -409,6 +409,9 @@ impl OperandSpec {
fn is_memory(&self) -> bool {
(*self as u8) & 0x80 != 0
}
+ fn is_masked(&self) -> bool {
+ (*self as u8) & 0x40 != 0
+ }
}
/// an `avx512` merging mode.
///
@@ -6445,8 +6448,15 @@ fn read_operands<
instruction.mem_size = 4;
} else if instruction.opcode == Opcode::RETF {
instruction.mem_size = 6;
+ } else if instruction.opcode == Opcode::POPF {
+ instruction.mem_size = 4;
+ } else if instruction.opcode == Opcode::PUSHF {
+ instruction.mem_size = 4;
+ } else if instruction.opcode == Opcode::LEAVE {
+ instruction.mem_size = 4;
+ } else if instruction.opcode == Opcode::XLAT {
+ instruction.mem_size = 1;
}
- // TODO: leave?
instruction.operands[0] = OperandSpec::Nothing;
instruction.operand_count = 0;
return Ok(());
@@ -6993,6 +7003,8 @@ fn read_operands<
instruction.imm = read_num(words, 1)? as u32;
instruction.operands[0] = OperandSpec::ImmInDispField;
instruction.operands[1] = OperandSpec::ImmU8;
+ // because there is an implied push of the adjusted base pointer
+ instruction.mem_size = 4;
instruction.operand_count = 2;
}
OperandCase::Fw => {