1use std::fmt;
2
3use rustc_span::Symbol;
4
5use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
6
7def_reg_class! {
8 LoongArch LoongArchInlineAsmRegClass {
9 reg,
10 freg,
11 }
12}
13
14impl LoongArchInlineAsmRegClass {
15 pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] {
16 &[]
17 }
18
19 pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> {
20 None
21 }
22
23 pub fn suggest_modifier(
24 self,
25 _arch: InlineAsmArch,
26 _ty: InlineAsmType,
27 ) -> Option<ModifierInfo> {
28 None
29 }
30
31 pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
32 None
33 }
34
35 pub fn supported_types(
36 self,
37 _arch: InlineAsmArch,
38 ) -> &'static [(InlineAsmType, Option<Symbol>)] {
39 match self {
40 Self::reg => types! { _: I8, I16, I32, I64, F32, F64; },
41 Self::freg => types! { f: F32; d: F64; },
42 }
43 }
44}
45
46def_regs! {
48 LoongArch LoongArchInlineAsmReg LoongArchInlineAsmRegClass {
49 r1: reg = ["$r1","$ra"],
50 r4: reg = ["$r4","$a0"],
51 r5: reg = ["$r5","$a1"],
52 r6: reg = ["$r6","$a2"],
53 r7: reg = ["$r7","$a3"],
54 r8: reg = ["$r8","$a4"],
55 r9: reg = ["$r9","$a5"],
56 r10: reg = ["$r10","$a6"],
57 r11: reg = ["$r11","$a7"],
58 r12: reg = ["$r12","$t0"],
59 r13: reg = ["$r13","$t1"],
60 r14: reg = ["$r14","$t2"],
61 r15: reg = ["$r15","$t3"],
62 r16: reg = ["$r16","$t4"],
63 r17: reg = ["$r17","$t5"],
64 r18: reg = ["$r18","$t6"],
65 r19: reg = ["$r19","$t7"],
66 r20: reg = ["$r20","$t8"],
67 r23: reg = ["$r23","$s0"],
68 r24: reg = ["$r24","$s1"],
69 r25: reg = ["$r25","$s2"],
70 r26: reg = ["$r26","$s3"],
71 r27: reg = ["$r27","$s4"],
72 r28: reg = ["$r28","$s5"],
73 r29: reg = ["$r29","$s6"],
74 r30: reg = ["$r30","$s7"],
75 f0: freg = ["$f0","$fa0"],
76 f1: freg = ["$f1","$fa1"],
77 f2: freg = ["$f2","$fa2"],
78 f3: freg = ["$f3","$fa3"],
79 f4: freg = ["$f4","$fa4"],
80 f5: freg = ["$f5","$fa5"],
81 f6: freg = ["$f6","$fa6"],
82 f7: freg = ["$f7","$fa7"],
83 f8: freg = ["$f8","$ft0"],
84 f9: freg = ["$f9","$ft1"],
85 f10: freg = ["$f10","$ft2"],
86 f11: freg = ["$f11","$ft3"],
87 f12: freg = ["$f12","$ft4"],
88 f13: freg = ["$f13","$ft5"],
89 f14: freg = ["$f14","$ft6"],
90 f15: freg = ["$f15","$ft7"],
91 f16: freg = ["$f16","$ft8"],
92 f17: freg = ["$f17","$ft9"],
93 f18: freg = ["$f18","$ft10"],
94 f19: freg = ["$f19","$ft11"],
95 f20: freg = ["$f20","$ft12"],
96 f21: freg = ["$f21","$ft13"],
97 f22: freg = ["$f22","$ft14"],
98 f23: freg = ["$f23","$ft15"],
99 f24: freg = ["$f24","$fs0"],
100 f25: freg = ["$f25","$fs1"],
101 f26: freg = ["$f26","$fs2"],
102 f27: freg = ["$f27","$fs3"],
103 f28: freg = ["$f28","$fs4"],
104 f29: freg = ["$f29","$fs5"],
105 f30: freg = ["$f30","$fs6"],
106 f31: freg = ["$f31","$fs7"],
107 #error = ["$r0","$zero"] =>
108 "constant zero cannot be used as an operand for inline asm",
109 #error = ["$r2","$tp"] =>
110 "reserved for TLS",
111 #error = ["$r3","$sp"] =>
112 "the stack pointer cannot be used as an operand for inline asm",
113 #error = ["$r21"] =>
114 "reserved by the ABI",
115 #error = ["$r22","$fp"] =>
116 "the frame pointer cannot be used as an operand for inline asm",
117 #error = ["$r31","$s8"] =>
118 "$r31 is used internally by LLVM and cannot be used as an operand for inline asm",
119 }
120}
121
122impl LoongArchInlineAsmReg {
123 pub fn emit(
124 self,
125 out: &mut dyn fmt::Write,
126 _arch: InlineAsmArch,
127 _modifier: Option<char>,
128 ) -> fmt::Result {
129 out.write_str(self.name())
130 }
131}