amx_sys/instructions/
modes.rs1#[repr(u8)]
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum WriteMode {
9 Mode0 = 0,
11 Mode1 = 1,
13 Mode2 = 2,
15 Mode3 = 3,
17 Mode4 = 4,
19}
20
21#[repr(u8)]
23#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24pub enum ShuffleMode {
25 S0 = 0, S1 = 1, S2 = 2, S3 = 3, }
30
31#[repr(u8)]
33#[derive(Debug, Clone, Copy, PartialEq, Eq)]
34pub enum ElementSize {
35 B8 = 0, B16 = 1, B32 = 2, B64 = 3, }
40
41impl ElementSize {
42 pub fn bytes(self) -> usize {
43 1 << (self as usize)
44 }
45}
46
47#[repr(u8)]
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50pub enum RoundingMode {
51 RNE = 0,
53 RZ = 1,
55 RP = 2,
57 RM = 3,
59}
60
61#[repr(u8)]
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
64pub enum DataType {
65 SignedInt = 0,
66 UnsignedInt = 1,
67 Float = 2,
68}
69
70#[derive(Debug, Clone, Copy)]
72pub struct InstructionParams {
73 pub mode: u8,
74 pub value: u8,
75 pub shuffle: ShuffleMode,
76 pub element_size: ElementSize,
77 pub data_type: DataType,
78}
79
80impl InstructionParams {
81 pub fn from_immediate(imm: u64) -> Self {
83 let mode = ((imm >> 0) & 0xF) as u8;
84 let value = ((imm >> 4) & 0xFF) as u8;
85 let shuffle = match (imm >> 12) & 0x3 {
86 0 => ShuffleMode::S0,
87 1 => ShuffleMode::S1,
88 2 => ShuffleMode::S2,
89 3 => ShuffleMode::S3,
90 _ => ShuffleMode::S0,
91 };
92 let element_size = match (imm >> 14) & 0x3 {
93 0 => ElementSize::B8,
94 1 => ElementSize::B16,
95 2 => ElementSize::B32,
96 3 => ElementSize::B64,
97 _ => ElementSize::B8,
98 };
99 let data_type = match (imm >> 16) & 0x3 {
100 0 => DataType::SignedInt,
101 1 => DataType::UnsignedInt,
102 2 => DataType::Float,
103 _ => DataType::SignedInt,
104 };
105
106 InstructionParams {
107 mode,
108 value,
109 shuffle,
110 element_size,
111 data_type,
112 }
113 }
114
115 pub fn to_immediate(self) -> u64 {
117 let mut imm = 0u64;
118 imm |= (self.mode as u64) << 0;
119 imm |= (self.value as u64) << 4;
120 imm |= ((self.shuffle as u8) as u64) << 12;
121 imm |= ((self.element_size as u8) as u64) << 14;
122 imm |= ((self.data_type as u8) as u64) << 16;
123 imm
124 }
125}
126
127#[cfg(test)]
128mod tests {
129 use super::*;
130
131 #[test]
132 fn element_size_bytes() {
133 assert_eq!(ElementSize::B8.bytes(), 1);
134 assert_eq!(ElementSize::B16.bytes(), 2);
135 assert_eq!(ElementSize::B32.bytes(), 4);
136 assert_eq!(ElementSize::B64.bytes(), 8);
137 }
138
139 #[test]
140 fn params_roundtrip() {
141 let params = InstructionParams {
142 mode: 2,
143 value: 42,
144 shuffle: ShuffleMode::S2,
145 element_size: ElementSize::B32,
146 data_type: DataType::Float,
147 };
148
149 let imm = params.to_immediate();
150 let decoded = InstructionParams::from_immediate(imm);
151
152 assert_eq!(decoded.mode, 2);
153 assert_eq!(decoded.value, 42);
154 assert_eq!(decoded.shuffle, ShuffleMode::S2);
155 assert_eq!(decoded.element_size, ElementSize::B32);
156 assert_eq!(decoded.data_type, DataType::Float);
157 }
158}