aboutsummaryrefslogtreecommitdiff
path: root/src/long_mode
diff options
context:
space:
mode:
Diffstat (limited to 'src/long_mode')
-rw-r--r--src/long_mode/mod.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs
index 3319141..05eee0a 100644
--- a/src/long_mode/mod.rs
+++ b/src/long_mode/mod.rs
@@ -179,6 +179,21 @@ impl RegSpec {
}
#[inline]
+ pub fn ecx() -> RegSpec {
+ RegSpec { bank: RegisterBank::D, num: 1 }
+ }
+
+ #[inline]
+ pub fn edx() -> RegSpec {
+ RegSpec { bank: RegisterBank::D, num: 2 }
+ }
+
+ #[inline]
+ pub fn ebx() -> RegSpec {
+ RegSpec { bank: RegisterBank::D, num: 3 }
+ }
+
+ #[inline]
pub fn ax() -> RegSpec {
RegSpec { bank: RegisterBank::W, num: 0 }
}
@@ -197,6 +212,66 @@ impl RegSpec {
pub fn cl() -> RegSpec {
RegSpec { bank: RegisterBank::B, num: 1 }
}
+
+ #[inline]
+ pub fn ah() -> RegSpec {
+ RegSpec { bank: RegisterBank::B, num: 4 }
+ }
+
+ #[inline]
+ pub fn ch() -> RegSpec {
+ RegSpec { bank: RegisterBank::B, num: 5 }
+ }
+
+ #[inline]
+ pub fn width(&self) -> u8 {
+ match self.bank {
+ RegisterBank::Q => 8,
+ RegisterBank::D => 4,
+ RegisterBank::W => 2,
+ RegisterBank::B |
+ RegisterBank::rB => {
+ 1
+ },
+ RegisterBank::CR |
+ RegisterBank::DR => {
+ 8
+ },
+ RegisterBank::S => {
+ 2
+ },
+ RegisterBank::EIP => {
+ 4
+ }
+ RegisterBank::RIP => {
+ 8
+ }
+ RegisterBank::EFlags => {
+ 4
+ }
+ RegisterBank::RFlags => {
+ 8
+ }
+ RegisterBank::X => {
+ 16
+ }
+ RegisterBank::Y => {
+ 32
+ }
+ RegisterBank::Z => {
+ 64
+ }
+ RegisterBank::ST => {
+ 10
+ }
+ RegisterBank::MM => {
+ 8
+ }
+ RegisterBank::K => {
+ 8
+ }
+ }
+ }
}
#[allow(non_camel_case_types)]
@@ -361,6 +436,37 @@ impl Operand {
}
}
}
+
+ pub fn width(&self) -> u8 {
+ match self {
+ Operand::Nothing => {
+ panic!("non-operand does not have a size");
+ }
+ Operand::Register(reg) => {
+ reg.width()
+ }
+ Operand::ImmediateI8(_) |
+ Operand::ImmediateU8(_) => {
+ 1
+ }
+ Operand::ImmediateI16(_) |
+ Operand::ImmediateU16(_) => {
+ 2
+ }
+ Operand::ImmediateI32(_) |
+ Operand::ImmediateU32(_) => {
+ 4
+ }
+ Operand::ImmediateI64(_) |
+ Operand::ImmediateU64(_) => {
+ 8
+ }
+ // memory operands
+ _ => {
+ 8
+ }
+ }
+ }
}
#[test]