osom_encoders_x86_64/models/
immediate64.rs1#![allow(clippy::cast_sign_loss, clippy::cast_possible_wrap)]
2
3use super::{Immediate8, Immediate16, Immediate32};
4
5#[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}