osom_encoders_x86_64/models/
immediates.rs1#![allow(clippy::cast_sign_loss, clippy::cast_possible_wrap)]
2
3#[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#[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#[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#[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}