Skip to main content

osom_encoders_x86_64/models/
immediate16.rs

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