Skip to main content

asmkit/riscv/
operands.rs

1//! RISC-V Operands definition.
2use crate::{
3    core::{
4        arch_traits::{Arch, ArchTraits},
5        operand::*,
6        types::TypeId,
7    },
8    define_abstract_reg, define_final_reg, define_operand_cast, define_reg_traits,
9};
10
11use derive_more::derive::{Deref, DerefMut};
12
13#[derive(Deref, DerefMut, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
14pub struct Reg(pub BaseReg);
15
16define_abstract_reg!(Reg, BaseReg);
17
18define_reg_traits!(RISCV32Gp, RegGroup::Gp, 32, TypeId::Int32);
19define_reg_traits!(RISCV64Gp, RegGroup::Gp, 64, TypeId::Int64);
20define_reg_traits!(RISCVPC, RegGroup::PC, 64, TypeId::Int64);
21define_reg_traits!(RISCVVec, RegGroup::Vec, 128, TypeId::Int32x4);
22define_reg_traits!(RISCVFp, RegGroup::Vec, 64, TypeId::Float64);
23
24impl Reg {
25    pub const fn signature_of(typ: RegType) -> OperandSignature {
26        ArchTraits::by_arch(Arch::RISCV64).reg_type_to_signature(typ)
27    }
28
29    pub fn is_gp(&self) -> bool {
30        self.is_reg_group_of(RegGroup::Gp)
31    }
32
33    pub fn is_fp(&self) -> bool {
34        self.has_base_signature(RISCVFp::SIGNATURE)
35    }
36
37    pub fn is_vec(&self) -> bool {
38        self.has_base_signature(RISCVFp::SIGNATURE)
39    }
40
41    pub fn set_reg_t<T: RegTraits>(&mut self, rid: u32) {
42        self.set_signature(T::SIGNATURE.into());
43        self.set_id(rid);
44    }
45
46    pub fn set_type_and_id(&mut self, typ: RegType, id: u32) {
47        self.set_signature(Self::signature_of(typ));
48        self.set_id(id);
49    }
50    pub const SIGNATURE: u32 = BaseReg::SIGNATURE;
51}
52
53#[derive(Deref, DerefMut, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
54pub struct Gp(pub Reg);
55
56impl Gp {
57    pub const fn signature_of(typ: RegType) -> OperandSignature {
58        ArchTraits::by_arch(Arch::RISCV64).reg_type_to_signature(typ)
59    }
60
61    pub const X0: u32 = 0;
62    pub const X1: u32 = 1;
63    pub const X2: u32 = 2;
64    pub const X3: u32 = 3;
65    pub const X4: u32 = 4;
66    pub const X5: u32 = 5;
67    pub const X6: u32 = 6;
68    pub const X7: u32 = 7;
69    pub const X8: u32 = 8;
70    pub const X9: u32 = 9;
71    pub const X10: u32 = 10;
72    pub const X11: u32 = 11;
73    pub const X12: u32 = 12;
74    pub const X13: u32 = 13;
75    pub const X14: u32 = 14;
76    pub const X15: u32 = 15;
77    pub const X16: u32 = 16;
78    pub const X17: u32 = 17;
79    pub const X18: u32 = 18;
80    pub const X19: u32 = 19;
81    pub const X20: u32 = 20;
82    pub const X21: u32 = 21;
83    pub const X22: u32 = 22;
84    pub const X23: u32 = 23;
85    pub const X24: u32 = 24;
86    pub const X25: u32 = 25;
87    pub const X26: u32 = 26;
88    pub const X27: u32 = 27;
89    pub const X28: u32 = 28;
90    pub const X29: u32 = 29;
91    pub const X30: u32 = 30;
92    pub const X31: u32 = 31;
93}
94
95define_final_reg!(Gp, Reg, RISCV64Gp);
96
97#[derive(Deref, DerefMut, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
98pub struct Fp(pub Reg);
99
100define_final_reg!(Fp, Reg, RISCVFp);
101
102impl Fp {
103    pub const fn signature_of(typ: RegType) -> OperandSignature {
104        ArchTraits::by_arch(Arch::RISCV64).reg_type_to_signature(typ)
105    }
106
107    pub const F0: u32 = 0;
108    pub const F1: u32 = 1;
109    pub const F2: u32 = 2;
110    pub const F3: u32 = 3;
111    pub const F4: u32 = 4;
112    pub const F5: u32 = 5;
113    pub const F6: u32 = 6;
114    pub const F7: u32 = 7;
115    pub const F8: u32 = 8;
116    pub const F9: u32 = 9;
117    pub const F10: u32 = 10;
118    pub const F11: u32 = 11;
119    pub const F12: u32 = 12;
120    pub const F13: u32 = 13;
121    pub const F14: u32 = 14;
122    pub const F15: u32 = 15;
123    pub const F16: u32 = 16;
124    pub const F17: u32 = 17;
125    pub const F18: u32 = 18;
126    pub const F19: u32 = 19;
127    pub const F20: u32 = 20;
128    pub const F21: u32 = 21;
129    pub const F22: u32 = 22;
130    pub const F23: u32 = 23;
131    pub const F24: u32 = 24;
132    pub const F25: u32 = 25;
133    pub const F26: u32 = 26;
134    pub const F27: u32 = 27;
135    pub const F28: u32 = 28;
136    pub const F29: u32 = 29;
137    pub const F30: u32 = 30;
138    pub const F31: u32 = 31;
139}
140
141#[derive(Deref, DerefMut, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
142pub struct Vp(pub Reg);
143
144define_final_reg!(Vp, Reg, RISCVVec);
145
146impl Vp {
147    pub const fn signature_of(typ: RegType) -> OperandSignature {
148        ArchTraits::by_arch(Arch::RISCV64).reg_type_to_signature(typ)
149    }
150
151    pub const V0: u32 = 0;
152    pub const V1: u32 = 1;
153    pub const V2: u32 = 2;
154    pub const V3: u32 = 3;
155    pub const V4: u32 = 4;
156    pub const V5: u32 = 5;
157    pub const V6: u32 = 6;
158    pub const V7: u32 = 7;
159    pub const V8: u32 = 8;
160    pub const V9: u32 = 9;
161    pub const V10: u32 = 10;
162    pub const V11: u32 = 11;
163    pub const V12: u32 = 12;
164    pub const V13: u32 = 13;
165    pub const V14: u32 = 14;
166    pub const V15: u32 = 15;
167    pub const V16: u32 = 16;
168    pub const V17: u32 = 17;
169    pub const V18: u32 = 18;
170    pub const V19: u32 = 19;
171    pub const V20: u32 = 20;
172    pub const V21: u32 = 21;
173    pub const V22: u32 = 22;
174    pub const V23: u32 = 23;
175    pub const V24: u32 = 24;
176    pub const V25: u32 = 25;
177    pub const V26: u32 = 26;
178    pub const V27: u32 = 27;
179    pub const V28: u32 = 28;
180    pub const V29: u32 = 29;
181    pub const V30: u32 = 30;
182    pub const V31: u32 = 31;
183}
184
185pub mod regs {
186    pub use super::*;
187
188    pub const fn x(id: u32) -> Gp {
189        Gp::from_id(id)
190    }
191
192    pub const fn f(id: u32) -> Fp {
193        Fp::from_id(id)
194    }
195
196    pub const fn v(id: u32) -> Vp {
197        Vp::from_id(id)
198    }
199
200    pub const X0: Gp = x(0);
201    pub const X1: Gp = x(1);
202    pub const X2: Gp = x(2);
203    pub const X3: Gp = x(3);
204    pub const X4: Gp = x(4);
205    pub const X5: Gp = x(5);
206    pub const X6: Gp = x(6);
207    pub const X7: Gp = x(7);
208    pub const X8: Gp = x(8);
209    pub const X9: Gp = x(9);
210    pub const X10: Gp = x(10);
211    pub const X11: Gp = x(11);
212    pub const X12: Gp = x(12);
213    pub const X13: Gp = x(13);
214    pub const X14: Gp = x(14);
215    pub const X15: Gp = x(15);
216    pub const X16: Gp = x(16);
217    pub const X17: Gp = x(17);
218    pub const X18: Gp = x(18);
219    pub const X19: Gp = x(19);
220    pub const X20: Gp = x(20);
221    pub const X21: Gp = x(21);
222    pub const X22: Gp = x(22);
223    pub const X23: Gp = x(23);
224    pub const X24: Gp = x(24);
225    pub const X25: Gp = x(25);
226    pub const X26: Gp = x(26);
227    pub const X27: Gp = x(27);
228    pub const X28: Gp = x(28);
229    pub const X29: Gp = x(29);
230    pub const X30: Gp = x(30);
231    pub const X31: Gp = x(31);
232
233    pub const ZERO: Gp = X0;
234    pub const RA: Gp = X1;
235    pub const SP: Gp = X2;
236    pub const GP: Gp = X3;
237    pub const TP: Gp = X4;
238    pub const T0: Gp = X5;
239    pub const T1: Gp = X6;
240    pub const T2: Gp = X7;
241    pub const S0: Gp = X8;
242    pub const S1: Gp = X9;
243    pub const A0: Gp = X10;
244    pub const A1: Gp = X11;
245    pub const A2: Gp = X12;
246    pub const A3: Gp = X13;
247    pub const A4: Gp = X14;
248    pub const A5: Gp = X15;
249    pub const A6: Gp = X16;
250    pub const A7: Gp = X17;
251    pub const S2: Gp = X18;
252    pub const S3: Gp = X19;
253    pub const S4: Gp = X20;
254    pub const S5: Gp = X21;
255    pub const S6: Gp = X22;
256    pub const S7: Gp = X23;
257    pub const S8: Gp = X24;
258    pub const S9: Gp = X25;
259    pub const S10: Gp = X26;
260    pub const S11: Gp = X27;
261    pub const T3: Gp = X28;
262    pub const T4: Gp = X29;
263    pub const T5: Gp = X30;
264    pub const T6: Gp = X31;
265
266    pub const F0: Fp = f(0);
267    pub const F1: Fp = f(1);
268    pub const F2: Fp = f(2);
269    pub const F3: Fp = f(3);
270    pub const F4: Fp = f(4);
271    pub const F5: Fp = f(5);
272    pub const F6: Fp = f(6);
273    pub const F7: Fp = f(7);
274    pub const F8: Fp = f(8);
275    pub const F9: Fp = f(9);
276    pub const F10: Fp = f(10);
277    pub const F11: Fp = f(11);
278    pub const F12: Fp = f(12);
279    pub const F13: Fp = f(13);
280    pub const F14: Fp = f(14);
281    pub const F15: Fp = f(15);
282    pub const F16: Fp = f(16);
283    pub const F17: Fp = f(17);
284    pub const F18: Fp = f(18);
285    pub const F19: Fp = f(19);
286    pub const F20: Fp = f(20);
287    pub const F21: Fp = f(21);
288    pub const F22: Fp = f(22);
289    pub const F23: Fp = f(23);
290    pub const F24: Fp = f(24);
291    pub const F25: Fp = f(25);
292    pub const F26: Fp = f(26);
293    pub const F27: Fp = f(27);
294    pub const F28: Fp = f(28);
295    pub const F29: Fp = f(29);
296    pub const F30: Fp = f(30);
297    pub const F31: Fp = f(31);
298
299    pub const V0: Vp = v(0);
300    pub const V1: Vp = v(1);
301    pub const V2: Vp = v(2);
302    pub const V3: Vp = v(3);
303    pub const V4: Vp = v(4);
304    pub const V5: Vp = v(5);
305    pub const V6: Vp = v(6);
306    pub const V7: Vp = v(7);
307    pub const V8: Vp = v(8);
308    pub const V9: Vp = v(9);
309    pub const V10: Vp = v(10);
310    pub const V11: Vp = v(11);
311    pub const V12: Vp = v(12);
312    pub const V13: Vp = v(13);
313    pub const V14: Vp = v(14);
314    pub const V15: Vp = v(15);
315    pub const V16: Vp = v(16);
316    pub const V17: Vp = v(17);
317    pub const V18: Vp = v(18);
318    pub const V19: Vp = v(19);
319    pub const V20: Vp = v(20);
320    pub const V21: Vp = v(21);
321    pub const V22: Vp = v(22);
322    pub const V23: Vp = v(23);
323    pub const V24: Vp = v(24);
324    pub const V25: Vp = v(25);
325    pub const V26: Vp = v(26);
326    pub const V27: Vp = v(27);
327    pub const V28: Vp = v(28);
328    pub const V29: Vp = v(29);
329    pub const V30: Vp = v(30);
330    pub const V31: Vp = v(31);
331}