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}