@@ -7,6 +7,8 @@ def_reg_class! {
77 reg,
88 reg_nonzero,
99 freg,
10+ cr,
11+ xer,
1012 }
1113}
1214
@@ -44,6 +46,7 @@ impl PowerPCInlineAsmRegClass {
4446 }
4547 }
4648 Self :: freg => types ! { _: F32 , F64 ; } ,
49+ Self :: cr | Self :: xer => & [ ] ,
4750 }
4851 }
4952}
@@ -108,6 +111,16 @@ def_regs! {
108111 f29: freg = [ "f29" , "fr29" ] ,
109112 f30: freg = [ "f30" , "fr30" ] ,
110113 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" ] ,
111124 #error = [ "r1" , "1" , "sp" ] =>
112125 "the stack pointer cannot be used as an operand for inline asm" ,
113126 #error = [ "r2" , "2" ] =>
@@ -136,17 +149,55 @@ impl PowerPCInlineAsmReg {
136149 _arch : InlineAsmArch ,
137150 _modifier : Option < char > ,
138151 ) -> 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+ }
139161 // 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" ) ;
148174 }
149175 }
150176
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+ }
152203}
0 commit comments