1
1
use std:: fmt;
2
2
3
+ use rustc_data_structures:: fx:: FxIndexSet ;
3
4
use rustc_span:: Symbol ;
4
5
5
6
use super :: { InlineAsmArch , InlineAsmType , ModifierInfo } ;
7
+ use crate :: spec:: { RelocModel , Target } ;
6
8
7
9
def_reg_class ! {
8
10
PowerPC PowerPCInlineAsmRegClass {
9
11
reg,
10
12
reg_nonzero,
11
13
freg,
14
+ vreg,
12
15
cr,
13
16
xer,
14
17
}
@@ -48,11 +51,44 @@ impl PowerPCInlineAsmRegClass {
48
51
}
49
52
}
50
53
Self :: freg => types ! { _: F32 , F64 ; } ,
54
+ Self :: vreg => & [ ] ,
51
55
Self :: cr | Self :: xer => & [ ] ,
52
56
}
53
57
}
54
58
}
55
59
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
+
56
92
def_regs ! {
57
93
PowerPC PowerPCInlineAsmReg PowerPCInlineAsmRegClass {
58
94
r0: reg = [ "r0" , "0" ] ,
@@ -66,6 +102,7 @@ def_regs! {
66
102
r10: reg, reg_nonzero = [ "r10" , "10" ] ,
67
103
r11: reg, reg_nonzero = [ "r11" , "11" ] ,
68
104
r12: reg, reg_nonzero = [ "r12" , "12" ] ,
105
+ r13: reg, reg_nonzero = [ "r13" , "13" ] % reserved_r13,
69
106
r14: reg, reg_nonzero = [ "r14" , "14" ] ,
70
107
r15: reg, reg_nonzero = [ "r15" , "15" ] ,
71
108
r16: reg, reg_nonzero = [ "r16" , "16" ] ,
@@ -113,6 +150,38 @@ def_regs! {
113
150
f29: freg = [ "f29" , "fr29" ] ,
114
151
f30: freg = [ "f30" , "fr30" ] ,
115
152
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,
116
185
cr: cr = [ "cr" ] ,
117
186
cr0: cr = [ "cr0" ] ,
118
187
cr1: cr = [ "cr1" ] ,
@@ -127,8 +196,6 @@ def_regs! {
127
196
"the stack pointer cannot be used as an operand for inline asm" ,
128
197
#error = [ "r2" , "2" ] =>
129
198
"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" ,
132
199
#error = [ "r29" , "29" ] =>
133
200
"r29 is used internally by LLVM and cannot be used as an operand for inline asm" ,
134
201
#error = [ "r30" , "30" ] =>
@@ -163,13 +230,17 @@ impl PowerPCInlineAsmReg {
163
230
// Strip off the leading prefix.
164
231
do_emit ! {
165
232
( 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" ) ;
167
234
( r16, "16" ) , ( r17, "17" ) , ( r18, "18" ) , ( r19, "19" ) , ( r20, "20" ) , ( r21, "21" ) , ( r22, "22" ) , ( r23, "23" ) ;
168
235
( r24, "24" ) , ( r25, "25" ) , ( r26, "26" ) , ( r27, "27" ) , ( r28, "28" ) ;
169
236
( f0, "0" ) , ( f1, "1" ) , ( f2, "2" ) , ( f3, "3" ) , ( f4, "4" ) , ( f5, "5" ) , ( f6, "6" ) , ( f7, "7" ) ;
170
237
( f8, "8" ) , ( f9, "9" ) , ( f10, "10" ) , ( f11, "11" ) , ( f12, "12" ) , ( f13, "13" ) , ( f14, "14" ) , ( f15, "15" ) ;
171
238
( f16, "16" ) , ( f17, "17" ) , ( f18, "18" ) , ( f19, "19" ) , ( f20, "20" ) , ( f21, "21" ) , ( f22, "22" ) , ( f23, "23" ) ;
172
239
( 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" ) ;
173
244
( cr, "cr" ) ;
174
245
( cr0, "0" ) , ( cr1, "1" ) , ( cr2, "2" ) , ( cr3, "3" ) , ( cr4, "4" ) , ( cr5, "5" ) , ( cr6, "6" ) , ( cr7, "7" ) ;
175
246
( xer, "xer" ) ;
@@ -201,5 +272,6 @@ impl PowerPCInlineAsmReg {
201
272
reg_conflicts ! {
202
273
cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7;
203
274
}
275
+ // f0-f31 (vsr0-vsr31) and v0-v31 (vsr32-vsr63) do not conflict.
204
276
}
205
277
}
0 commit comments