rustc_target/asm/
loongarch.rs

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
46// The reserved registers are taken from <https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/LoongArch/LoongArchRegisterInfo.cpp#79>
47def_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}