11use std:: fmt;
22
3+ use rustc_data_structures:: fx:: FxIndexSet ;
34use rustc_span:: Symbol ;
45
56use super :: { InlineAsmArch , InlineAsmType , ModifierInfo } ;
7+ use crate :: spec:: { RelocModel , Target } ;
68
79def_reg_class ! {
810 PowerPC PowerPCInlineAsmRegClass {
911 reg,
1012 reg_nonzero,
1113 freg,
14+ vreg,
1215 cr,
1316 xer,
1417 }
@@ -48,11 +51,44 @@ impl PowerPCInlineAsmRegClass {
4851 }
4952 }
5053 Self :: freg => types ! { _: F32 , F64 ; } ,
54+ Self :: vreg => & [ ] ,
5155 Self :: cr | Self :: xer => & [ ] ,
5256 }
5357 }
5458}
5559
60+ fn reserved_r13 (
61+ arch : InlineAsmArch ,
62+ _reloc_model : RelocModel ,
63+ _target_features : & FxIndexSet < Symbol > ,
64+ target : & Target ,
65+ _is_clobber : bool ,
66+ ) -> Result < ( ) , & ' static str > {
67+ if target. is_like_aix && arch == InlineAsmArch :: PowerPC {
68+ Ok ( ( ) )
69+ } else {
70+ Err ( "r13 is a reserved register on this target" )
71+ }
72+ }
73+
74+ fn reserved_v20to31 (
75+ _arch : InlineAsmArch ,
76+ _reloc_model : RelocModel ,
77+ _target_features : & FxIndexSet < Symbol > ,
78+ target : & Target ,
79+ _is_clobber : bool ,
80+ ) -> Result < ( ) , & ' static str > {
81+ if target. is_like_aix {
82+ match & * target. options . abi {
83+ "vec-default" => Err ( "v20-v31 are reserved on vec-default ABI" ) ,
84+ "vec-extabi" => Ok ( ( ) ) ,
85+ _ => unreachable ! ( "unrecognized AIX ABI" ) ,
86+ }
87+ } else {
88+ Ok ( ( ) )
89+ }
90+ }
91+
5692def_regs ! {
5793 PowerPC PowerPCInlineAsmReg PowerPCInlineAsmRegClass {
5894 r0: reg = [ "r0" , "0" ] ,
@@ -66,6 +102,7 @@ def_regs! {
66102 r10: reg, reg_nonzero = [ "r10" , "10" ] ,
67103 r11: reg, reg_nonzero = [ "r11" , "11" ] ,
68104 r12: reg, reg_nonzero = [ "r12" , "12" ] ,
105+ r13: reg, reg_nonzero = [ "r13" , "13" ] % reserved_r13,
69106 r14: reg, reg_nonzero = [ "r14" , "14" ] ,
70107 r15: reg, reg_nonzero = [ "r15" , "15" ] ,
71108 r16: reg, reg_nonzero = [ "r16" , "16" ] ,
@@ -113,6 +150,38 @@ def_regs! {
113150 f29: freg = [ "f29" , "fr29" ] ,
114151 f30: freg = [ "f30" , "fr30" ] ,
115152 f31: freg = [ "f31" , "fr31" ] ,
153+ v0: vreg = [ "v0" ] ,
154+ v1: vreg = [ "v1" ] ,
155+ v2: vreg = [ "v2" ] ,
156+ v3: vreg = [ "v3" ] ,
157+ v4: vreg = [ "v4" ] ,
158+ v5: vreg = [ "v5" ] ,
159+ v6: vreg = [ "v6" ] ,
160+ v7: vreg = [ "v7" ] ,
161+ v8: vreg = [ "v8" ] ,
162+ v9: vreg = [ "v9" ] ,
163+ v10: vreg = [ "v10" ] ,
164+ v11: vreg = [ "v11" ] ,
165+ v12: vreg = [ "v12" ] ,
166+ v13: vreg = [ "v13" ] ,
167+ v14: vreg = [ "v14" ] ,
168+ v15: vreg = [ "v15" ] ,
169+ v16: vreg = [ "v16" ] ,
170+ v17: vreg = [ "v17" ] ,
171+ v18: vreg = [ "v18" ] ,
172+ v19: vreg = [ "v19" ] ,
173+ v20: vreg = [ "v20" ] % reserved_v20to31,
174+ v21: vreg = [ "v21" ] % reserved_v20to31,
175+ v22: vreg = [ "v22" ] % reserved_v20to31,
176+ v23: vreg = [ "v23" ] % reserved_v20to31,
177+ v24: vreg = [ "v24" ] % reserved_v20to31,
178+ v25: vreg = [ "v25" ] % reserved_v20to31,
179+ v26: vreg = [ "v26" ] % reserved_v20to31,
180+ v27: vreg = [ "v27" ] % reserved_v20to31,
181+ v28: vreg = [ "v28" ] % reserved_v20to31,
182+ v29: vreg = [ "v29" ] % reserved_v20to31,
183+ v30: vreg = [ "v30" ] % reserved_v20to31,
184+ v31: vreg = [ "v31" ] % reserved_v20to31,
116185 cr: cr = [ "cr" ] ,
117186 cr0: cr = [ "cr0" ] ,
118187 cr1: cr = [ "cr1" ] ,
@@ -127,8 +196,6 @@ def_regs! {
127196 "the stack pointer cannot be used as an operand for inline asm" ,
128197 #error = [ "r2" , "2" ] =>
129198 "r2 is a system reserved register and cannot be used as an operand for inline asm" ,
130- #error = [ "r13" , "13" ] =>
131- "r13 is a system reserved register and cannot be used as an operand for inline asm" ,
132199 #error = [ "r29" , "29" ] =>
133200 "r29 is used internally by LLVM and cannot be used as an operand for inline asm" ,
134201 #error = [ "r30" , "30" ] =>
@@ -163,13 +230,17 @@ impl PowerPCInlineAsmReg {
163230 // Strip off the leading prefix.
164231 do_emit ! {
165232 ( r0, "0" ) , ( r3, "3" ) , ( r4, "4" ) , ( r5, "5" ) , ( r6, "6" ) , ( r7, "7" ) ;
166- ( r8, "8" ) , ( r9, "9" ) , ( r10, "10" ) , ( r11, "11" ) , ( r12, "12" ) , ( r14, "14" ) , ( r15, "15" ) ;
233+ ( r8, "8" ) , ( r9, "9" ) , ( r10, "10" ) , ( r11, "11" ) , ( r12, "12" ) , ( r13 , "13" ) , ( r14, "14" ) , ( r15, "15" ) ;
167234 ( r16, "16" ) , ( r17, "17" ) , ( r18, "18" ) , ( r19, "19" ) , ( r20, "20" ) , ( r21, "21" ) , ( r22, "22" ) , ( r23, "23" ) ;
168235 ( r24, "24" ) , ( r25, "25" ) , ( r26, "26" ) , ( r27, "27" ) , ( r28, "28" ) ;
169236 ( f0, "0" ) , ( f1, "1" ) , ( f2, "2" ) , ( f3, "3" ) , ( f4, "4" ) , ( f5, "5" ) , ( f6, "6" ) , ( f7, "7" ) ;
170237 ( f8, "8" ) , ( f9, "9" ) , ( f10, "10" ) , ( f11, "11" ) , ( f12, "12" ) , ( f13, "13" ) , ( f14, "14" ) , ( f15, "15" ) ;
171238 ( f16, "16" ) , ( f17, "17" ) , ( f18, "18" ) , ( f19, "19" ) , ( f20, "20" ) , ( f21, "21" ) , ( f22, "22" ) , ( f23, "23" ) ;
172239 ( f24, "24" ) , ( f25, "25" ) , ( f26, "26" ) , ( f27, "27" ) , ( f28, "28" ) , ( f29, "29" ) , ( f30, "30" ) , ( f31, "31" ) ;
240+ ( v0, "0" ) , ( v1, "1" ) , ( v2, "2" ) , ( v3, "3" ) , ( v4, "4" ) , ( v5, "5" ) , ( v6, "6" ) , ( v7, "7" ) ;
241+ ( v8, "8" ) , ( v9, "9" ) , ( v10, "10" ) , ( v11, "11" ) , ( v12, "12" ) , ( v13, "13" ) , ( v14, "14" ) , ( v15, "15" ) ;
242+ ( v16, "16" ) , ( v17, "17" ) , ( v18, "18" ) , ( v19, "19" ) , ( v20, "20" ) , ( v21, "21" ) , ( v22, "22" ) , ( v23, "23" ) ;
243+ ( v24, "24" ) , ( v25, "25" ) , ( v26, "26" ) , ( v27, "27" ) , ( v28, "28" ) , ( v29, "29" ) , ( v30, "30" ) , ( v31, "31" ) ;
173244 ( cr, "cr" ) ;
174245 ( cr0, "0" ) , ( cr1, "1" ) , ( cr2, "2" ) , ( cr3, "3" ) , ( cr4, "4" ) , ( cr5, "5" ) , ( cr6, "6" ) , ( cr7, "7" ) ;
175246 ( xer, "xer" ) ;
@@ -201,5 +272,6 @@ impl PowerPCInlineAsmReg {
201272 reg_conflicts ! {
202273 cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7;
203274 }
275+ // f0-f31 (vsr0-vsr31) and v0-v31 (vsr32-vsr63) do not conflict.
204276 }
205277}
0 commit comments