1 use super::{InlineAsmArch, InlineAsmType};
2 use rustc_macros::HashStable_Generic;
3 use rustc_span::Symbol;
7 PowerPC PowerPCInlineAsmRegClass {
16 impl PowerPCInlineAsmRegClass {
17 pub fn valid_modifiers(self, _arch: super::InlineAsmArch) -> &'static [char] {
21 pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<Self> {
25 pub fn suggest_modifier(
29 ) -> Option<(char, &'static str)> {
33 pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> {
37 pub fn supported_types(
40 ) -> &'static [(InlineAsmType, Option<Symbol>)] {
42 Self::reg | Self::reg_nonzero => {
43 if arch == InlineAsmArch::PowerPC {
44 types! { _: I8, I16, I32; }
46 types! { _: I8, I16, I32, I64; }
49 Self::freg => types! { _: F32, F64; },
50 Self::cr | Self::xer => &[],
56 PowerPC PowerPCInlineAsmReg PowerPCInlineAsmRegClass {
57 r0: reg = ["r0", "0"],
58 r3: reg, reg_nonzero = ["r3", "3"],
59 r4: reg, reg_nonzero = ["r4", "4"],
60 r5: reg, reg_nonzero = ["r5", "5"],
61 r6: reg, reg_nonzero = ["r6", "6"],
62 r7: reg, reg_nonzero = ["r7", "7"],
63 r8: reg, reg_nonzero = ["r8", "8"],
64 r9: reg, reg_nonzero = ["r9", "9"],
65 r10: reg, reg_nonzero = ["r10", "10"],
66 r11: reg, reg_nonzero = ["r11", "11"],
67 r12: reg, reg_nonzero = ["r12", "12"],
68 r14: reg, reg_nonzero = ["r14", "14"],
69 r15: reg, reg_nonzero = ["r15", "15"],
70 r16: reg, reg_nonzero = ["r16", "16"],
71 r17: reg, reg_nonzero = ["r17", "17"],
72 r18: reg, reg_nonzero = ["r18", "18"],
73 r19: reg, reg_nonzero = ["r19", "19"],
74 r20: reg, reg_nonzero = ["r20", "20"],
75 r21: reg, reg_nonzero = ["r21", "21"],
76 r22: reg, reg_nonzero = ["r22", "22"],
77 r23: reg, reg_nonzero = ["r23", "23"],
78 r24: reg, reg_nonzero = ["r24", "24"],
79 r25: reg, reg_nonzero = ["r25", "25"],
80 r26: reg, reg_nonzero = ["r26", "26"],
81 r27: reg, reg_nonzero = ["r27", "27"],
82 r28: reg, reg_nonzero = ["r28", "28"],
83 f0: freg = ["f0", "fr0"],
84 f1: freg = ["f1", "fr1"],
85 f2: freg = ["f2", "fr2"],
86 f3: freg = ["f3", "fr3"],
87 f4: freg = ["f4", "fr4"],
88 f5: freg = ["f5", "fr5"],
89 f6: freg = ["f6", "fr6"],
90 f7: freg = ["f7", "fr7"],
91 f8: freg = ["f8", "fr8"],
92 f9: freg = ["f9", "fr9"],
93 f10: freg = ["f10", "fr10"],
94 f11: freg = ["f11", "fr11"],
95 f12: freg = ["f12", "fr12"],
96 f13: freg = ["f13", "fr13"],
97 f14: freg = ["f14", "fr14"],
98 f15: freg = ["f15", "fr15"],
99 f16: freg = ["f16", "fr16"],
100 f17: freg = ["f17", "fr17"],
101 f18: freg = ["f18", "fr18"],
102 f19: freg = ["f19", "fr19"],
103 f20: freg = ["f20", "fr20"],
104 f21: freg = ["f21", "fr21"],
105 f22: freg = ["f22", "fr22"],
106 f23: freg = ["f23", "fr23"],
107 f24: freg = ["f24", "fr24"],
108 f25: freg = ["f25", "fr25"],
109 f26: freg = ["f26", "fr26"],
110 f27: freg = ["f27", "fr27"],
111 f28: freg = ["f28", "fr28"],
112 f29: freg = ["f29", "fr29"],
113 f30: freg = ["f30", "fr30"],
114 f31: freg = ["f31", "fr31"],
125 #error = ["r1", "1", "sp"] =>
126 "the stack pointer cannot be used as an operand for inline asm",
127 #error = ["r2", "2"] =>
128 "r2 is a system reserved register and cannot be used as an operand for inline asm",
129 #error = ["r13", "13"] =>
130 "r13 is a system reserved register and cannot be used as an operand for inline asm",
131 #error = ["r29", "29"] =>
132 "r29 is used internally by LLVM and cannot be used as an operand for inline asm",
133 #error = ["r30", "30"] =>
134 "r30 is used internally by LLVM and cannot be used as an operand for inline asm",
135 #error = ["r31", "31", "fp"] =>
136 "the frame pointer cannot be used as an operand for inline asm",
138 "the link register cannot be used as an operand for inline asm",
140 "the counter register cannot be used as an operand for inline asm",
141 #error = ["vrsave"] =>
142 "the vrsave register cannot be used as an operand for inline asm",
146 impl PowerPCInlineAsmReg {
149 out: &mut dyn fmt::Write,
150 _arch: InlineAsmArch,
151 _modifier: Option<char>,
153 macro_rules! do_emit {
155 $($(($reg:ident, $value:literal)),*;)*
157 out.write_str(match self {
158 $($(Self::$reg => $value,)*)*
162 // Strip off the leading prefix.
164 (r0, "0"), (r3, "3"), (r4, "4"), (r5, "5"), (r6, "6"), (r7, "7");
165 (r8, "8"), (r9, "9"), (r10, "10"), (r11, "11"), (r12, "12"), (r14, "14"), (r15, "15");
166 (r16, "16"), (r17, "17"), (r18, "18"), (r19, "19"), (r20, "20"), (r21, "21"), (r22, "22"), (r23, "23");
167 (r24, "24"), (r25, "25"), (r26, "26"), (r27, "27"), (r28, "28");
168 (f0, "0"), (f1, "1"), (f2, "2"), (f3, "3"), (f4, "4"), (f5, "5"), (f6, "6"), (f7, "7");
169 (f8, "8"), (f9, "9"), (f10, "10"), (f11, "11"), (f12, "12"), (f13, "13"), (f14, "14"), (f15, "15");
170 (f16, "16"), (f17, "17"), (f18, "18"), (f19, "19"), (f20, "20"), (f21, "21"), (f22, "22"), (f23, "23");
171 (f24, "24"), (f25, "25"), (f26, "26"), (f27, "27"), (f28, "28"), (f29, "29"), (f30, "30"), (f31, "31");
173 (cr0, "0"), (cr1, "1"), (cr2, "2"), (cr3, "3"), (cr4, "4"), (cr5, "5"), (cr6, "6"), (cr7, "7");
178 pub fn overlapping_regs(self, mut cb: impl FnMut(PowerPCInlineAsmReg)) {
179 macro_rules! reg_conflicts {
182 $full:ident : $($field:ident)*
189 $(cb(Self::$field);)*
191 $(Self::$field)|* => {
201 cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7;