@@ -7,6 +7,8 @@ def_reg_class! {
7
7
reg,
8
8
reg_nonzero,
9
9
freg,
10
+ cr,
11
+ xer,
10
12
}
11
13
}
12
14
@@ -44,6 +46,7 @@ impl PowerPCInlineAsmRegClass {
44
46
}
45
47
}
46
48
Self :: freg => types ! { _: F32 , F64 ; } ,
49
+ Self :: cr | Self :: xer => & [ ] ,
47
50
}
48
51
}
49
52
}
@@ -108,6 +111,16 @@ def_regs! {
108
111
f29: freg = [ "f29" , "fr29" ] ,
109
112
f30: freg = [ "f30" , "fr30" ] ,
110
113
f31: freg = [ "f31" , "fr31" ] ,
114
+ cr: cr = [ "cr" ] ,
115
+ cr0: cr = [ "cr0" ] ,
116
+ cr1: cr = [ "cr1" ] ,
117
+ cr2: cr = [ "cr2" ] ,
118
+ cr3: cr = [ "cr3" ] ,
119
+ cr4: cr = [ "cr4" ] ,
120
+ cr5: cr = [ "cr5" ] ,
121
+ cr6: cr = [ "cr6" ] ,
122
+ cr7: cr = [ "cr7" ] ,
123
+ xer: xer = [ "xer" ] ,
111
124
#error = [ "r1" , "1" , "sp" ] =>
112
125
"the stack pointer cannot be used as an operand for inline asm" ,
113
126
#error = [ "r2" , "2" ] =>
@@ -136,17 +149,55 @@ impl PowerPCInlineAsmReg {
136
149
_arch : InlineAsmArch ,
137
150
_modifier : Option < char > ,
138
151
) -> fmt:: Result {
152
+ macro_rules! do_emit {
153
+ (
154
+ $( $( ( $reg: ident, $value: literal) ) ,* ; ) *
155
+ ) => {
156
+ out. write_str( match self {
157
+ $( $( Self :: $reg => $value, ) * ) *
158
+ } )
159
+ } ;
160
+ }
139
161
// Strip off the leading prefix.
140
- if self as u32 <= Self :: r28 as u32 {
141
- let index = self as u32 - Self :: r28 as u32 ;
142
- write ! ( out, "{}" , index)
143
- } else if self as u32 >= Self :: f0 as u32 && self as u32 <= Self :: f31 as u32 {
144
- let index = self as u32 - Self :: f31 as u32 ;
145
- write ! ( out, "{}" , index)
146
- } else {
147
- unreachable ! ( )
162
+ do_emit ! {
163
+ ( r0, "0" ) , ( r3, "3" ) , ( r4, "4" ) , ( r5, "5" ) , ( r6, "6" ) , ( r7, "7" ) ;
164
+ ( r8, "8" ) , ( r9, "9" ) , ( r10, "10" ) , ( r11, "11" ) , ( r12, "12" ) , ( r14, "14" ) , ( r15, "15" ) ;
165
+ ( r16, "16" ) , ( r17, "17" ) , ( r18, "18" ) , ( r19, "19" ) , ( r20, "20" ) , ( r21, "21" ) , ( r22, "22" ) , ( r23, "23" ) ;
166
+ ( r24, "24" ) , ( r25, "25" ) , ( r26, "26" ) , ( r27, "27" ) , ( r28, "28" ) ;
167
+ ( f0, "0" ) , ( f1, "1" ) , ( f2, "2" ) , ( f3, "3" ) , ( f4, "4" ) , ( f5, "5" ) , ( f6, "6" ) , ( f7, "7" ) ;
168
+ ( f8, "8" ) , ( f9, "9" ) , ( f10, "10" ) , ( f11, "11" ) , ( f12, "12" ) , ( f13, "13" ) , ( f14, "14" ) , ( f15, "15" ) ;
169
+ ( f16, "16" ) , ( f17, "17" ) , ( f18, "18" ) , ( f19, "19" ) , ( f20, "20" ) , ( f21, "21" ) , ( f22, "22" ) , ( f23, "23" ) ;
170
+ ( f24, "24" ) , ( f25, "25" ) , ( f26, "26" ) , ( f27, "27" ) , ( f28, "28" ) , ( f29, "29" ) , ( f30, "30" ) , ( f31, "31" ) ;
171
+ ( cr, "cr" ) ;
172
+ ( cr0, "0" ) , ( cr1, "1" ) , ( cr2, "2" ) , ( cr3, "3" ) , ( cr4, "4" ) , ( cr5, "5" ) , ( cr6, "6" ) , ( cr7, "7" ) ;
173
+ ( xer, "xer" ) ;
148
174
}
149
175
}
150
176
151
- pub fn overlapping_regs ( self , mut _cb : impl FnMut ( PowerPCInlineAsmReg ) ) { }
177
+ pub fn overlapping_regs ( self , mut cb : impl FnMut ( PowerPCInlineAsmReg ) ) {
178
+ macro_rules! reg_conflicts {
179
+ (
180
+ $(
181
+ $full: ident : $( $field: ident) *
182
+ ) ,* ;
183
+ ) => {
184
+ match self {
185
+ $(
186
+ Self :: $full => {
187
+ cb( Self :: $full) ;
188
+ $( cb( Self :: $field) ; ) *
189
+ }
190
+ $( Self :: $field) |* => {
191
+ cb( Self :: $full) ;
192
+ cb( self ) ;
193
+ }
194
+ ) *
195
+ r => cb( r) ,
196
+ }
197
+ } ;
198
+ }
199
+ reg_conflicts ! {
200
+ cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7;
201
+ }
202
+ }
152
203
}
0 commit comments