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