@@ -12,6 +12,7 @@ def_reg_class! {
12
12
reg_nonzero,
13
13
freg,
14
14
vreg,
15
+ vsreg,
15
16
cr,
16
17
ctr,
17
18
lr,
@@ -58,6 +59,10 @@ impl PowerPCInlineAsmRegClass {
58
59
altivec: VecI8 ( 16 ) , VecI16 ( 8 ) , VecI32 ( 4 ) , VecF32 ( 4 ) ;
59
60
vsx: F32 , F64 , VecI64 ( 2 ) , VecF64 ( 2 ) ;
60
61
} ,
62
+ // VSX is a superset of altivec.
63
+ Self :: vsreg => types ! {
64
+ vsx: F32 , F64 , VecI8 ( 16 ) , VecI16 ( 8 ) , VecI32 ( 4 ) , VecI64 ( 2 ) , VecF32 ( 4 ) , VecF64 ( 2 ) ;
65
+ } ,
61
66
Self :: cr | Self :: ctr | Self :: lr | Self :: xer => & [ ] ,
62
67
}
63
68
}
@@ -86,7 +91,7 @@ fn reserved_v20to31(
86
91
) -> Result < ( ) , & ' static str > {
87
92
if target. is_like_aix {
88
93
match & * target. options . abi {
89
- "vec-default" => Err ( "v20-v31 are reserved on vec-default ABI" ) ,
94
+ "vec-default" => Err ( "v20-v31 (vs52-vs63) are reserved on vec-default ABI" ) ,
90
95
"vec-extabi" => Ok ( ( ) ) ,
91
96
_ => unreachable ! ( "unrecognized AIX ABI" ) ,
92
97
}
@@ -188,6 +193,71 @@ def_regs! {
188
193
v29: vreg = [ "v29" ] % reserved_v20to31,
189
194
v30: vreg = [ "v30" ] % reserved_v20to31,
190
195
v31: vreg = [ "v31" ] % reserved_v20to31,
196
+ vs0: vsreg = [ "vs0" ] ,
197
+ vs1: vsreg = [ "vs1" ] ,
198
+ vs2: vsreg = [ "vs2" ] ,
199
+ vs3: vsreg = [ "vs3" ] ,
200
+ vs4: vsreg = [ "vs4" ] ,
201
+ vs5: vsreg = [ "vs5" ] ,
202
+ vs6: vsreg = [ "vs6" ] ,
203
+ vs7: vsreg = [ "vs7" ] ,
204
+ vs8: vsreg = [ "vs8" ] ,
205
+ vs9: vsreg = [ "vs9" ] ,
206
+ vs10: vsreg = [ "vs10" ] ,
207
+ vs11: vsreg = [ "vs11" ] ,
208
+ vs12: vsreg = [ "vs12" ] ,
209
+ vs13: vsreg = [ "vs13" ] ,
210
+ vs14: vsreg = [ "vs14" ] ,
211
+ vs15: vsreg = [ "vs15" ] ,
212
+ vs16: vsreg = [ "vs16" ] ,
213
+ vs17: vsreg = [ "vs17" ] ,
214
+ vs18: vsreg = [ "vs18" ] ,
215
+ vs19: vsreg = [ "vs19" ] ,
216
+ vs20: vsreg = [ "vs20" ] ,
217
+ vs21: vsreg = [ "vs21" ] ,
218
+ vs22: vsreg = [ "vs22" ] ,
219
+ vs23: vsreg = [ "vs23" ] ,
220
+ vs24: vsreg = [ "vs24" ] ,
221
+ vs25: vsreg = [ "vs25" ] ,
222
+ vs26: vsreg = [ "vs26" ] ,
223
+ vs27: vsreg = [ "vs27" ] ,
224
+ vs28: vsreg = [ "vs28" ] ,
225
+ vs29: vsreg = [ "vs29" ] ,
226
+ vs30: vsreg = [ "vs30" ] ,
227
+ vs31: vsreg = [ "vs31" ] ,
228
+ vs32: vsreg = [ "vs32" ] ,
229
+ vs33: vsreg = [ "vs33" ] ,
230
+ vs34: vsreg = [ "vs34" ] ,
231
+ vs35: vsreg = [ "vs35" ] ,
232
+ vs36: vsreg = [ "vs36" ] ,
233
+ vs37: vsreg = [ "vs37" ] ,
234
+ vs38: vsreg = [ "vs38" ] ,
235
+ vs39: vsreg = [ "vs39" ] ,
236
+ vs40: vsreg = [ "vs40" ] ,
237
+ vs41: vsreg = [ "vs41" ] ,
238
+ vs42: vsreg = [ "vs42" ] ,
239
+ vs43: vsreg = [ "vs43" ] ,
240
+ vs44: vsreg = [ "vs44" ] ,
241
+ vs45: vsreg = [ "vs45" ] ,
242
+ vs46: vsreg = [ "vs46" ] ,
243
+ vs47: vsreg = [ "vs47" ] ,
244
+ vs48: vsreg = [ "vs48" ] ,
245
+ vs49: vsreg = [ "vs49" ] ,
246
+ vs50: vsreg = [ "vs50" ] ,
247
+ vs51: vsreg = [ "vs51" ] ,
248
+ // vs52 - vs63 are aliases of v20-v31.
249
+ vs52: vsreg = [ "vs52" ] % reserved_v20to31,
250
+ vs53: vsreg = [ "vs53" ] % reserved_v20to31,
251
+ vs54: vsreg = [ "vs54" ] % reserved_v20to31,
252
+ vs55: vsreg = [ "vs55" ] % reserved_v20to31,
253
+ vs56: vsreg = [ "vs56" ] % reserved_v20to31,
254
+ vs57: vsreg = [ "vs57" ] % reserved_v20to31,
255
+ vs58: vsreg = [ "vs58" ] % reserved_v20to31,
256
+ vs59: vsreg = [ "vs59" ] % reserved_v20to31,
257
+ vs60: vsreg = [ "vs60" ] % reserved_v20to31,
258
+ vs61: vsreg = [ "vs61" ] % reserved_v20to31,
259
+ vs62: vsreg = [ "vs62" ] % reserved_v20to31,
260
+ vs63: vsreg = [ "vs63" ] % reserved_v20to31,
191
261
cr: cr = [ "cr" ] ,
192
262
cr0: cr = [ "cr0" ] ,
193
263
cr1: cr = [ "cr1" ] ,
@@ -245,6 +315,15 @@ impl PowerPCInlineAsmReg {
245
315
( v8, "8" ) , ( v9, "9" ) , ( v10, "10" ) , ( v11, "11" ) , ( v12, "12" ) , ( v13, "13" ) , ( v14, "14" ) , ( v15, "15" ) ;
246
316
( v16, "16" ) , ( v17, "17" ) , ( v18, "18" ) , ( v19, "19" ) , ( v20, "20" ) , ( v21, "21" ) , ( v22, "22" ) , ( v23, "23" ) ;
247
317
( v24, "24" ) , ( v25, "25" ) , ( v26, "26" ) , ( v27, "27" ) , ( v28, "28" ) , ( v29, "29" ) , ( v30, "30" ) , ( v31, "31" ) ;
318
+ ( vs0, "0" ) , ( vs1, "1" ) , ( vs2, "2" ) , ( vs3, "3" ) , ( vs4, "4" ) , ( vs5, "5" ) , ( vs6, "6" ) , ( vs7, "7" ) ,
319
+ ( vs8, "8" ) , ( vs9, "9" ) , ( vs10, "10" ) , ( vs11, "11" ) , ( vs12, "12" ) , ( vs13, "13" ) , ( vs14, "14" ) ,
320
+ ( vs15, "15" ) , ( vs16, "16" ) , ( vs17, "17" ) , ( vs18, "18" ) , ( vs19, "19" ) , ( vs20, "20" ) , ( vs21, "21" ) ,
321
+ ( vs22, "22" ) , ( vs23, "23" ) , ( vs24, "24" ) , ( vs25, "25" ) , ( vs26, "26" ) , ( vs27, "27" ) , ( vs28, "28" ) ,
322
+ ( vs29, "29" ) , ( vs30, "30" ) , ( vs31, "31" ) , ( vs32, "32" ) , ( vs33, "33" ) , ( vs34, "34" ) , ( vs35, "35" ) ,
323
+ ( vs36, "36" ) , ( vs37, "37" ) , ( vs38, "38" ) , ( vs39, "39" ) , ( vs40, "40" ) , ( vs41, "41" ) , ( vs42, "42" ) ,
324
+ ( vs43, "43" ) , ( vs44, "44" ) , ( vs45, "45" ) , ( vs46, "46" ) , ( vs47, "47" ) , ( vs48, "48" ) , ( vs49, "49" ) ,
325
+ ( vs50, "50" ) , ( vs51, "51" ) , ( vs52, "52" ) , ( vs53, "53" ) , ( vs54, "54" ) , ( vs55, "55" ) , ( vs56, "56" ) ,
326
+ ( vs57, "57" ) , ( vs58, "58" ) , ( vs59, "59" ) , ( vs60, "60" ) , ( vs61, "61" ) , ( vs62, "62" ) , ( vs63, "63" ) ,
248
327
( cr, "cr" ) ;
249
328
( cr0, "0" ) , ( cr1, "1" ) , ( cr2, "2" ) , ( cr3, "3" ) , ( cr4, "4" ) , ( cr5, "5" ) , ( cr6, "6" ) , ( cr7, "7" ) ;
250
329
( ctr, "ctr" ) ;
@@ -276,8 +355,77 @@ impl PowerPCInlineAsmReg {
276
355
} ;
277
356
}
278
357
reg_conflicts ! {
279
- cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7;
358
+ cr : cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7,
359
+ // f0-f31 overlap half of each of vs0-vs32.
360
+ vs0 : f0,
361
+ vs1 : f1,
362
+ vs2 : f2,
363
+ vs3 : f3,
364
+ vs4 : f4,
365
+ vs5 : f5,
366
+ vs6 : f6,
367
+ vs7 : f7,
368
+ vs8 : f8,
369
+ vs9 : f9,
370
+ vs10 : f10,
371
+ vs11 : f11,
372
+ vs12 : f12,
373
+ vs13 : f13,
374
+ vs14 : f14,
375
+ vs15 : f15,
376
+ vs16 : f16,
377
+ vs17 : f17,
378
+ vs18 : f18,
379
+ vs19 : f19,
380
+ vs20 : f20,
381
+ vs21 : f21,
382
+ vs22 : f22,
383
+ vs23 : f23,
384
+ vs24 : f24,
385
+ vs25 : f25,
386
+ vs26 : f26,
387
+ vs27 : f27,
388
+ vs28 : f28,
389
+ vs29 : f29,
390
+ vs30 : f30,
391
+ vs31 : f31,
392
+ // vs32-v63 are aliases of v0-v31
393
+ vs32 : v0,
394
+ vs33 : v1,
395
+ vs34 : v2,
396
+ vs35 : v3,
397
+ vs36 : v4,
398
+ vs37 : v5,
399
+ vs38 : v6,
400
+ vs39 : v7,
401
+ vs40 : v8,
402
+ vs41 : v9,
403
+ vs42 : v10,
404
+ vs43 : v11,
405
+ vs44 : v12,
406
+ vs45 : v13,
407
+ vs46 : v14,
408
+ vs47 : v15,
409
+ vs48 : v16,
410
+ vs49 : v17,
411
+ vs50 : v18,
412
+ vs51 : v19,
413
+ vs52 : v20,
414
+ vs53 : v21,
415
+ vs54 : v22,
416
+ vs55 : v23,
417
+ vs56 : v24,
418
+ vs57 : v25,
419
+ vs58 : v26,
420
+ vs59 : v27,
421
+ vs60 : v28,
422
+ vs61 : v29,
423
+ vs62 : v30,
424
+ vs63 : v31;
280
425
}
281
- // f0-f31 (vsr0-vsr31) and v0-v31 (vsr32-vsr63) do not conflict.
426
+ // For more detail on how vsx, vmx (altivec), fpr, and mma registers overlap
427
+ // see OpenPOWER ISA 3.1C, Book I, Section 7.2.1.1 through 7.2.1.3.
428
+ //
429
+ // https://files.openpower.foundation/s/9izgC5Rogi5Ywmm
282
430
}
283
431
}
0 commit comments