Skip to main content

osom_encoders_x86_64/models/
offset.rs

1use super::{Immediate8, Immediate32};
2
3/// Represents the offset for a memory operand.
4///
5/// # Values
6///
7/// - `None` - No offset.
8/// - `Bit8` - 8-bit signed immediate offset.
9/// - `Bit32` - 32-bit signed immediate offset.
10///
11/// # Notes
12///
13/// The offset is always understood as signed integer.
14#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy)]
15#[repr(u8)]
16#[must_use]
17pub enum Offset {
18    /// No offset is specified.
19    None = 0,
20
21    /// 8-bit signed immediate offset.
22    Bit8(Immediate8) = 1,
23
24    /// 32-bit signed immediate offset.
25    Bit32(Immediate32) = 2,
26}
27
28impl Offset {
29    /// Converts the offset to a 32-bit signed immediate value.
30    ///
31    /// # Returns
32    ///
33    /// * `0` if offset is `None`.
34    /// * `Immediate32::from_imm8_sign_extended(offset)` if offset is `Bit8`.
35    /// * `offset` if offset is `Bit32`.
36    #[inline(always)]
37    pub(crate) const fn to_sign_extended_imm32(self) -> Immediate32 {
38        match self {
39            Self::None => Immediate32::from_u32(0),
40            Self::Bit8(imm8) => Immediate32::from_imm8_sign_extended(imm8),
41            Self::Bit32(imm32) => imm32,
42        }
43    }
44
45    /// Creates a new [`Offset`] out of raw `i8`.
46    #[inline]
47    pub const fn from_i8(value: i8) -> Self {
48        Self::Bit8(Immediate8::from_i8(value))
49    }
50
51    /// Creates a new [`Offset`] out of raw `u8`.
52    #[inline]
53    pub const fn from_u8(value: u8) -> Self {
54        Self::Bit8(Immediate8::from_u8(value))
55    }
56
57    /// Creates a new [`Offset`] out of raw `i32`.
58    #[inline]
59    pub const fn from_i32(value: i32) -> Self {
60        Self::Bit32(Immediate32::from_i32(value))
61    }
62
63    /// Creates a new [`Offset`] out of raw `u32`.
64    #[inline]
65    pub const fn from_u32(value: u32) -> Self {
66        Self::Bit32(Immediate32::from_u32(value))
67    }
68}
69
70impl From<Immediate32> for Offset {
71    fn from(value: Immediate32) -> Self {
72        Self::Bit32(value)
73    }
74}
75
76impl From<Immediate8> for Offset {
77    fn from(value: Immediate8) -> Self {
78        Self::Bit8(value)
79    }
80}
81
82impl From<i32> for Offset {
83    fn from(value: i32) -> Self {
84        Self::Bit32(value.into())
85    }
86}
87
88impl From<i8> for Offset {
89    fn from(value: i8) -> Self {
90        Self::Bit8(value.into())
91    }
92}