1 | use crate::common::Register; |
2 | |
3 | macro_rules! registers { |
4 | ($struct_name:ident, { $($name:ident = ($val:expr, $disp:expr)),+ $(,)? } |
5 | $(, aliases { $($alias_name:ident = ($alias_val:expr, $alias_disp:expr)),+ $(,)? })?) => { |
6 | #[allow(missing_docs)] |
7 | impl $struct_name { |
8 | $( |
9 | pub const $name: Register = Register($val); |
10 | )+ |
11 | $( |
12 | $(pub const $alias_name: Register = Register($alias_val);)+ |
13 | )* |
14 | } |
15 | |
16 | impl $struct_name { |
17 | /// The name of a register, or `None` if the register number is unknown. |
18 | /// |
19 | /// Only returns the primary name for registers that alias with others. |
20 | pub fn register_name(register: Register) -> Option<&'static str> { |
21 | match register { |
22 | $( |
23 | Self::$name => Some($disp), |
24 | )+ |
25 | _ => return None, |
26 | } |
27 | } |
28 | |
29 | /// Converts a register name into a register number. |
30 | pub fn name_to_register(value: &str) -> Option<Register> { |
31 | match value { |
32 | $( |
33 | $disp => Some(Self::$name), |
34 | )+ |
35 | $( |
36 | $($alias_disp => Some(Self::$alias_name),)+ |
37 | )* |
38 | _ => return None, |
39 | } |
40 | } |
41 | } |
42 | }; |
43 | } |
44 | |
45 | /// ARM architecture specific definitions. |
46 | /// |
47 | /// See [DWARF for the ARM Architecture]( |
48 | /// https://github.com/ARM-software/abi-aa/blob/main/aadwarf32/aadwarf32.rst). |
49 | #[derive (Debug, Clone, Copy)] |
50 | pub struct Arm; |
51 | |
52 | registers!(Arm, { |
53 | R0 = (0, "R0" ), |
54 | R1 = (1, "R1" ), |
55 | R2 = (2, "R2" ), |
56 | R3 = (3, "R3" ), |
57 | R4 = (4, "R4" ), |
58 | R5 = (5, "R5" ), |
59 | R6 = (6, "R6" ), |
60 | R7 = (7, "R7" ), |
61 | R8 = (8, "R8" ), |
62 | R9 = (9, "R9" ), |
63 | R10 = (10, "R10" ), |
64 | R11 = (11, "R11" ), |
65 | R12 = (12, "R12" ), |
66 | R13 = (13, "R13" ), |
67 | R14 = (14, "R14" ), |
68 | R15 = (15, "R15" ), |
69 | |
70 | WCGR0 = (104, "wCGR0" ), |
71 | WCGR1 = (105, "wCGR1" ), |
72 | WCGR2 = (106, "wCGR2" ), |
73 | WCGR3 = (107, "wCGR3" ), |
74 | WCGR4 = (108, "wCGR4" ), |
75 | WCGR5 = (109, "wCGR5" ), |
76 | WCGR6 = (110, "wCGR6" ), |
77 | WCGR7 = (111, "wCGR7" ), |
78 | |
79 | WR0 = (112, "wR0" ), |
80 | WR1 = (113, "wR1" ), |
81 | WR2 = (114, "wR2" ), |
82 | WR3 = (115, "wR3" ), |
83 | WR4 = (116, "wR4" ), |
84 | WR5 = (117, "wR5" ), |
85 | WR6 = (118, "wR6" ), |
86 | WR7 = (119, "wR7" ), |
87 | WR8 = (120, "wR8" ), |
88 | WR9 = (121, "wR9" ), |
89 | WR10 = (122, "wR10" ), |
90 | WR11 = (123, "wR11" ), |
91 | WR12 = (124, "wR12" ), |
92 | WR13 = (125, "wR13" ), |
93 | WR14 = (126, "wR14" ), |
94 | WR15 = (127, "wR15" ), |
95 | |
96 | SPSR = (128, "SPSR" ), |
97 | SPSR_FIQ = (129, "SPSR_FIQ" ), |
98 | SPSR_IRQ = (130, "SPSR_IRQ" ), |
99 | SPSR_ABT = (131, "SPSR_ABT" ), |
100 | SPSR_UND = (132, "SPSR_UND" ), |
101 | SPSR_SVC = (133, "SPSR_SVC" ), |
102 | |
103 | RA_AUTH_CODE = (143, "RA_AUTH_CODE" ), |
104 | |
105 | R8_USR = (144, "R8_USR" ), |
106 | R9_USR = (145, "R9_USR" ), |
107 | R10_USR = (146, "R10_USR" ), |
108 | R11_USR = (147, "R11_USR" ), |
109 | R12_USR = (148, "R12_USR" ), |
110 | R13_USR = (149, "R13_USR" ), |
111 | R14_USR = (150, "R14_USR" ), |
112 | |
113 | R8_FIQ = (151, "R8_FIQ" ), |
114 | R9_FIQ = (152, "R9_FIQ" ), |
115 | R10_FIQ = (153, "R10_FIQ" ), |
116 | R11_FIQ = (154, "R11_FIQ" ), |
117 | R12_FIQ = (155, "R12_FIQ" ), |
118 | R13_FIQ = (156, "R13_FIQ" ), |
119 | R14_FIQ = (157, "R14_FIQ" ), |
120 | |
121 | R13_IRQ = (158, "R13_IRQ" ), |
122 | R14_IRQ = (159, "R14_IRQ" ), |
123 | |
124 | R13_ABT = (160, "R13_ABT" ), |
125 | R14_ABT = (161, "R14_ABT" ), |
126 | |
127 | R13_UND = (162, "R13_UND" ), |
128 | R14_UND = (163, "R14_UND" ), |
129 | |
130 | R13_SVC = (164, "R13_SVC" ), |
131 | R14_SVC = (165, "R14_SVC" ), |
132 | |
133 | WC0 = (192, "wC0" ), |
134 | WC1 = (193, "wC1" ), |
135 | WC2 = (194, "wC2" ), |
136 | WC3 = (195, "wC3" ), |
137 | WC4 = (196, "wC4" ), |
138 | WC5 = (197, "wC5" ), |
139 | WC6 = (198, "wC6" ), |
140 | WC7 = (199, "wC7" ), |
141 | |
142 | D0 = (256, "D0" ), |
143 | D1 = (257, "D1" ), |
144 | D2 = (258, "D2" ), |
145 | D3 = (259, "D3" ), |
146 | D4 = (260, "D4" ), |
147 | D5 = (261, "D5" ), |
148 | D6 = (262, "D6" ), |
149 | D7 = (263, "D7" ), |
150 | D8 = (264, "D8" ), |
151 | D9 = (265, "D9" ), |
152 | D10 = (266, "D10" ), |
153 | D11 = (267, "D11" ), |
154 | D12 = (268, "D12" ), |
155 | D13 = (269, "D13" ), |
156 | D14 = (270, "D14" ), |
157 | D15 = (271, "D15" ), |
158 | D16 = (272, "D16" ), |
159 | D17 = (273, "D17" ), |
160 | D18 = (274, "D18" ), |
161 | D19 = (275, "D19" ), |
162 | D20 = (276, "D20" ), |
163 | D21 = (277, "D21" ), |
164 | D22 = (278, "D22" ), |
165 | D23 = (279, "D23" ), |
166 | D24 = (280, "D24" ), |
167 | D25 = (281, "D25" ), |
168 | D26 = (282, "D26" ), |
169 | D27 = (283, "D27" ), |
170 | D28 = (284, "D28" ), |
171 | D29 = (285, "D29" ), |
172 | D30 = (286, "D30" ), |
173 | D31 = (287, "D31" ), |
174 | |
175 | TPIDRURO = (320, "TPIDRURO" ), |
176 | TPIDRURW = (321, "TPIDRURW" ), |
177 | TPIDPR = (322, "TPIDPR" ), |
178 | HTPIDPR = (323, "HTPIDPR" ), |
179 | }, |
180 | aliases { |
181 | SP = (13, "SP" ), |
182 | LR = (14, "LR" ), |
183 | PC = (15, "PC" ), |
184 | |
185 | ACC0 = (104, "ACC0" ), |
186 | ACC1 = (105, "ACC1" ), |
187 | ACC2 = (106, "ACC2" ), |
188 | ACC3 = (107, "ACC3" ), |
189 | ACC4 = (108, "ACC4" ), |
190 | ACC5 = (109, "ACC5" ), |
191 | ACC6 = (110, "ACC6" ), |
192 | ACC7 = (111, "ACC7" ), |
193 | |
194 | S0 = (256, "S0" ), |
195 | S1 = (256, "S1" ), |
196 | S2 = (257, "S2" ), |
197 | S3 = (257, "S3" ), |
198 | S4 = (258, "S4" ), |
199 | S5 = (258, "S5" ), |
200 | S6 = (259, "S6" ), |
201 | S7 = (259, "S7" ), |
202 | S8 = (260, "S8" ), |
203 | S9 = (260, "S9" ), |
204 | S10 = (261, "S10" ), |
205 | S11 = (261, "S11" ), |
206 | S12 = (262, "S12" ), |
207 | S13 = (262, "S13" ), |
208 | S14 = (263, "S14" ), |
209 | S15 = (263, "S15" ), |
210 | S16 = (264, "S16" ), |
211 | S17 = (264, "S17" ), |
212 | S18 = (265, "S18" ), |
213 | S19 = (265, "S19" ), |
214 | S20 = (266, "S20" ), |
215 | S21 = (266, "S21" ), |
216 | S22 = (267, "S22" ), |
217 | S23 = (267, "S23" ), |
218 | S24 = (268, "S24" ), |
219 | S25 = (268, "S25" ), |
220 | S26 = (269, "S26" ), |
221 | S27 = (269, "S27" ), |
222 | S28 = (270, "S28" ), |
223 | S29 = (270, "S29" ), |
224 | S30 = (271, "S30" ), |
225 | S31 = (271, "S31" ), |
226 | }); |
227 | |
228 | /// ARM 64-bit (AArch64) architecture specific definitions. |
229 | /// |
230 | /// See [DWARF for the ARM 64-bit Architecture]( |
231 | /// https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst). |
232 | #[derive (Debug, Clone, Copy)] |
233 | pub struct AArch64; |
234 | |
235 | registers!(AArch64, { |
236 | X0 = (0, "X0" ), |
237 | X1 = (1, "X1" ), |
238 | X2 = (2, "X2" ), |
239 | X3 = (3, "X3" ), |
240 | X4 = (4, "X4" ), |
241 | X5 = (5, "X5" ), |
242 | X6 = (6, "X6" ), |
243 | X7 = (7, "X7" ), |
244 | X8 = (8, "X8" ), |
245 | X9 = (9, "X9" ), |
246 | X10 = (10, "X10" ), |
247 | X11 = (11, "X11" ), |
248 | X12 = (12, "X12" ), |
249 | X13 = (13, "X13" ), |
250 | X14 = (14, "X14" ), |
251 | X15 = (15, "X15" ), |
252 | X16 = (16, "X16" ), |
253 | X17 = (17, "X17" ), |
254 | X18 = (18, "X18" ), |
255 | X19 = (19, "X19" ), |
256 | X20 = (20, "X20" ), |
257 | X21 = (21, "X21" ), |
258 | X22 = (22, "X22" ), |
259 | X23 = (23, "X23" ), |
260 | X24 = (24, "X24" ), |
261 | X25 = (25, "X25" ), |
262 | X26 = (26, "X26" ), |
263 | X27 = (27, "X27" ), |
264 | X28 = (28, "X28" ), |
265 | X29 = (29, "X29" ), |
266 | X30 = (30, "X30" ), |
267 | SP = (31, "SP" ), |
268 | PC = (32, "PC" ), |
269 | ELR_MODE = (33, "ELR_mode" ), |
270 | RA_SIGN_STATE = (34, "RA_SIGN_STATE" ), |
271 | TPIDRRO_EL0 = (35, "TPIDRRO_EL0" ), |
272 | TPIDR_EL0 = (36, "TPIDR_EL0" ), |
273 | TPIDR_EL1 = (37, "TPIDR_EL1" ), |
274 | TPIDR_EL2 = (38, "TPIDR_EL2" ), |
275 | TPIDR_EL3 = (39, "TPIDR_EL3" ), |
276 | |
277 | VG = (46, "VG" ), |
278 | FFR = (47, "FFR" ), |
279 | |
280 | P0 = (48, "P0" ), |
281 | P1 = (49, "P1" ), |
282 | P2 = (50, "P2" ), |
283 | P3 = (51, "P3" ), |
284 | P4 = (52, "P4" ), |
285 | P5 = (53, "P5" ), |
286 | P6 = (54, "P6" ), |
287 | P7 = (55, "P7" ), |
288 | P8 = (56, "P8" ), |
289 | P9 = (57, "P9" ), |
290 | P10 = (58, "P10" ), |
291 | P11 = (59, "P11" ), |
292 | P12 = (60, "P12" ), |
293 | P13 = (61, "P13" ), |
294 | P14 = (62, "P14" ), |
295 | P15 = (63, "P15" ), |
296 | |
297 | V0 = (64, "V0" ), |
298 | V1 = (65, "V1" ), |
299 | V2 = (66, "V2" ), |
300 | V3 = (67, "V3" ), |
301 | V4 = (68, "V4" ), |
302 | V5 = (69, "V5" ), |
303 | V6 = (70, "V6" ), |
304 | V7 = (71, "V7" ), |
305 | V8 = (72, "V8" ), |
306 | V9 = (73, "V9" ), |
307 | V10 = (74, "V10" ), |
308 | V11 = (75, "V11" ), |
309 | V12 = (76, "V12" ), |
310 | V13 = (77, "V13" ), |
311 | V14 = (78, "V14" ), |
312 | V15 = (79, "V15" ), |
313 | V16 = (80, "V16" ), |
314 | V17 = (81, "V17" ), |
315 | V18 = (82, "V18" ), |
316 | V19 = (83, "V19" ), |
317 | V20 = (84, "V20" ), |
318 | V21 = (85, "V21" ), |
319 | V22 = (86, "V22" ), |
320 | V23 = (87, "V23" ), |
321 | V24 = (88, "V24" ), |
322 | V25 = (89, "V25" ), |
323 | V26 = (90, "V26" ), |
324 | V27 = (91, "V27" ), |
325 | V28 = (92, "V28" ), |
326 | V29 = (93, "V29" ), |
327 | V30 = (94, "V30" ), |
328 | V31 = (95, "V31" ), |
329 | |
330 | Z0 = (96, "Z0" ), |
331 | Z1 = (97, "Z1" ), |
332 | Z2 = (98, "Z2" ), |
333 | Z3 = (99, "Z3" ), |
334 | Z4 = (100, "Z4" ), |
335 | Z5 = (101, "Z5" ), |
336 | Z6 = (102, "Z6" ), |
337 | Z7 = (103, "Z7" ), |
338 | Z8 = (104, "Z8" ), |
339 | Z9 = (105, "Z9" ), |
340 | Z10 = (106, "Z10" ), |
341 | Z11 = (107, "Z11" ), |
342 | Z12 = (108, "Z12" ), |
343 | Z13 = (109, "Z13" ), |
344 | Z14 = (110, "Z14" ), |
345 | Z15 = (111, "Z15" ), |
346 | Z16 = (112, "Z16" ), |
347 | Z17 = (113, "Z17" ), |
348 | Z18 = (114, "Z18" ), |
349 | Z19 = (115, "Z19" ), |
350 | Z20 = (116, "Z20" ), |
351 | Z21 = (117, "Z21" ), |
352 | Z22 = (118, "Z22" ), |
353 | Z23 = (119, "Z23" ), |
354 | Z24 = (120, "Z24" ), |
355 | Z25 = (121, "Z25" ), |
356 | Z26 = (122, "Z26" ), |
357 | Z27 = (123, "Z27" ), |
358 | Z28 = (124, "Z28" ), |
359 | Z29 = (125, "Z29" ), |
360 | Z30 = (126, "Z30" ), |
361 | Z31 = (127, "Z31" ), |
362 | }); |
363 | |
364 | /// LoongArch architecture specific definitions. |
365 | /// |
366 | /// See [LoongArch ELF psABI specification](https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html). |
367 | #[derive (Debug, Clone, Copy)] |
368 | pub struct LoongArch; |
369 | |
370 | registers!(LoongArch, { |
371 | R0 = (0, "$r0" ), |
372 | R1 = (1, "$r1" ), |
373 | R2 = (2, "$r2" ), |
374 | R3 = (3, "$r3" ), |
375 | R4 = (4, "$r4" ), |
376 | R5 = (5, "$r5" ), |
377 | R6 = (6, "$r6" ), |
378 | R7 = (7, "$r7" ), |
379 | R8 = (8, "$r8" ), |
380 | R9 = (9, "$r9" ), |
381 | R10 = (10, "$r10" ), |
382 | R11 = (11, "$r11" ), |
383 | R12 = (12, "$r12" ), |
384 | R13 = (13, "$r13" ), |
385 | R14 = (14, "$r14" ), |
386 | R15 = (15, "$r15" ), |
387 | R16 = (16, "$r16" ), |
388 | R17 = (17, "$r17" ), |
389 | R18 = (18, "$r18" ), |
390 | R19 = (19, "$r19" ), |
391 | R20 = (20, "$r20" ), |
392 | R21 = (21, "$r21" ), |
393 | R22 = (22, "$r22" ), |
394 | R23 = (23, "$r23" ), |
395 | R24 = (24, "$r24" ), |
396 | R25 = (25, "$r25" ), |
397 | R26 = (26, "$r26" ), |
398 | R27 = (27, "$r27" ), |
399 | R28 = (28, "$r28" ), |
400 | R29 = (29, "$r29" ), |
401 | R30 = (30, "$r30" ), |
402 | R31 = (31, "$r31" ), |
403 | |
404 | F0 = (32, "$f0" ), |
405 | F1 = (33, "$f1" ), |
406 | F2 = (34, "$f2" ), |
407 | F3 = (35, "$f3" ), |
408 | F4 = (36, "$f4" ), |
409 | F5 = (37, "$f5" ), |
410 | F6 = (38, "$f6" ), |
411 | F7 = (39, "$f7" ), |
412 | F8 = (40, "$f8" ), |
413 | F9 = (41, "$f9" ), |
414 | F10 = (42, "$f10" ), |
415 | F11 = (43, "$f11" ), |
416 | F12 = (44, "$f12" ), |
417 | F13 = (45, "$f13" ), |
418 | F14 = (46, "$f14" ), |
419 | F15 = (47, "$f15" ), |
420 | F16 = (48, "$f16" ), |
421 | F17 = (49, "$f17" ), |
422 | F18 = (50, "$f18" ), |
423 | F19 = (51, "$f19" ), |
424 | F20 = (52, "$f20" ), |
425 | F21 = (53, "$f21" ), |
426 | F22 = (54, "$f22" ), |
427 | F23 = (55, "$f23" ), |
428 | F24 = (56, "$f24" ), |
429 | F25 = (57, "$f25" ), |
430 | F26 = (58, "$f26" ), |
431 | F27 = (59, "$f27" ), |
432 | F28 = (60, "$f28" ), |
433 | F29 = (61, "$f29" ), |
434 | F30 = (62, "$f30" ), |
435 | F31 = (63, "$f31" ), |
436 | FCC0 = (64, "$fcc0" ), |
437 | FCC1 = (65, "$fcc1" ), |
438 | FCC2 = (66, "$fcc2" ), |
439 | FCC3 = (67, "$fcc3" ), |
440 | FCC4 = (68, "$fcc4" ), |
441 | FCC5 = (69, "$fcc5" ), |
442 | FCC6 = (70, "$fcc6" ), |
443 | FCC7 = (71, "$fcc7" ), |
444 | }, |
445 | aliases { |
446 | ZERO = (0, "$zero" ), |
447 | RA = (1, "$ra" ), |
448 | TP = (2, "$tp" ), |
449 | SP = (3, "$sp" ), |
450 | A0 = (4, "$a0" ), |
451 | A1 = (5, "$a1" ), |
452 | A2 = (6, "$a2" ), |
453 | A3 = (7, "$a3" ), |
454 | A4 = (8, "$a4" ), |
455 | A5 = (9, "$a5" ), |
456 | A6 = (10, "$a6" ), |
457 | A7 = (11, "$a7" ), |
458 | T0 = (12, "$t0" ), |
459 | T1 = (13, "$t1" ), |
460 | T2 = (14, "$t2" ), |
461 | T3 = (15, "$t3" ), |
462 | T4 = (16, "$t4" ), |
463 | T5 = (17, "$t5" ), |
464 | T6 = (18, "$t6" ), |
465 | T7 = (19, "$t7" ), |
466 | T8 = (20, "$t8" ), |
467 | FP = (22, "$fp" ), |
468 | S0 = (23, "$s0" ), |
469 | S1 = (24, "$s1" ), |
470 | S2 = (25, "$s2" ), |
471 | S3 = (26, "$s3" ), |
472 | S4 = (27, "$s4" ), |
473 | S5 = (28, "$s5" ), |
474 | S6 = (29, "$s6" ), |
475 | S7 = (30, "$s7" ), |
476 | S8 = (31, "$s8" ), |
477 | |
478 | FA0 = (32, "$fa0" ), |
479 | FA1 = (33, "$fa1" ), |
480 | FA2 = (34, "$fa2" ), |
481 | FA3 = (35, "$fa3" ), |
482 | FA4 = (36, "$fa4" ), |
483 | FA5 = (37, "$fa5" ), |
484 | FA6 = (38, "$fa6" ), |
485 | FA7 = (39, "$fa7" ), |
486 | FT0 = (40, "$ft0" ), |
487 | FT1 = (41, "$ft1" ), |
488 | FT2 = (42, "$ft2" ), |
489 | FT3 = (43, "$ft3" ), |
490 | FT4 = (44, "$ft4" ), |
491 | FT5 = (45, "$ft5" ), |
492 | FT6 = (46, "$ft6" ), |
493 | FT7 = (47, "$ft7" ), |
494 | FT8 = (48, "$ft8" ), |
495 | FT9 = (49, "$ft9" ), |
496 | FT10 = (50, "$ft10" ), |
497 | FT11 = (51, "$ft11" ), |
498 | FT12 = (52, "$ft12" ), |
499 | FT13 = (53, "$ft13" ), |
500 | FT14 = (54, "$ft14" ), |
501 | FT15 = (55, "$ft15" ), |
502 | FS0 = (56, "$fs0" ), |
503 | FS1 = (57, "$fs1" ), |
504 | FS2 = (58, "$fs2" ), |
505 | FS3 = (59, "$fs3" ), |
506 | FS4 = (60, "$fs4" ), |
507 | FS5 = (61, "$fs5" ), |
508 | FS6 = (62, "$fs6" ), |
509 | FS7 = (63, "$fs7" ), |
510 | }); |
511 | |
512 | /// MIPS architecture specific definitions. |
513 | /// |
514 | /// See [MIPS Details](https://en.wikibooks.org/wiki/MIPS_Assembly/MIPS_Details). |
515 | #[derive (Debug, Clone, Copy)] |
516 | pub struct MIPS; |
517 | |
518 | registers!(MIPS, { |
519 | R0 = (0, "$0" ), |
520 | R1 = (1, "$1" ), |
521 | R2 = (2, "$2" ), |
522 | R3 = (3, "$3" ), |
523 | R4 = (4, "$4" ), |
524 | R5 = (5, "$5" ), |
525 | R6 = (6, "$6" ), |
526 | R7 = (7, "$7" ), |
527 | R8 = (8, "$8" ), |
528 | R9 = (9, "$9" ), |
529 | R10 = (10, "$10" ), |
530 | R11 = (11, "$11" ), |
531 | R12 = (12, "$12" ), |
532 | R13 = (13, "$13" ), |
533 | R14 = (14, "$14" ), |
534 | R15 = (15, "$15" ), |
535 | R16 = (16, "$16" ), |
536 | R17 = (17, "$17" ), |
537 | R18 = (18, "$18" ), |
538 | R19 = (19, "$19" ), |
539 | R20 = (20, "$20" ), |
540 | R21 = (21, "$21" ), |
541 | R22 = (22, "$22" ), |
542 | R23 = (23, "$23" ), |
543 | R24 = (24, "$24" ), |
544 | R25 = (25, "$25" ), |
545 | R26 = (26, "$26" ), |
546 | R27 = (27, "$27" ), |
547 | R28 = (28, "$28" ), |
548 | R29 = (29, "$29" ), |
549 | R30 = (30, "$30" ), |
550 | R31 = (31, "$31" ), |
551 | |
552 | F0 = (32, "$f0" ), |
553 | F1 = (33, "$f1" ), |
554 | F2 = (34, "$f2" ), |
555 | F3 = (35, "$f3" ), |
556 | F4 = (36, "$f4" ), |
557 | F5 = (37, "$f5" ), |
558 | F6 = (38, "$f6" ), |
559 | F7 = (39, "$f7" ), |
560 | F8 = (40, "$f8" ), |
561 | F9 = (41, "$f9" ), |
562 | F10 = (42, "$f10" ), |
563 | F11 = (43, "$f11" ), |
564 | F12 = (44, "$f12" ), |
565 | F13 = (45, "$f13" ), |
566 | F14 = (46, "$f14" ), |
567 | F15 = (47, "$f15" ), |
568 | F16 = (48, "$f16" ), |
569 | F17 = (49, "$f17" ), |
570 | F18 = (50, "$f18" ), |
571 | F19 = (51, "$f19" ), |
572 | F20 = (52, "$f20" ), |
573 | F21 = (53, "$f21" ), |
574 | F22 = (54, "$f22" ), |
575 | F23 = (55, "$f23" ), |
576 | F24 = (56, "$f24" ), |
577 | F25 = (57, "$f25" ), |
578 | F26 = (58, "$f26" ), |
579 | F27 = (59, "$f27" ), |
580 | F28 = (60, "$f28" ), |
581 | F29 = (61, "$f29" ), |
582 | F30 = (62, "$f30" ), |
583 | F31 = (63, "$f31" ), |
584 | |
585 | HI = (64, "$hi" ), |
586 | LO = (65, "$lo" ), |
587 | }, |
588 | aliases { |
589 | ZERO = (0, "$zero" ), |
590 | AT = (1, "$at" ), |
591 | V0 = (2, "$v0" ), |
592 | V1 = (3, "$v1" ), |
593 | A0 = (4, "$a0" ), |
594 | A1 = (5, "$a1" ), |
595 | A2 = (6, "$a2" ), |
596 | A3 = (7, "$a3" ), |
597 | T0 = (8, "$t0" ), |
598 | T1 = (9, "$t1" ), |
599 | T2 = (10, "$t2" ), |
600 | T3 = (11, "$t3" ), |
601 | T4 = (12, "$t4" ), |
602 | T5 = (13, "$t5" ), |
603 | T6 = (14, "$t6" ), |
604 | T7 = (15, "$t7" ), |
605 | S0 = (16, "$s0" ), |
606 | S1 = (17, "$s1" ), |
607 | S2 = (18, "$s2" ), |
608 | S3 = (19, "$s3" ), |
609 | S4 = (20, "$s4" ), |
610 | S5 = (21, "$s5" ), |
611 | S6 = (22, "$s6" ), |
612 | S7 = (23, "$s7" ), |
613 | T8 = (24, "$t8" ), |
614 | T9 = (25, "$t9" ), |
615 | K0 = (26, "$k0" ), |
616 | K1 = (27, "$k1" ), |
617 | GP = (28, "$gp" ), |
618 | SP = (29, "$sp" ), |
619 | FP = (30, "$fp" ), |
620 | RA = (31, "$ra" ), |
621 | |
622 | S8 = (30, "$s8" ) |
623 | }); |
624 | |
625 | /// RISC-V architecture specific definitions. |
626 | /// |
627 | /// See [RISC-V ELF psABI specification](https://github.com/riscv/riscv-elf-psabi-doc). |
628 | #[derive (Debug, Clone, Copy)] |
629 | pub struct RiscV; |
630 | |
631 | registers!(RiscV, { |
632 | X0 = (0, "x0" ), |
633 | X1 = (1, "x1" ), |
634 | X2 = (2, "x2" ), |
635 | X3 = (3, "x3" ), |
636 | X4 = (4, "x4" ), |
637 | X5 = (5, "x5" ), |
638 | X6 = (6, "x6" ), |
639 | X7 = (7, "x7" ), |
640 | X8 = (8, "x8" ), |
641 | X9 = (9, "x9" ), |
642 | X10 = (10, "x10" ), |
643 | X11 = (11, "x11" ), |
644 | X12 = (12, "x12" ), |
645 | X13 = (13, "x13" ), |
646 | X14 = (14, "x14" ), |
647 | X15 = (15, "x15" ), |
648 | X16 = (16, "x16" ), |
649 | X17 = (17, "x17" ), |
650 | X18 = (18, "x18" ), |
651 | X19 = (19, "x19" ), |
652 | X20 = (20, "x20" ), |
653 | X21 = (21, "x21" ), |
654 | X22 = (22, "x22" ), |
655 | X23 = (23, "x23" ), |
656 | X24 = (24, "x24" ), |
657 | X25 = (25, "x25" ), |
658 | X26 = (26, "x26" ), |
659 | X27 = (27, "x27" ), |
660 | X28 = (28, "x28" ), |
661 | X29 = (29, "x29" ), |
662 | X30 = (30, "x30" ), |
663 | X31 = (31, "x31" ), |
664 | |
665 | F0 = (32, "f0" ), |
666 | F1 = (33, "f1" ), |
667 | F2 = (34, "f2" ), |
668 | F3 = (35, "f3" ), |
669 | F4 = (36, "f4" ), |
670 | F5 = (37, "f5" ), |
671 | F6 = (38, "f6" ), |
672 | F7 = (39, "f7" ), |
673 | F8 = (40, "f8" ), |
674 | F9 = (41, "f9" ), |
675 | F10 = (42, "f10" ), |
676 | F11 = (43, "f11" ), |
677 | F12 = (44, "f12" ), |
678 | F13 = (45, "f13" ), |
679 | F14 = (46, "f14" ), |
680 | F15 = (47, "f15" ), |
681 | F16 = (48, "f16" ), |
682 | F17 = (49, "f17" ), |
683 | F18 = (50, "f18" ), |
684 | F19 = (51, "f19" ), |
685 | F20 = (52, "f20" ), |
686 | F21 = (53, "f21" ), |
687 | F22 = (54, "f22" ), |
688 | F23 = (55, "f23" ), |
689 | F24 = (56, "f24" ), |
690 | F25 = (57, "f25" ), |
691 | F26 = (58, "f26" ), |
692 | F27 = (59, "f27" ), |
693 | F28 = (60, "f28" ), |
694 | F29 = (61, "f29" ), |
695 | F30 = (62, "f30" ), |
696 | F31 = (63, "f31" ), |
697 | }, |
698 | aliases { |
699 | ZERO = (0, "zero" ), |
700 | RA = (1, "ra" ), |
701 | SP = (2, "sp" ), |
702 | GP = (3, "gp" ), |
703 | TP = (4, "tp" ), |
704 | T0 = (5, "t0" ), |
705 | T1 = (6, "t1" ), |
706 | T2 = (7, "t2" ), |
707 | S0 = (8, "s0" ), |
708 | S1 = (9, "s1" ), |
709 | A0 = (10, "a0" ), |
710 | A1 = (11, "a1" ), |
711 | A2 = (12, "a2" ), |
712 | A3 = (13, "a3" ), |
713 | A4 = (14, "a4" ), |
714 | A5 = (15, "a5" ), |
715 | A6 = (16, "a6" ), |
716 | A7 = (17, "a7" ), |
717 | S2 = (18, "s2" ), |
718 | S3 = (19, "s3" ), |
719 | S4 = (20, "s4" ), |
720 | S5 = (21, "s5" ), |
721 | S6 = (22, "s6" ), |
722 | S7 = (23, "s7" ), |
723 | S8 = (24, "s8" ), |
724 | S9 = (25, "s9" ), |
725 | S10 = (26, "s10" ), |
726 | S11 = (27, "s11" ), |
727 | T3 = (28, "t3" ), |
728 | T4 = (29, "t4" ), |
729 | T5 = (30, "t5" ), |
730 | T6 = (31, "t6" ), |
731 | |
732 | FT0 = (32, "ft0" ), |
733 | FT1 = (33, "ft1" ), |
734 | FT2 = (34, "ft2" ), |
735 | FT3 = (35, "ft3" ), |
736 | FT4 = (36, "ft4" ), |
737 | FT5 = (37, "ft5" ), |
738 | FT6 = (38, "ft6" ), |
739 | FT7 = (39, "ft7" ), |
740 | FS0 = (40, "fs0" ), |
741 | FS1 = (41, "fs1" ), |
742 | FA0 = (42, "fa0" ), |
743 | FA1 = (43, "fa1" ), |
744 | FA2 = (44, "fa2" ), |
745 | FA3 = (45, "fa3" ), |
746 | FA4 = (46, "fa4" ), |
747 | FA5 = (47, "fa5" ), |
748 | FA6 = (48, "fa6" ), |
749 | FA7 = (49, "fa7" ), |
750 | FS2 = (50, "fs2" ), |
751 | FS3 = (51, "fs3" ), |
752 | FS4 = (52, "fs4" ), |
753 | FS5 = (53, "fs5" ), |
754 | FS6 = (54, "fs6" ), |
755 | FS7 = (55, "fs7" ), |
756 | FS8 = (56, "fs8" ), |
757 | FS9 = (57, "fs9" ), |
758 | FS10 = (58, "fs10" ), |
759 | FS11 = (59, "fs11" ), |
760 | FT8 = (60, "ft8" ), |
761 | FT9 = (61, "ft9" ), |
762 | FT10 = (62, "ft10" ), |
763 | FT11 = (63, "ft11" ), |
764 | }); |
765 | |
766 | /// Intel i386 architecture specific definitions. |
767 | /// |
768 | /// See Intel386 psABi version 1.1 at the [X86 psABI wiki](https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI). |
769 | #[derive (Debug, Clone, Copy)] |
770 | pub struct X86; |
771 | |
772 | registers!(X86, { |
773 | EAX = (0, "eax" ), |
774 | ECX = (1, "ecx" ), |
775 | EDX = (2, "edx" ), |
776 | EBX = (3, "ebx" ), |
777 | ESP = (4, "esp" ), |
778 | EBP = (5, "ebp" ), |
779 | ESI = (6, "esi" ), |
780 | EDI = (7, "edi" ), |
781 | |
782 | // Return Address register. This is stored in `0(%esp, "")` and is not a physical register. |
783 | RA = (8, "RA" ), |
784 | |
785 | ST0 = (11, "st0" ), |
786 | ST1 = (12, "st1" ), |
787 | ST2 = (13, "st2" ), |
788 | ST3 = (14, "st3" ), |
789 | ST4 = (15, "st4" ), |
790 | ST5 = (16, "st5" ), |
791 | ST6 = (17, "st6" ), |
792 | ST7 = (18, "st7" ), |
793 | |
794 | XMM0 = (21, "xmm0" ), |
795 | XMM1 = (22, "xmm1" ), |
796 | XMM2 = (23, "xmm2" ), |
797 | XMM3 = (24, "xmm3" ), |
798 | XMM4 = (25, "xmm4" ), |
799 | XMM5 = (26, "xmm5" ), |
800 | XMM6 = (27, "xmm6" ), |
801 | XMM7 = (28, "xmm7" ), |
802 | |
803 | MM0 = (29, "mm0" ), |
804 | MM1 = (30, "mm1" ), |
805 | MM2 = (31, "mm2" ), |
806 | MM3 = (32, "mm3" ), |
807 | MM4 = (33, "mm4" ), |
808 | MM5 = (34, "mm5" ), |
809 | MM6 = (35, "mm6" ), |
810 | MM7 = (36, "mm7" ), |
811 | |
812 | MXCSR = (39, "mxcsr" ), |
813 | |
814 | ES = (40, "es" ), |
815 | CS = (41, "cs" ), |
816 | SS = (42, "ss" ), |
817 | DS = (43, "ds" ), |
818 | FS = (44, "fs" ), |
819 | GS = (45, "gs" ), |
820 | |
821 | TR = (48, "tr" ), |
822 | LDTR = (49, "ldtr" ), |
823 | |
824 | FS_BASE = (93, "fs.base" ), |
825 | GS_BASE = (94, "gs.base" ), |
826 | }); |
827 | |
828 | /// AMD64 architecture specific definitions. |
829 | /// |
830 | /// See x86-64 psABI version 1.0 at the [X86 psABI wiki](https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI). |
831 | #[derive (Debug, Clone, Copy)] |
832 | pub struct X86_64; |
833 | |
834 | registers!(X86_64, { |
835 | RAX = (0, "rax" ), |
836 | RDX = (1, "rdx" ), |
837 | RCX = (2, "rcx" ), |
838 | RBX = (3, "rbx" ), |
839 | RSI = (4, "rsi" ), |
840 | RDI = (5, "rdi" ), |
841 | RBP = (6, "rbp" ), |
842 | RSP = (7, "rsp" ), |
843 | |
844 | R8 = (8, "r8" ), |
845 | R9 = (9, "r9" ), |
846 | R10 = (10, "r10" ), |
847 | R11 = (11, "r11" ), |
848 | R12 = (12, "r12" ), |
849 | R13 = (13, "r13" ), |
850 | R14 = (14, "r14" ), |
851 | R15 = (15, "r15" ), |
852 | |
853 | // Return Address register. This is stored in `0(%rsp, "")` and is not a physical register. |
854 | RA = (16, "RA" ), |
855 | |
856 | XMM0 = (17, "xmm0" ), |
857 | XMM1 = (18, "xmm1" ), |
858 | XMM2 = (19, "xmm2" ), |
859 | XMM3 = (20, "xmm3" ), |
860 | XMM4 = (21, "xmm4" ), |
861 | XMM5 = (22, "xmm5" ), |
862 | XMM6 = (23, "xmm6" ), |
863 | XMM7 = (24, "xmm7" ), |
864 | |
865 | XMM8 = (25, "xmm8" ), |
866 | XMM9 = (26, "xmm9" ), |
867 | XMM10 = (27, "xmm10" ), |
868 | XMM11 = (28, "xmm11" ), |
869 | XMM12 = (29, "xmm12" ), |
870 | XMM13 = (30, "xmm13" ), |
871 | XMM14 = (31, "xmm14" ), |
872 | XMM15 = (32, "xmm15" ), |
873 | |
874 | ST0 = (33, "st0" ), |
875 | ST1 = (34, "st1" ), |
876 | ST2 = (35, "st2" ), |
877 | ST3 = (36, "st3" ), |
878 | ST4 = (37, "st4" ), |
879 | ST5 = (38, "st5" ), |
880 | ST6 = (39, "st6" ), |
881 | ST7 = (40, "st7" ), |
882 | |
883 | MM0 = (41, "mm0" ), |
884 | MM1 = (42, "mm1" ), |
885 | MM2 = (43, "mm2" ), |
886 | MM3 = (44, "mm3" ), |
887 | MM4 = (45, "mm4" ), |
888 | MM5 = (46, "mm5" ), |
889 | MM6 = (47, "mm6" ), |
890 | MM7 = (48, "mm7" ), |
891 | |
892 | RFLAGS = (49, "rFLAGS" ), |
893 | ES = (50, "es" ), |
894 | CS = (51, "cs" ), |
895 | SS = (52, "ss" ), |
896 | DS = (53, "ds" ), |
897 | FS = (54, "fs" ), |
898 | GS = (55, "gs" ), |
899 | |
900 | FS_BASE = (58, "fs.base" ), |
901 | GS_BASE = (59, "gs.base" ), |
902 | |
903 | TR = (62, "tr" ), |
904 | LDTR = (63, "ldtr" ), |
905 | MXCSR = (64, "mxcsr" ), |
906 | FCW = (65, "fcw" ), |
907 | FSW = (66, "fsw" ), |
908 | |
909 | XMM16 = (67, "xmm16" ), |
910 | XMM17 = (68, "xmm17" ), |
911 | XMM18 = (69, "xmm18" ), |
912 | XMM19 = (70, "xmm19" ), |
913 | XMM20 = (71, "xmm20" ), |
914 | XMM21 = (72, "xmm21" ), |
915 | XMM22 = (73, "xmm22" ), |
916 | XMM23 = (74, "xmm23" ), |
917 | XMM24 = (75, "xmm24" ), |
918 | XMM25 = (76, "xmm25" ), |
919 | XMM26 = (77, "xmm26" ), |
920 | XMM27 = (78, "xmm27" ), |
921 | XMM28 = (79, "xmm28" ), |
922 | XMM29 = (80, "xmm29" ), |
923 | XMM30 = (81, "xmm30" ), |
924 | XMM31 = (82, "xmm31" ), |
925 | |
926 | K0 = (118, "k0" ), |
927 | K1 = (119, "k1" ), |
928 | K2 = (120, "k2" ), |
929 | K3 = (121, "k3" ), |
930 | K4 = (122, "k4" ), |
931 | K5 = (123, "k5" ), |
932 | K6 = (124, "k6" ), |
933 | K7 = (125, "k7" ), |
934 | }); |
935 | |
936 | /// PowerPC 64bit |
937 | /// |
938 | /// See [64-bit ELF ABI Specification for OpenPOWER Architecture](https://openpowerfoundation.org/specifications/64bitelfabi/). |
939 | #[derive (Debug, Clone, Copy)] |
940 | pub struct PowerPc64; |
941 | |
942 | registers!(PowerPc64, { |
943 | R0 = (0, "r0" ), |
944 | R1 = (1, "r1" ), |
945 | R2 = (2, "r2" ), |
946 | R3 = (3, "r3" ), |
947 | R4 = (4, "r4" ), |
948 | R5 = (5, "r5" ), |
949 | R6 = (6, "r6" ), |
950 | R7 = (7, "r7" ), |
951 | R8 = (8, "r8" ), |
952 | R9 = (9, "r9" ), |
953 | R10 = (10, "r10" ), |
954 | R11 = (11, "r11" ), |
955 | R12 = (12, "r12" ), |
956 | R13 = (13, "r13" ), |
957 | R14 = (14, "r14" ), |
958 | R15 = (15, "r15" ), |
959 | R16 = (16, "r16" ), |
960 | R17 = (17, "r17" ), |
961 | R18 = (18, "r18" ), |
962 | R19 = (19, "r19" ), |
963 | R20 = (20, "r20" ), |
964 | R21 = (21, "r21" ), |
965 | R22 = (22, "r22" ), |
966 | R23 = (23, "r23" ), |
967 | R24 = (24, "r24" ), |
968 | R25 = (25, "r25" ), |
969 | R26 = (26, "r26" ), |
970 | R27 = (27, "r27" ), |
971 | R28 = (28, "r28" ), |
972 | R29 = (29, "r29" ), |
973 | R30 = (30, "r30" ), |
974 | R31 = (31, "r31" ), |
975 | |
976 | F0 = (32, "f0" ), |
977 | F1 = (33, "f1" ), |
978 | F2 = (34, "f2" ), |
979 | F3 = (35, "f3" ), |
980 | F4 = (36, "f4" ), |
981 | F5 = (37, "f5" ), |
982 | F6 = (38, "f6" ), |
983 | F7 = (39, "f7" ), |
984 | F8 = (40, "f8" ), |
985 | F9 = (41, "f9" ), |
986 | F10 = (42, "f10" ), |
987 | F11 = (43, "f11" ), |
988 | F12 = (44, "f12" ), |
989 | F13 = (45, "f13" ), |
990 | F14 = (46, "f14" ), |
991 | F15 = (47, "f15" ), |
992 | F16 = (48, "f16" ), |
993 | F17 = (49, "f17" ), |
994 | F18 = (50, "f18" ), |
995 | F19 = (51, "f19" ), |
996 | F20 = (52, "f20" ), |
997 | F21 = (53, "f21" ), |
998 | F22 = (54, "f22" ), |
999 | F23 = (55, "f23" ), |
1000 | F24 = (56, "f24" ), |
1001 | F25 = (57, "f25" ), |
1002 | F26 = (58, "f26" ), |
1003 | F27 = (59, "f27" ), |
1004 | F28 = (60, "f28" ), |
1005 | F29 = (61, "f29" ), |
1006 | F30 = (62, "f30" ), |
1007 | F31 = (63, "f31" ), |
1008 | |
1009 | LR = (65, "lr" ), |
1010 | CTR = (66, "ctr" ), |
1011 | |
1012 | CR0 = (68, "cr0" ), |
1013 | CR1 = (69, "cr1" ), |
1014 | CR2 = (70, "cr2" ), |
1015 | CR3 = (71, "cr3" ), |
1016 | CR4 = (72, "cr4" ), |
1017 | CR5 = (73, "cr5" ), |
1018 | CR6 = (74, "cr6" ), |
1019 | CR7 = (75, "cr7" ), |
1020 | XER = (76, "xer" ), |
1021 | |
1022 | VR0 = (77, "vr0" ), |
1023 | VR1 = (78, "vr1" ), |
1024 | VR2 = (79, "vr2" ), |
1025 | VR3 = (80, "vr3" ), |
1026 | VR4 = (81, "vr4" ), |
1027 | VR5 = (82, "vr5" ), |
1028 | VR6 = (83, "vr6" ), |
1029 | VR7 = (84, "vr7" ), |
1030 | VR8 = (85, "vr8" ), |
1031 | VR9 = (86, "vr9" ), |
1032 | VR10 = (87, "vr10" ), |
1033 | VR11 = (88, "vr11" ), |
1034 | VR12 = (89, "vr12" ), |
1035 | VR13 = (90, "vr13" ), |
1036 | VR14 = (91, "vr14" ), |
1037 | VR15 = (92, "vr15" ), |
1038 | VR16 = (93, "vr16" ), |
1039 | VR17 = (94, "vr17" ), |
1040 | VR18 = (95, "vr18" ), |
1041 | VR19 = (96, "vr19" ), |
1042 | VR20 = (97, "vr20" ), |
1043 | VR21 = (98, "vr21" ), |
1044 | VR22 = (99, "vr22" ), |
1045 | VR23 = (100, "vr23" ), |
1046 | VR24 = (101, "vr24" ), |
1047 | VR25 = (102, "vr25" ), |
1048 | VR26 = (103, "vr26" ), |
1049 | VR27 = (104, "vr27" ), |
1050 | VR28 = (105, "vr28" ), |
1051 | VR29 = (106, "vr29" ), |
1052 | VR30 = (107, "vr30" ), |
1053 | VR31 = (108, "vr31" ), |
1054 | |
1055 | VSCR = (110, "vscr" ), |
1056 | TFHAR = (114, "tfhar" ), |
1057 | TFIAR = (115, "tfiar" ), |
1058 | TEXASR = (116, "texasr" ), |
1059 | }); |
1060 | |
1061 | #[cfg (test)] |
1062 | mod tests { |
1063 | |
1064 | #[test ] |
1065 | #[cfg (feature = "std" )] |
1066 | fn test_aarch64_registers() { |
1067 | use super::*; |
1068 | use std::collections::HashSet; |
1069 | |
1070 | let mut names = HashSet::new(); |
1071 | for n in (0..=39).chain(46..=127) { |
1072 | let name = AArch64::register_name(Register(n)) |
1073 | .unwrap_or_else(|| panic!("Register {} should have a name." , n)); |
1074 | assert!(names.insert(name)); |
1075 | } |
1076 | } |
1077 | |
1078 | #[test ] |
1079 | #[cfg (feature = "std" )] |
1080 | fn test_power64_registers() { |
1081 | use super::*; |
1082 | use std::collections::HashSet; |
1083 | |
1084 | let mut names = HashSet::new(); |
1085 | for n in (0..=63).chain(68..=75).chain(77..=108) { |
1086 | let name = PowerPc64::register_name(Register(n)) |
1087 | .unwrap_or_else(|| panic!("Register {} should have a name." , n)); |
1088 | assert!(names.insert(name)); |
1089 | } |
1090 | } |
1091 | } |
1092 | |