aboutsummaryrefslogtreecommitdiff
path: root/src/long_mode
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2021-08-13 23:44:28 -0700
committeriximeow <me@iximeow.net>2021-08-21 19:08:40 -0700
commita07098315bea8b880688831f931bc5213ebb6a5f (patch)
tree67b134241aefde7919091c51e97bbc6b0f6c62b1 /src/long_mode
parent9cb6967f484553d78f75113ad534a34960184db8 (diff)
extend annotation reporting to 32- and 16-bit modes, kinda
Diffstat (limited to 'src/long_mode')
-rw-r--r--src/long_mode/mod.rs9
-rw-r--r--src/long_mode/vex.rs12
2 files changed, 16 insertions, 5 deletions
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs
index 25a1735..54d83e8 100644
--- a/src/long_mode/mod.rs
+++ b/src/long_mode/mod.rs
@@ -7462,6 +7462,9 @@ impl yaxpeax_arch::FieldDescription for FieldDescription {
fn id(&self) -> u32 {
self.id
}
+ fn is_separator(&self) -> bool {
+ false
+ }
}
impl fmt::Display for FieldDescription {
@@ -7547,7 +7550,7 @@ fn read_with_annotations<
return Err(DecodeError::InvalidPrefixes);
} else {
instruction.prefixes = prefixes;
- vex::two_byte_vex(words, instruction)?;
+ vex::two_byte_vex(words, instruction, sink)?;
return Ok(());
}
} else if b == 0xc4 {
@@ -7556,7 +7559,7 @@ fn read_with_annotations<
return Err(DecodeError::InvalidPrefixes);
} else {
instruction.prefixes = prefixes;
- vex::three_byte_vex(words, instruction)?;
+ vex::three_byte_vex(words, instruction, sink)?;
return Ok(());
}
} else if b == 0x62 {
@@ -7565,7 +7568,7 @@ fn read_with_annotations<
return Err(DecodeError::InvalidPrefixes);
} else {
instruction.prefixes = prefixes;
- evex::read_evex(words, instruction, None)?;
+ evex::read_evex(words, instruction, None, sink)?;
return Ok(());
}
}
diff --git a/src/long_mode/vex.rs b/src/long_mode/vex.rs
index 9649e72..893d624 100644
--- a/src/long_mode/vex.rs
+++ b/src/long_mode/vex.rs
@@ -1,8 +1,10 @@
use yaxpeax_arch::Reader;
+use yaxpeax_arch::DescriptionSink;
use crate::long_mode::Arch;
use crate::long_mode::OperandSpec;
use crate::long_mode::DecodeError;
+use crate::long_mode::FieldDescription;
use crate::long_mode::RegSpec;
use crate::long_mode::RegisterBank;
use crate::long_mode::Instruction;
@@ -100,7 +102,10 @@ enum VEXOperandCode {
}
#[inline(never)]
-pub(crate) fn three_byte_vex<T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>>(words: &mut T, instruction: &mut Instruction) -> Result<(), DecodeError> {
+pub(crate) fn three_byte_vex<
+ T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,
+ S: DescriptionSink<FieldDescription>,
+>(words: &mut T, instruction: &mut Instruction, sink: &mut S) -> Result<(), DecodeError> {
let vex_byte_one = words.next().ok().ok_or(DecodeError::ExhaustedInput)?;
let vex_byte_two = words.next().ok().ok_or(DecodeError::ExhaustedInput)?;
let p = vex_byte_two & 0x03;
@@ -130,7 +135,10 @@ pub(crate) fn three_byte_vex<T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <A
read_vex_instruction(m, words, instruction, p)
}
-pub(crate) fn two_byte_vex<T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>>(words: &mut T, instruction: &mut Instruction) -> Result<(), DecodeError> {
+pub(crate) fn two_byte_vex<
+ T: Reader<<Arch as yaxpeax_arch::Arch>::Address, <Arch as yaxpeax_arch::Arch>::Word>,
+ S: DescriptionSink<FieldDescription>,
+>(words: &mut T, instruction: &mut Instruction, sink: &mut S) -> Result<(), DecodeError> {
let vex_byte = words.next().ok().ok_or(DecodeError::ExhaustedInput)?;
let p = vex_byte & 0x03;
let p = match p {