Skip to main content

osom_encoders_x86_64/models/
immediate64.rs

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