rustc_target/asm/
hexagon.rs

1use std::fmt;
2
3use rustc_span::Symbol;
4
5use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
6
7def_reg_class! {
8    Hexagon HexagonInlineAsmRegClass {
9        reg,
10        preg,
11    }
12}
13
14impl HexagonInlineAsmRegClass {
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, F32; },
41            Self::preg => &[],
42        }
43    }
44}
45
46def_regs! {
47    Hexagon HexagonInlineAsmReg HexagonInlineAsmRegClass {
48        r0: reg = ["r0"],
49        r1: reg = ["r1"],
50        r2: reg = ["r2"],
51        r3: reg = ["r3"],
52        r4: reg = ["r4"],
53        r5: reg = ["r5"],
54        r6: reg = ["r6"],
55        r7: reg = ["r7"],
56        r8: reg = ["r8"],
57        r9: reg = ["r9"],
58        r10: reg = ["r10"],
59        r11: reg = ["r11"],
60        r12: reg = ["r12"],
61        r13: reg = ["r13"],
62        r14: reg = ["r14"],
63        r15: reg = ["r15"],
64        r16: reg = ["r16"],
65        r17: reg = ["r17"],
66        r18: reg = ["r18"],
67        r20: reg = ["r20"],
68        r21: reg = ["r21"],
69        r22: reg = ["r22"],
70        r23: reg = ["r23"],
71        r24: reg = ["r24"],
72        r25: reg = ["r25"],
73        r26: reg = ["r26"],
74        r27: reg = ["r27"],
75        r28: reg = ["r28"],
76        p0: preg = ["p0"],
77        p1: preg = ["p1"],
78        p2: preg = ["p2"],
79        p3: preg = ["p3"],
80        #error = ["r19"] =>
81            "r19 is used internally by LLVM and cannot be used as an operand for inline asm",
82        #error = ["r29", "sp"] =>
83            "the stack pointer cannot be used as an operand for inline asm",
84        #error = ["r30", "fr"] =>
85            "the frame register cannot be used as an operand for inline asm",
86        #error = ["r31", "lr"] =>
87            "the link register cannot be used as an operand for inline asm",
88    }
89}
90
91impl HexagonInlineAsmReg {
92    pub fn emit(
93        self,
94        out: &mut dyn fmt::Write,
95        _arch: InlineAsmArch,
96        _modifier: Option<char>,
97    ) -> fmt::Result {
98        out.write_str(self.name())
99    }
100
101    pub fn overlapping_regs(self, mut _cb: impl FnMut(HexagonInlineAsmReg)) {}
102}