Skip to main content

osom_encoders_x86_64/models/
immediate32.rs

1#![allow(clippy::cast_sign_loss, clippy::cast_possible_wrap)]
2
3use super::{Immediate8, Immediate16};
4
5/// Represents an 32-bit immediate value.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7#[repr(transparent)]
8#[must_use]
9pub struct Immediate32 {
10    value: u32,
11}
12
13impl Immediate32 {
14    #[inline(always)]
15    pub const fn from_imm8_zero_extended(value: Immediate8) -> Self {
16        Self::from_u32(value.as_u8() as u32)
17    }
18
19    #[inline(always)]
20    pub const fn from_imm8_sign_extended(value: Immediate8) -> Self {
21        Self::from_i32(value.as_i8() as i32)
22    }
23
24    #[inline(always)]
25    pub const fn from_imm16_zero_extended(value: Immediate16) -> Self {
26        Self::from_u32(value.as_u16() as u32)
27    }
28
29    #[inline(always)]
30    pub const fn from_imm16_sign_extended(value: Immediate16) -> Self {
31        Self::from_i32(value.as_i16() as i32)
32    }
33
34    #[inline(always)]
35    pub const fn from_u32(value: u32) -> Self {
36        Self { value }
37    }
38
39    #[inline(always)]
40    pub const fn from_i32(value: i32) -> Self {
41        Self { value: value as u32 }
42    }
43
44    #[inline(always)]
45    #[must_use]
46    pub const fn as_u32(self) -> u32 {
47        self.value
48    }
49
50    #[inline(always)]
51    #[must_use]
52    pub const fn as_i32(self) -> i32 {
53        self.value as i32
54    }
55
56    #[inline(always)]
57    #[must_use]
58    pub const fn encode(self) -> [u8; 4] {
59        self.value.to_le_bytes()
60    }
61
62    #[inline(always)]
63    #[must_use]
64    pub const fn equals(self, other: Self) -> bool {
65        self.as_u32() == other.as_u32()
66    }
67}
68
69impl From<u32> for Immediate32 {
70    fn from(value: u32) -> Self {
71        Self::from_u32(value)
72    }
73}
74
75impl From<Immediate32> for u32 {
76    fn from(value: Immediate32) -> Self {
77        value.as_u32()
78    }
79}
80
81impl From<i32> for Immediate32 {
82    fn from(value: i32) -> Self {
83        Self::from_i32(value)
84    }
85}
86
87impl From<Immediate32> for i32 {
88    fn from(value: Immediate32) -> Self {
89        value.as_i32()
90    }
91}