osom_encoders_x86_64/models/
immediates.rs

1#![allow(clippy::cast_sign_loss, clippy::cast_possible_wrap)]
2
3/// Represents an 8-bit immediate value.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[repr(transparent)]
6#[must_use]
7pub struct Immediate8 {
8    value: u8,
9}
10
11impl Immediate8 {
12    #[inline(always)]
13    pub const fn from_u8(value: u8) -> Self {
14        Self { value }
15    }
16
17    #[inline(always)]
18    pub const fn from_i8(value: i8) -> Self {
19        Self { value: value as u8 }
20    }
21
22    #[inline(always)]
23    #[must_use]
24    pub const fn value(&self) -> u8 {
25        self.value
26    }
27
28    #[inline(always)]
29    #[must_use]
30    pub const fn encode(self) -> [u8; 1] {
31        [self.value]
32    }
33}
34
35/// Represents a 16-bit immediate value.
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
37#[repr(transparent)]
38#[must_use]
39pub struct Immediate16 {
40    value: u16,
41}
42
43impl Immediate16 {
44    #[inline(always)]
45    pub const fn from_imm8_zero_extended(value: Immediate8) -> Self {
46        Self::from_u16(value.value() as u16)
47    }
48
49    #[inline(always)]
50    pub const fn from_imm8_sign_extended(value: Immediate8) -> Self {
51        Self::from_i16(value.value() as i8 as i16)
52    }
53
54    #[inline(always)]
55    pub const fn from_u16(value: u16) -> Self {
56        Self { value }
57    }
58
59    #[inline(always)]
60    pub const fn from_i16(value: i16) -> Self {
61        Self { value: value as u16 }
62    }
63
64    #[inline(always)]
65    #[must_use]
66    pub const fn value(&self) -> u16 {
67        self.value
68    }
69
70    #[inline(always)]
71    #[must_use]
72    pub const fn encode(self) -> [u8; 2] {
73        self.value.to_le_bytes()
74    }
75}
76
77/// Represents a 32-bit immediate value.
78#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
79#[repr(transparent)]
80#[must_use]
81pub struct Immediate32 {
82    value: u32,
83}
84
85impl Immediate32 {
86    #[inline(always)]
87    pub const fn from_imm8_zero_extended(value: Immediate8) -> Self {
88        Self::from_u32(value.value() as u32)
89    }
90
91    #[inline(always)]
92    pub const fn from_imm8_sign_extended(value: Immediate8) -> Self {
93        Self::from_i32(value.value() as i8 as i32)
94    }
95
96    #[inline(always)]
97    pub const fn from_imm16_zero_extended(value: Immediate16) -> Self {
98        Self::from_u32(value.value() as u32)
99    }
100
101    #[inline(always)]
102    pub const fn from_imm16_sign_extended(value: Immediate16) -> Self {
103        Self::from_i32(value.value() as i16 as i32)
104    }
105
106    #[inline(always)]
107    pub const fn from_u32(value: u32) -> Self {
108        Self { value }
109    }
110
111    #[inline(always)]
112    pub const fn from_i32(value: i32) -> Self {
113        Self { value: value as u32 }
114    }
115
116    #[inline(always)]
117    #[must_use]
118    pub const fn value(&self) -> u32 {
119        self.value
120    }
121
122    #[inline(always)]
123    #[must_use]
124    pub const fn encode(self) -> [u8; 4] {
125        self.value.to_le_bytes()
126    }
127}
128
129/// Represents a 64-bit immediate value.
130#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
131#[repr(transparent)]
132#[must_use]
133pub struct Immediate64 {
134    value: u64,
135}
136
137impl Immediate64 {
138    #[inline(always)]
139    pub const fn from_imm8_zero_extended(value: Immediate8) -> Self {
140        Self::from_u64(value.value() as u64)
141    }
142
143    #[inline(always)]
144    pub const fn from_imm8_sign_extended(value: Immediate8) -> Self {
145        Self::from_i64(value.value() as i8 as i64)
146    }
147
148    #[inline(always)]
149    pub const fn from_imm16_zero_extended(value: Immediate16) -> Self {
150        Self::from_u64(value.value() as u64)
151    }
152
153    #[inline(always)]
154    pub const fn from_imm16_sign_extended(value: Immediate16) -> Self {
155        Self::from_i64(value.value() as i16 as i64)
156    }
157
158    #[inline(always)]
159    pub const fn from_imm32_zero_extended(value: Immediate32) -> Self {
160        Self::from_u64(value.value() as u64)
161    }
162
163    #[inline(always)]
164    pub const fn from_imm32_sign_extended(value: Immediate32) -> Self {
165        Self::from_i64(value.value() as i32 as i64)
166    }
167
168    #[inline(always)]
169    pub const fn from_u64(value: u64) -> Self {
170        Self { value }
171    }
172
173    #[inline(always)]
174    pub const fn from_i64(value: i64) -> Self {
175        Self { value: value as u64 }
176    }
177
178    #[inline(always)]
179    #[must_use]
180    pub const fn value(&self) -> u64 {
181        self.value
182    }
183
184    #[inline(always)]
185    #[must_use]
186    pub const fn encode(self) -> [u8; 8] {
187        self.value.to_le_bytes()
188    }
189}