@@ -12,6 +12,7 @@ def_reg_class! {
1212        reg_nonzero, 
1313        freg, 
1414        vreg, 
15+         vsreg, 
1516        cr, 
1617        ctr, 
1718        lr, 
@@ -58,6 +59,10 @@ impl PowerPCInlineAsmRegClass {
5859                altivec:  VecI8 ( 16 ) ,  VecI16 ( 8 ) ,  VecI32 ( 4 ) ,  VecF32 ( 4 ) ; 
5960                vsx:  F32 ,  F64 ,  VecI64 ( 2 ) ,  VecF64 ( 2 ) ; 
6061            } , 
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+             } , 
6166            Self :: cr | Self :: ctr | Self :: lr | Self :: xer => & [ ] , 
6267        } 
6368    } 
@@ -86,7 +91,7 @@ fn reserved_v20to31(
8691)  -> Result < ( ) ,  & ' static  str >  { 
8792    if  target. is_like_aix  { 
8893        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" ) , 
9095            "vec-extabi"  => Ok ( ( ) ) , 
9196            _ => unreachable ! ( "unrecognized AIX ABI" ) , 
9297        } 
@@ -188,6 +193,71 @@ def_regs! {
188193        v29:  vreg = [ "v29" ]  % reserved_v20to31, 
189194        v30:  vreg = [ "v30" ]  % reserved_v20to31, 
190195        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, 
191261        cr:  cr = [ "cr" ] , 
192262        cr0:  cr = [ "cr0" ] , 
193263        cr1:  cr = [ "cr1" ] , 
@@ -245,6 +315,15 @@ impl PowerPCInlineAsmReg {
245315            ( v8,  "8" ) ,  ( v9,  "9" ) ,  ( v10,  "10" ) ,  ( v11,  "11" ) ,  ( v12,  "12" ) ,  ( v13,  "13" ) ,  ( v14,  "14" ) ,  ( v15,  "15" ) ; 
246316            ( v16,  "16" ) ,  ( v17,  "17" ) ,  ( v18,  "18" ) ,  ( v19,  "19" ) ,  ( v20,  "20" ) ,  ( v21,  "21" ) ,  ( v22,  "22" ) ,  ( v23,  "23" ) ; 
247317            ( 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" ) , 
248327            ( cr,  "cr" ) ; 
249328            ( cr0,  "0" ) ,  ( cr1,  "1" ) ,  ( cr2,  "2" ) ,  ( cr3,  "3" ) ,  ( cr4,  "4" ) ,  ( cr5,  "5" ) ,  ( cr6,  "6" ) ,  ( cr7,  "7" ) ; 
250329            ( ctr,  "ctr" ) ; 
@@ -276,8 +355,77 @@ impl PowerPCInlineAsmReg {
276355            } ; 
277356        } 
278357        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; 
280425        } 
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 
282430    } 
283431} 
0 commit comments