1use std::fmt;
2
3use rustc_span::Symbol;
4
5use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
6
7def_reg_class! {
8 CSKY CSKYInlineAsmRegClass {
9 reg,
10 freg,
11 }
12}
13
14impl CSKYInlineAsmRegClass {
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; },
41 Self::freg => types! { _: F32; },
42 }
43 }
44}
45
46def_regs! {
48 CSKY CSKYInlineAsmReg CSKYInlineAsmRegClass {
49 r0: reg = ["r0","a0"],
50 r1: reg = ["r1","a1"],
51 r2: reg = ["r2","a2"],
52 r3: reg = ["r3","a3"],
53 r4: reg = ["r4","l0"],
54 r5: reg = ["r5","l1"],
55 r6: reg = ["r6","l2"],
56 r9: reg = ["r9","l5"],r10: reg = ["r10","l6"],r11: reg = ["r11","l7"],r12: reg = ["r12","t0"],r13: reg = ["r13","t1"],r16: reg = ["r16","l8"],r17: reg = ["r17","l9"],r18: reg = ["r18","t2"],r19: reg = ["r19","t3"],r20: reg = ["r20","t4"],r21: reg = ["r21","t5"],r22: reg = ["r22","t6"],r23: reg = ["r23","t7"],r24: reg = ["r24","t8"],r25: reg = ["r25","t9"],f0: freg = ["fr0","vr0"],
72 f1: freg = ["fr1","vr1"],
73 f2: freg = ["fr2","vr2"],
74 f3: freg = ["fr3","vr3"],
75 f4: freg = ["fr4","vr4"],
76 f5: freg = ["fr5","vr5"],
77 f6: freg = ["fr6","vr6"],
78 f7: freg = ["fr7","vr7"],
79 f8: freg = ["fr8","vr8"],
80 f9: freg = ["fr9","vr9"],
81 f10: freg = ["fr10","vr10"],
82 f11: freg = ["fr11","vr11"],
83 f12: freg = ["fr12","vr12"],
84 f13: freg = ["fr13","vr13"],
85 f14: freg = ["fr14","vr14"],
86 f15: freg = ["fr15","vr15"],
87 f16: freg = ["fr16","vr16"],
88 f17: freg = ["fr17","vr17"],
89 f18: freg = ["fr18","vr18"],
90 f19: freg = ["fr19","vr19"],
91 f20: freg = ["fr20","vr20"],
92 f21: freg = ["fr21","vr21"],
93 f22: freg = ["fr22","vr22"],
94 f23: freg = ["fr23","vr23"],
95 f24: freg = ["fr24","vr24"],
96 f25: freg = ["fr25","vr25"],
97 f26: freg = ["fr26","vr26"],
98 f27: freg = ["fr27","vr27"],
99 f28: freg = ["fr28","vr28"],
100 f29: freg = ["fr29","vr29"],
101 f30: freg = ["fr30","vr30"],
102 f31: freg = ["fr31","vr31"],
103 #error = ["r7", "l3"] =>
104 "the base pointer cannot be used as an operand for inline asm",
105 #error = ["r8","l4"] =>
106 "the frame pointer cannot be used as an operand for inline asm",
107 #error = ["r14","sp"] =>
108 "the stack pointer cannot be used as an operand for inline asm",
109 #error = ["r15","lr"] =>
110 "the link register cannot be used as an operand for inline asm",
111 #error = ["r31","tls"] =>
112 "reserver for tls",
113 #error = ["r28", "gb", "rgb", "rdb"] =>
114 "the global pointer cannot be used as an operand for inline asm",
115 #error = ["r26","r27","r29","tb", "rtb", "r30","svbr"] =>
116 "reserved by the ABI",
117 }
118}
119
120impl CSKYInlineAsmReg {
121 pub fn emit(
122 self,
123 out: &mut dyn fmt::Write,
124 _arch: InlineAsmArch,
125 _modifier: Option<char>,
126 ) -> fmt::Result {
127 out.write_str(self.name())
128 }
129}