comparison gcc/testsuite/gcc.target/aarch64/sve/pcs/struct_3_256.c @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
comparison
equal deleted inserted replaced
145:1830386684a0 152:2b5abeee2509
1 /* { dg-options "-O -msve-vector-bits=256" } */
2 /* { dg-final { check-function-bodies "**" "" } } */
3
4 #include "struct.h"
5
6 #define CONSUME(VAR) \
7 { \
8 register void *ptr_ asm ("x7") = &(VAR); \
9 asm volatile ("" :: "r" (ptr_) : "memory"); \
10 }
11
12 #define SEL2(TAG, TYPE) \
13 TAG TYPE \
14 sel2_##TYPE (TAG TYPE x, TAG TYPE y) \
15 { \
16 return y; \
17 }
18
19 #define WRAP(TYPE) \
20 struct wrap_##TYPE \
21 { \
22 TYPE data; \
23 }; \
24 SEL2 (struct, wrap_##TYPE)
25
26 /*
27 ** sel2_wrap_fixed_int8_t:
28 ** mov z0\.d, z1\.d
29 ** ret
30 */
31 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_int8_t\n} } } */
32 WRAP (fixed_int8_t);
33
34 /*
35 ** sel2_wrap_fixed_int16_t:
36 ** mov z0\.d, z1\.d
37 ** ret
38 */
39 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_int16_t\n} } } */
40 WRAP (fixed_int16_t);
41
42 /*
43 ** sel2_wrap_fixed_int32_t:
44 ** mov z0\.d, z1\.d
45 ** ret
46 */
47 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_int32_t\n} } } */
48 WRAP (fixed_int32_t);
49
50 /*
51 ** sel2_wrap_fixed_int64_t:
52 ** mov z0\.d, z1\.d
53 ** ret
54 */
55 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_int64_t\n} } } */
56 WRAP (fixed_int64_t);
57
58 /*
59 ** sel2_wrap_fixed_uint8_t:
60 ** mov z0\.d, z1\.d
61 ** ret
62 */
63 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_uint8_t\n} } } */
64 WRAP (fixed_uint8_t);
65
66 /*
67 ** sel2_wrap_fixed_uint16_t:
68 ** mov z0\.d, z1\.d
69 ** ret
70 */
71 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_uint16_t\n} } } */
72 WRAP (fixed_uint16_t);
73
74 /*
75 ** sel2_wrap_fixed_uint32_t:
76 ** mov z0\.d, z1\.d
77 ** ret
78 */
79 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_uint32_t\n} } } */
80 WRAP (fixed_uint32_t);
81
82 /*
83 ** sel2_wrap_fixed_uint64_t:
84 ** mov z0\.d, z1\.d
85 ** ret
86 */
87 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_uint64_t\n} } } */
88 WRAP (fixed_uint64_t);
89
90 /*
91 ** sel2_wrap_fixed_bfloat16_t:
92 ** mov z0\.d, z1\.d
93 ** ret
94 */
95 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_bfloat16_t\n} } } */
96 WRAP (fixed_bfloat16_t);
97
98 /*
99 ** sel2_wrap_fixed_float16_t:
100 ** mov z0\.d, z1\.d
101 ** ret
102 */
103 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_float16_t\n} } } */
104 WRAP (fixed_float16_t);
105
106 /*
107 ** sel2_wrap_fixed_float32_t:
108 ** mov z0\.d, z1\.d
109 ** ret
110 */
111 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_float32_t\n} } } */
112 WRAP (fixed_float32_t);
113
114 /*
115 ** sel2_wrap_fixed_float64_t:
116 ** mov z0\.d, z1\.d
117 ** ret
118 */
119 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_float64_t\n} } } */
120 WRAP (fixed_float64_t);
121
122 /*
123 ** sel2_wrap_fixed_bool_t:
124 ** mov p0\.b, p1\.b
125 ** ret
126 */
127 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_wrap_fixed_bool_t\n} } } */
128 WRAP (fixed_bool_t);
129
130 struct pst_arr1
131 {
132 fixed_uint8_t u8[1];
133 };
134
135 /*
136 ** sel2_pst_arr1:
137 ** mov z0\.d, z1\.d
138 ** ret
139 */
140 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr1\n} } } */
141 SEL2 (struct, pst_arr1)
142
143 /*
144 ** test_pst_arr1:
145 ** eor z0\.b, z0\.b, #(?:0x)?1
146 ** ret
147 */
148 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr1\n} } } */
149 svuint8_t
150 test_pst_arr1 (struct pst_arr1 x)
151 {
152 return sveor_x (svptrue_b8 (), x.u8[0], 1);
153 }
154
155 struct pst_arr2
156 {
157 fixed_uint8_t u8[2];
158 };
159 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr2\n} } } */
160 SEL2 (struct, pst_arr2)
161
162 /*
163 ** test_pst_arr2:
164 ** sub z0\.b, z0\.b, z1\.b
165 ** ret
166 */
167 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr2\n} } } */
168 svuint8_t
169 test_pst_arr2 (struct pst_arr2 x)
170 {
171 return svsub_x (svptrue_b8 (), x.u8[0], x.u8[1]);
172 }
173
174 struct pst_arr3
175 {
176 fixed_uint16_t u16[3];
177 };
178 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr3\n} } } */
179 SEL2 (struct, pst_arr3)
180
181 /*
182 ** test_pst_arr3:
183 ** sub z0\.h, z0\.h, z2\.h
184 ** ret
185 */
186 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr3\n} } } */
187 svuint16_t
188 test_pst_arr3 (struct pst_arr3 x)
189 {
190 return svsub_x (svptrue_b8 (), x.u16[0], x.u16[2]);
191 }
192
193 struct pst_arr4
194 {
195 fixed_uint32_t u32[4];
196 };
197 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr4\n} } } */
198 SEL2 (struct, pst_arr4)
199
200 /*
201 ** test_pst_arr4:
202 ** sub z0\.s, z0\.s, z3\.s
203 ** ret
204 */
205 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr4\n} } } */
206 svuint32_t
207 test_pst_arr4 (struct pst_arr4 x)
208 {
209 return svsub_x (svptrue_b8 (), x.u32[0], x.u32[3]);
210 }
211
212 struct pst_arr5
213 {
214 fixed_uint64_t u64[2][2][2];
215 };
216 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr5\n} } } */
217 SEL2 (struct, pst_arr5)
218
219 /*
220 ** test_pst_arr5: { target aarch64_little_endian }
221 ** sub sp, sp, #256
222 ** str z0, \[sp\]
223 ** str z1, \[sp, #1, mul vl\]
224 ** str z2, \[sp, #2, mul vl\]
225 ** str z3, \[sp, #3, mul vl\]
226 ** str z4, \[sp, #4, mul vl\]
227 ** str z5, \[sp, #5, mul vl\]
228 ** str z6, \[sp, #6, mul vl\]
229 ** str z7, \[sp, #7, mul vl\]
230 ** mov (x7, sp|w7, wsp)
231 ** add sp, sp, #?256
232 ** ret
233 */
234 /*
235 ** test_pst_arr5: { target aarch64_big_endian }
236 ** sub sp, sp, #256
237 ** ptrue (p[0-3])\.b, vl32
238 ** st1d z0\.d, \1, \[sp\]
239 ** st1d z1\.d, \1, \[sp, #1, mul vl\]
240 ** st1d z2\.d, \1, \[sp, #2, mul vl\]
241 ** st1d z3\.d, \1, \[sp, #3, mul vl\]
242 ** st1d z4\.d, \1, \[sp, #4, mul vl\]
243 ** st1d z5\.d, \1, \[sp, #5, mul vl\]
244 ** st1d z6\.d, \1, \[sp, #6, mul vl\]
245 ** st1d z7\.d, \1, \[sp, #7, mul vl\]
246 ** mov ((x7, sp|w7, wsp)|w7, wsp)
247 ** add sp, sp, #?256
248 ** ret
249 */
250 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr5\n} } } */
251 void
252 test_pst_arr5 (struct pst_arr5 x)
253 {
254 CONSUME (x);
255 }
256
257 /*
258 ** test_pst_arr5_x0:
259 ** (
260 ** mov z0\.d, z7\.d
261 ** mov (x7, x0|w7, w0)
262 ** |
263 ** mov (x7, x0|w7, w0)
264 ** mov z0\.d, z7\.d
265 ** )
266 ** ret
267 */
268 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr5_x0\n} } } */
269 svint32_t
270 test_pst_arr5_x0 (svint32_t z0, struct pst_arr5 x,
271 svint32_t z1, svint32_t z2, svint32_t z3, svint32_t z4,
272 svint32_t z5, svint32_t z6, svint32_t z7)
273 {
274 CONSUME (x);
275 return z7;
276 }
277
278 /*
279 ** test_pst_arr5_x7:
280 ** ret
281 */
282 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr5_x7\n} } } */
283 svint32_t
284 test_pst_arr5_x7 (svint32_t z0, int x0, int x1, int x2, int x3, int x4,
285 int x5, int x6, struct pst_arr5 x)
286 {
287 CONSUME (x);
288 return z0;
289 }
290
291 /*
292 ** test_pst_arr5_sp: { target lp64 }
293 ** ldr x7, \[sp\]
294 ** ret
295 */
296 /*
297 ** test_pst_arr5_sp: { target ilp32 }
298 ** ldr w7, \[sp(, 4)?\]
299 ** ret
300 */
301 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr5_sp\n} } } */
302 svint32_t
303 test_pst_arr5_sp (svint32_t z0, int x0, int x1, int x2, int x3, int x4,
304 int x5, int x6, int x7, struct pst_arr5 x)
305 {
306 CONSUME (x);
307 return z0;
308 }
309
310 struct pst_arr6
311 {
312 fixed_bool_t b[2][2];
313 };
314 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_arr6\n} } } */
315 SEL2 (struct, pst_arr6)
316
317 /*
318 ** test_pst_arr6:
319 ** ...
320 ** brkpa p0\.b, p0/z, p2\.b, p3\.b
321 ** ...
322 */
323 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr6\n} } } */
324 fixed_bool_t
325 test_pst_arr6 (struct pst_arr6 x)
326 {
327 return svbrkpa_z (x.b[0][0], x.b[1][0], x.b[1][1]);
328 }
329
330 /*
331 ** test_pst_arr6_x0:
332 ** (
333 ** mov p0\.b, p3\.b
334 ** mov (x7, x0|w7, w0)
335 ** |
336 ** mov (x7, x0|w7, w0)
337 ** mov p0\.b, p3\.b
338 ** )
339 ** ret
340 */
341 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr6_x0\n} } } */
342 fixed_bool_t
343 test_pst_arr6_x0 (svbool_t p0, struct pst_arr6 x, svbool_t p1, svbool_t p2,
344 svbool_t p3)
345 {
346 CONSUME (x);
347 return p3;
348 }
349
350 /*
351 ** test_pst_arr6_x7:
352 ** ret
353 */
354 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr6_x7\n} } } */
355 fixed_bool_t
356 test_pst_arr6_x7 (svbool_t p0, int x0, int x1, int x2, int x3, int x4,
357 int x5, int x6, struct pst_arr6 x)
358 {
359 CONSUME (x);
360 return p0;
361 }
362
363 /*
364 ** test_pst_arr6_sp: { target lp64 }
365 ** ldr x7, \[sp\]
366 ** ret
367 */
368 /*
369 ** test_pst_arr6_sp: { target ilp32 }
370 ** ldr w7, \[sp(, 4)?\]
371 ** ret
372 */
373 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_arr6_sp\n} } } */
374 fixed_bool_t
375 test_pst_arr6_sp (svbool_t p0, int x0, int x1, int x2, int x3, int x4,
376 int x5, int x6, int x7, struct pst_arr6 x)
377 {
378 CONSUME (x);
379 return p0;
380 }
381
382 struct pst_uniform1
383 {
384 fixed_int8_t a, b;
385 };
386 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_uniform1\n} } } */
387 SEL2 (struct, pst_uniform1)
388
389 /*
390 ** test_pst_uniform1: { target aarch64_little_endian }
391 ** sub sp, sp, #64
392 ** str z0, \[sp\]
393 ** str z1, \[sp, #1, mul vl\]
394 ** mov (x7, sp|w7, wsp)
395 ** add sp, sp, #?64
396 ** ret
397 */
398 /*
399 ** test_pst_uniform1: { target aarch64_big_endian }
400 ** sub sp, sp, #64
401 ** ptrue (p[0-3])\.b, vl32
402 ** st1b z0\.b, \1, \[sp\]
403 ** st1b z1\.b, \1, \[sp, #1, mul vl\]
404 ** mov (x7, sp|w7, wsp)
405 ** add sp, sp, #?64
406 ** ret
407 */
408 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_uniform1\n} } } */
409 void
410 test_pst_uniform1 (struct pst_uniform1 x)
411 {
412 CONSUME (x);
413 }
414
415 struct pst_uniform2
416 {
417 fixed_int16_t a;
418 fixed_int16_t b[2];
419 };
420 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_uniform2\n} } } */
421 SEL2 (struct, pst_uniform2)
422
423 /*
424 ** test_pst_uniform2: { target aarch64_little_endian }
425 ** sub sp, sp, #96
426 ** str z0, \[sp\]
427 ** str z1, \[sp, #1, mul vl\]
428 ** str z2, \[sp, #2, mul vl\]
429 ** mov (x7, sp|w7, wsp)
430 ** add sp, sp, #?96
431 ** ret
432 */
433 /*
434 ** test_pst_uniform2: { target aarch64_big_endian }
435 ** sub sp, sp, #96
436 ** ptrue (p[0-3])\.b, vl32
437 ** st1h z0\.h, \1, \[sp\]
438 ** st1h z1\.h, \1, \[sp, #1, mul vl\]
439 ** st1h z2\.h, \1, \[sp, #2, mul vl\]
440 ** mov (x7, sp|w7, wsp)
441 ** add sp, sp, #?96
442 ** ret
443 */
444 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_uniform2\n} } } */
445 void
446 test_pst_uniform2 (struct pst_uniform2 x)
447 {
448 CONSUME (x);
449 }
450
451 struct pst_uniform3
452 {
453 fixed_int32_t a;
454 fixed_int32_t b[2];
455 fixed_int32_t c;
456 };
457 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_uniform3\n} } } */
458 SEL2 (struct, pst_uniform3)
459
460 /*
461 ** test_pst_uniform3: { target aarch64_little_endian }
462 ** sub sp, sp, #128
463 ** str z0, \[sp\]
464 ** str z1, \[sp, #1, mul vl\]
465 ** str z2, \[sp, #2, mul vl\]
466 ** str z3, \[sp, #3, mul vl\]
467 ** mov (x7, sp|w7, wsp)
468 ** add sp, sp, #?128
469 ** ret
470 */
471 /*
472 ** test_pst_uniform3: { target aarch64_big_endian }
473 ** sub sp, sp, #128
474 ** ptrue (p[0-3])\.b, vl32
475 ** st1w z0\.s, \1, \[sp\]
476 ** st1w z1\.s, \1, \[sp, #1, mul vl\]
477 ** st1w z2\.s, \1, \[sp, #2, mul vl\]
478 ** st1w z3\.s, \1, \[sp, #3, mul vl\]
479 ** mov (x7, sp|w7, wsp)
480 ** add sp, sp, #?128
481 ** ret
482 */
483 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_uniform3\n} } } */
484 void
485 test_pst_uniform3 (struct pst_uniform3 x)
486 {
487 CONSUME (x);
488 }
489
490 struct pst_uniform4
491 {
492 fixed_int32_t a __attribute__((aligned(SVE_BYTES * 2)));
493 fixed_int32_t b[3] __attribute__((aligned(SVE_BYTES * 2)));
494 fixed_int32_t c __attribute__((aligned(SVE_BYTES * 2)));
495 };
496 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_uniform4\n} } } */
497 SEL2 (struct, pst_uniform4)
498
499 /*
500 ** test_pst_uniform4: { target aarch64_little_endian }
501 ** sub sp, sp, #304
502 ** add (x[0-9]+), sp, #?63
503 ** and x7, \1, #?(?:-64|4294967232)
504 ** ptrue (p[0-7])\.b, vl32
505 ** st1w z0\.s, \2, \[x7\]
506 ** add (x[0-9]+), x7, #?64
507 ** str z1, \[\3\]
508 ** str z2, \[\3, #1, mul vl\]
509 ** str z3, \[\3, #2, mul vl\]
510 ** st1w z4\.s, \2, \[x7, #6, mul vl\]
511 ** add sp, sp, #?304
512 ** ret
513 */
514 /*
515 ** test_pst_uniform4: { target aarch64_big_endian }
516 ** sub sp, sp, #304
517 ** add (x[0-9]+), sp, #?63
518 ** and x7, \1, #?(?:-64|4294967232)
519 ** ptrue (p[0-7])\.b, vl32
520 ** st1w z0\.s, \2, \[x7\]
521 ** add (x[0-9]+), x7, #?64
522 ** st1w z1\.s, \2, \[\3\]
523 ** st1w z2\.s, \2, \[\3, #1, mul vl\]
524 ** st1w z3\.s, \2, \[\3, #2, mul vl\]
525 ** st1w z4\.s, \2, \[x7, #6, mul vl\]
526 ** add sp, sp, #?304
527 ** ret
528 */
529 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_uniform4\n} } } */
530 void
531 test_pst_uniform4 (struct pst_uniform4 x)
532 {
533 CONSUME (x);
534 }
535
536 struct pst_mixed1
537 {
538 fixed_bool_t p0;
539 fixed_bfloat16_t z0;
540 fixed_float16_t z1;
541 fixed_float32_t z2;
542 fixed_float64_t z3;
543 fixed_bool_t p1;
544 fixed_bool_t p2;
545 fixed_int8_t z4;
546 fixed_int16_t z5;
547 fixed_int32_t z6;
548 fixed_int64_t z7;
549 fixed_bool_t p3;
550 };
551 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_mixed1\n} } } */
552 SEL2 (struct, pst_mixed1)
553
554 /*
555 ** test_pst_mixed1:
556 ** sub sp, sp, #304
557 ** str p0, \[sp\]
558 ** ptrue p0\.b, vl32
559 ** add (x[0-9+]), sp, #?16
560 ** st1h z0\.h, p0, \[\1\]
561 ** add (x[0-9+]), sp, #?48
562 ** st1h z1\.h, p0, \[\2\]
563 ** add (x[0-9+]), sp, #?80
564 ** st1w z2\.s, p0, \[\3\]
565 ** add (x[0-9+]), sp, #?112
566 ** st1d z3\.d, p0, \[\4\]
567 ** str p1, \[sp, #36, mul vl\]
568 ** str p2, \[sp, #37, mul vl\]
569 ** st1b z4\.b, p0, \[sp, #5, mul vl\]
570 ** st1h z5\.h, p0, \[sp, #6, mul vl\]
571 ** st1w z6\.s, p0, \[sp, #7, mul vl\]
572 ** ...
573 ** st1d z7\.d, p0, [^\n]*
574 ** ...
575 ** str p3, \[sp, #72, mul vl\]
576 ** mov (x7, sp|w7, wsp)
577 ** add sp, sp, #?304
578 ** ret
579 */
580 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_mixed1\n} } } */
581 void
582 test_pst_mixed1 (struct pst_mixed1 x)
583 {
584 CONSUME (x);
585 }
586
587 struct pst_mixed2
588 {
589 struct __attribute__ ((packed)) {
590 fixed_bool_t p;
591 fixed_int8_t z;
592 } a[3];
593 fixed_int16_t b[1][1][1][4];
594 };
595 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_mixed2\n} } } */
596 SEL2 (struct, pst_mixed2)
597
598 /*
599 ** test_pst_mixed2: { target aarch64_little_endian }
600 ** sub sp, sp, #240
601 ** str p0, \[sp\]
602 ** ptrue (p[03])\.b, vl32
603 ** add (x[0-9]+), sp, #?4
604 ** st1b z0\.b, \1, \[\2\]
605 ** str p1, \[sp, #9, mul vl\]
606 ** add (x[0-9]+), sp, #?40
607 ** st1b z1\.b, \1, \[\3\]
608 ** str p2, \[sp, #18, mul vl\]
609 ** add (x[0-9]+), sp, #?76
610 ** st1b z2\.b, \1, \[\4\]
611 ** add (x[0-9]+), sp, #?112
612 ** str z3, \[\5\]
613 ** str z4, \[\5, #1, mul vl\]
614 ** str z5, \[\5, #2, mul vl\]
615 ** str z6, \[\5, #3, mul vl\]
616 ** mov (x7, sp|w7, wsp)
617 ** add sp, sp, #?240
618 ** ret
619 */
620 /*
621 ** test_pst_mixed2: { target aarch64_big_endian }
622 ** sub sp, sp, #240
623 ** str p0, \[sp\]
624 ** ptrue (p[03])\.b, vl32
625 ** add (x[0-9]+), sp, #?4
626 ** st1b z0\.b, \1, \[\2\]
627 ** str p1, \[sp, #9, mul vl\]
628 ** add (x[0-9]+), sp, #?40
629 ** st1b z1\.b, \1, \[\3\]
630 ** str p2, \[sp, #18, mul vl\]
631 ** add (x[0-9]+), sp, #?76
632 ** st1b z2\.b, \1, \[\4\]
633 ** add (x[0-9]+), sp, #?112
634 ** st1h z3\.h, \1, \[\5\]
635 ** st1h z4\.h, \1, \[\5, #1, mul vl\]
636 ** st1h z5\.h, \1, \[\5, #2, mul vl\]
637 ** st1h z6\.h, \1, \[\5, #3, mul vl\]
638 ** mov (x7, sp|w7, wsp)
639 ** add sp, sp, #?240
640 ** ret
641 */
642 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_mixed2\n} } } */
643 void
644 test_pst_mixed2 (struct pst_mixed2 x)
645 {
646 CONSUME (x);
647 }
648
649 struct pst_big1
650 {
651 fixed_int8_t a[9];
652 };
653 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_big1\n} } } */
654 SEL2 (struct, pst_big1)
655
656 /*
657 ** test_pst_big1_a: { target lp64 }
658 ** ptrue (p[0-7])\.b, vl32
659 ** ld1b z0\.b, \1/z, \[x0\]
660 ** ret
661 */
662 /*
663 ** test_pst_big1_a: { target ilp32 }
664 ** uxtw x0, w0
665 ** ptrue (p[0-7])\.b, vl32
666 ** ld1b z0\.b, \1/z, \[x0\]
667 ** ret
668 */
669 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big1_a\n} } } */
670 svint8_t
671 test_pst_big1_a (struct pst_big1 x)
672 {
673 return x.a[0];
674 }
675
676 /*
677 ** test_pst_big1_b: { target lp64 }
678 ** add x7, x0, #?256
679 ** ret
680 */
681 /*
682 ** test_pst_big1_b: { target ilp32 }
683 ** add w7, w0, #?256
684 ** ret
685 */
686 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big1_b\n} } } */
687 svint8_t
688 test_pst_big1_b (struct pst_big1 x)
689 {
690 CONSUME (x.a[8]);
691 }
692
693 struct pst_big2
694 {
695 fixed_bool_t a[5];
696 };
697 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_big2\n} } } */
698 SEL2 (struct, pst_big2)
699
700 /*
701 ** test_pst_big2_a: { target lp64 }
702 ** ldr p0, \[x0\]
703 ** ret
704 */
705 /*
706 ** test_pst_big2_a: { target ilp32 }
707 ** uxtw x0, w0
708 ** ldr p0, \[x0\]
709 ** ret
710 */
711 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big2_a\n} } } */
712 svbool_t
713 test_pst_big2_a (struct pst_big2 x)
714 {
715 return x.a[0];
716 }
717
718 /*
719 ** test_pst_big2_b: { target lp64 }
720 ** ldr p0, \[x0, #4, mul vl\]
721 ** ret
722 */
723 /*
724 ** test_pst_big2_b: { target ilp32 }
725 ** uxtw x0, w0
726 ** ldr p0, \[x0, #4, mul vl\]
727 ** ret
728 */
729 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big2_b\n} } } */
730 svbool_t
731 test_pst_big2_b (struct pst_big2 x)
732 {
733 return x.a[4];
734 }
735
736 struct pst_big3
737 {
738 fixed_bool_t p0;
739 fixed_int8_t a[2];
740 fixed_bool_t p1;
741 fixed_bool_t p2;
742 fixed_bool_t p3;
743 fixed_int8_t b[6];
744 fixed_bool_t p4;
745 };
746 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_big3\n} } } */
747 SEL2 (struct, pst_big3)
748
749 /*
750 ** test_pst_big3_a: { target lp64 }
751 ** ldr p0, \[x0\]
752 ** ret
753 */
754 /*
755 ** test_pst_big3_a: { target ilp32 }
756 ** uxtw x0, w0
757 ** ldr p0, \[x0\]
758 ** ret
759 */
760 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_a\n} } } */
761 svbool_t
762 test_pst_big3_a (struct pst_big3 x)
763 {
764 return x.p0;
765 }
766
767 /*
768 ** test_pst_big3_b: { target lp64 }
769 ** ldr p0, \[x0, #20, mul vl\]
770 ** ret
771 */
772 /*
773 ** test_pst_big3_b: { target ilp32 }
774 ** uxtw x0, w0
775 ** ldr p0, \[x0, #20, mul vl\]
776 ** ret
777 */
778 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_b\n} } } */
779 svbool_t
780 test_pst_big3_b (struct pst_big3 x)
781 {
782 return x.p1;
783 }
784
785 /*
786 ** test_pst_big3_c: { target lp64 }
787 ** ldr p0, \[x0, #21, mul vl\]
788 ** ret
789 */
790 /*
791 ** test_pst_big3_c: { target ilp32 }
792 ** uxtw x0, w0
793 ** ldr p0, \[x0, #21, mul vl\]
794 ** ret
795 */
796 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_c\n} } } */
797 svbool_t
798 test_pst_big3_c (struct pst_big3 x)
799 {
800 return x.p2;
801 }
802
803 /*
804 ** test_pst_big3_d: { target lp64 }
805 ** ldr p0, \[x0, #72, mul vl\]
806 ** ret
807 */
808 /*
809 ** test_pst_big3_d: { target ilp32 }
810 ** uxtw x0, w0
811 ** ldr p0, \[x0, #72, mul vl\]
812 ** ret
813 */
814 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_d\n} } } */
815 svbool_t
816 test_pst_big3_d (struct pst_big3 x)
817 {
818 return x.p4;
819 }
820
821 /*
822 ** test_pst_big3_e: { target lp64 }
823 ** add (x[0-9]+), x0, #?16
824 ** ptrue (p[0-7])\.b, vl32
825 ** ld1b z0\.b, \2/z, \[\1\]
826 ** ret
827 */
828 /*
829 ** test_pst_big3_e: { target ilp32 }
830 ** uxtw x0, w0
831 ** add (x[0-9]+), x0, #?16
832 ** ptrue (p[0-7])\.b, vl32
833 ** ld1b z0\.b, \2/z, \[\1\]
834 ** ret
835 */
836 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_e\n} } } */
837 svint8_t
838 test_pst_big3_e (struct pst_big3 x)
839 {
840 return x.a[0];
841 }
842
843 /*
844 ** test_pst_big3_f: { target lp64 }
845 ** ptrue (p[0-7])\.b, vl32
846 ** ld1b z0\.b, \1/z, \[x0, #4, mul vl\]
847 ** ret
848 */
849 /*
850 ** test_pst_big3_f: { target ilp32 }
851 ** uxtw x0, w0
852 ** ptrue (p[0-7])\.b, vl32
853 ** ld1b z0\.b, \1/z, \[x0, #4, mul vl\]
854 ** ret
855 */
856 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_big3_f\n} } } */
857 svint8_t
858 test_pst_big3_f (struct pst_big3 x)
859 {
860 return x.b[1];
861 }
862
863 struct pst_zero1
864 {
865 fixed_bool_t a[0];
866 fixed_int32_t b;
867 };
868 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_zero1\n} } } */
869 SEL2 (struct, pst_zero1)
870
871 /*
872 ** test_pst_zero1:
873 ** ret
874 */
875 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_zero1\n} } } */
876 svint32_t
877 test_pst_zero1 (struct pst_zero1 x)
878 {
879 return x.b;
880 }
881
882 struct pst_zero2
883 {
884 unsigned int : 0;
885 fixed_bool_t b;
886 };
887 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_zero2\n} } } */
888 SEL2 (struct, pst_zero2)
889
890 /*
891 ** test_pst_zero2:
892 ** (
893 ** sub sp, sp, #16
894 ** add sp, sp, #?16
895 ** |
896 ** )
897 ** ret
898 */
899 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_zero2\n} } } */
900 svbool_t
901 test_pst_zero2 (struct pst_zero2 x)
902 {
903 return x.b;
904 }
905
906 struct pst_zero3
907 {
908 struct {} empty;
909 fixed_uint64_t b;
910 };
911 /* { dg-final { scan-assembler {\t\.variant_pcs\tsel2_pst_zero3\n} } } */
912 SEL2 (struct, pst_zero3)
913
914 /*
915 ** test_pst_zero3:
916 ** ret
917 */
918 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_pst_zero3\n} } } */
919 svuint64_t
920 test_pst_zero3 (struct pst_zero3 x)
921 {
922 return x.b;
923 }
924
925 typedef unsigned char small_vec __attribute__((vector_size(SVE_BYTES / 4)));
926
927 struct nonpst1
928 {
929 small_vec a[4];
930 };
931 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst1\n} } } */
932 SEL2 (struct, nonpst1)
933
934 /*
935 ** test_nonpst1:
936 ** mov v0\.8b, v3\.8b
937 ** ret
938 */
939 /* { dg-final { scan-assembler-not {\t\.variant_pcs\ttest_nonpst1\n} } } */
940 small_vec
941 test_nonpst1 (struct nonpst1 x)
942 {
943 return x.a[3];
944 }
945
946 union nonpst2
947 {
948 struct {
949 fixed_bool_t a[0];
950 fixed_int32_t b;
951 };
952 };
953 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst2\n} } } */
954 SEL2 (union, nonpst2)
955
956 /*
957 ** test_nonpst2: { target lp64 }
958 ** ptrue (p[0-7])\.b, vl32
959 ** ld1w z0\.s, \1/z, \[x0\]
960 ** ret
961 */
962 /*
963 ** test_nonpst2: { target ilp32 }
964 ** uxtw x0, w0
965 ** ptrue (p[0-7])\.b, vl32
966 ** ld1w z0\.s, \1/z, \[x0\]
967 ** ret
968 */
969 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst2\n} } } */
970 svint32_t
971 test_nonpst2 (union nonpst2 x)
972 {
973 return x.b;
974 }
975
976 /*
977 ** ret_nonpst2:
978 ** ptrue (p[0-7])\.b, vl32
979 ** index (z[0-9]+\.s), #1, #2
980 ** st1w \2, \1, \[x8\]
981 ** ret
982 */
983 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tret_nonpst2\n} } } */
984 union nonpst2
985 ret_nonpst2 (void)
986 {
987 return (union nonpst2) { { {}, 1, 3, 5, 7, 9, 11, 13, 15 } };
988 }
989
990 union nonpst3
991 {
992 struct {
993 unsigned int : 0;
994 fixed_bool_t b;
995 };
996 };
997 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst3\n} } } */
998 SEL2 (union, nonpst3)
999
1000 /*
1001 ** test_nonpst3: { target aarch64_little_endian }
1002 ** sub sp, sp, #16
1003 ** str w0, \[sp, #?12\]
1004 ** ldr p0, \[sp, #3, mul vl\]
1005 ** add sp, sp, #?16
1006 ** ret
1007 */
1008 /*
1009 ** test_nonpst3: { target aarch64_big_endian }
1010 ** sub sp, sp, #16
1011 ** (
1012 ** lsr (x[0-9]+), x0, #?32
1013 ** str \1, \[sp\]
1014 ** ldr p0, \[sp, #1, mul vl\]
1015 ** |
1016 ** str x0, \[sp\]
1017 ** ldr p0, \[sp\]
1018 ** )
1019 ** add sp, sp, #?16
1020 ** ret
1021 */
1022 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst3\n} } } */
1023 svbool_t
1024 test_nonpst3 (union nonpst3 x)
1025 {
1026 return x.b;
1027 }
1028
1029 /*
1030 ** ret_nonpst3: { target aarch64_little_endian }
1031 ** mov w0, -1
1032 ** ret
1033 */
1034 /*
1035 ** ret_nonpst3: { target aarch64_big_endian }
1036 ** mov x0, -4294967296
1037 ** ret
1038 */
1039 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tret_nonpst3\n} } } */
1040 union nonpst3
1041 ret_nonpst3 (void)
1042 {
1043 return (union nonpst3) { { svptrue_b8 () } };
1044 }
1045
1046 union nonpst4
1047 {
1048 struct {
1049 struct {} empty;
1050 fixed_uint64_t b;
1051 };
1052 };
1053 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst4\n} } } */
1054 SEL2 (union, nonpst4)
1055
1056 /*
1057 ** test_nonpst4: { target lp64 }
1058 ** ptrue (p[0-7])\.b, vl32
1059 ** ld1d z0\.d, \1/z, \[x0\]
1060 ** ret
1061 */
1062 /*
1063 ** test_nonpst4: { target ilp32 }
1064 ** uxtw x0, w0
1065 ** ptrue (p[0-7])\.b, vl32
1066 ** ld1d z0\.d, \1/z, \[x0\]
1067 ** ret
1068 */
1069 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst4\n} } } */
1070 svuint64_t
1071 test_nonpst4 (union nonpst4 x)
1072 {
1073 return x.b;
1074 }
1075
1076 /*
1077 ** ret_nonpst4:
1078 ** ptrue (p[0-7])\.b, vl32
1079 ** index (z[0-9]+\.d), #1, #1
1080 ** st1d \2, \1, \[x8\]
1081 ** ret
1082 */
1083 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tret_nonpst4\n} } } */
1084 union nonpst4
1085 ret_nonpst4 (void)
1086 {
1087 return (union nonpst4) { { {}, 1, 2, 3, 4 } };
1088 }
1089
1090 struct nonpst5
1091 {
1092 union {
1093 fixed_uint16_t b;
1094 };
1095 };
1096 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst5\n} } } */
1097 SEL2 (struct, nonpst5)
1098
1099 /*
1100 ** test_nonpst5: { target lp64 }
1101 ** ptrue (p[0-7])\.b, vl32
1102 ** ld1h z0\.h, \1/z, \[x0\]
1103 ** ret
1104 */
1105 /*
1106 ** test_nonpst5: { target ilp32 }
1107 ** uxtw x0, w0
1108 ** ptrue (p[0-7])\.b, vl32
1109 ** ld1h z0\.h, \1/z, \[x0\]
1110 ** ret
1111 */
1112 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst5\n} } } */
1113 svuint16_t
1114 test_nonpst5 (struct nonpst5 x)
1115 {
1116 return x.b;
1117 }
1118
1119 struct nonpst6
1120 {
1121 fixed_uint64_t b;
1122 fixed_uint64_t *ptr;
1123 };
1124 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst6\n} } } */
1125 SEL2 (struct, nonpst6)
1126
1127 /*
1128 ** test_nonpst6: { target lp64 }
1129 ** ptrue (p[0-3])\.b, vl32
1130 ** ld1d z0\.d, \1/z, \[x0\]
1131 ** ret
1132 */
1133 /*
1134 ** test_nonpst6: { target ilp32 }
1135 ** uxtw x0, w0
1136 ** ptrue (p[0-3])\.b, vl32
1137 ** ld1d z0\.d, \1/z, \[x0\]
1138 ** ret
1139 */
1140 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst6\n} } } */
1141 svuint64_t
1142 test_nonpst6 (struct nonpst6 x)
1143 {
1144 return x.b;
1145 }
1146
1147 struct nonpst7
1148 {
1149 fixed_uint64_t b;
1150 uint32_t foo __attribute__((vector_size(SVE_BYTES)));
1151 };
1152 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst7\n} } } */
1153 SEL2 (struct, nonpst7)
1154
1155 /*
1156 ** test_nonpst7: { target lp64 }
1157 ** ptrue (p[0-3])\.b, vl32
1158 ** ld1d z0\.d, \1/z, \[x0\]
1159 ** ret
1160 */
1161 /*
1162 ** test_nonpst7: { target ilp32 }
1163 ** uxtw x0, w0
1164 ** ptrue (p[0-3])\.b, vl32
1165 ** ld1d z0\.d, \1/z, \[x0\]
1166 ** ret
1167 */
1168 /* { dg-final { scan-assembler {\t\.variant_pcs\ttest_nonpst7\n} } } */
1169 svuint64_t
1170 test_nonpst7 (struct nonpst7 x)
1171 {
1172 return x.b;
1173 }
1174
1175 typedef unsigned char tiny_vec __attribute__((vector_size(SVE_BYTES / 8)));
1176
1177 struct nonpst8
1178 {
1179 tiny_vec a;
1180 };
1181 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tsel2_pst_nonpst8\n} } } */
1182 SEL2 (struct, nonpst8)
1183
1184 /*
1185 ** test_nonpst8: { target aarch64_little_endian }
1186 ** ubfx x0, x0, 8, 8
1187 ** ret
1188 */
1189 /*
1190 ** test_nonpst8: { target aarch64_big_endian }
1191 ** (
1192 ** sub sp, sp, #16
1193 ** ubfx x0, x0, 48, 8
1194 ** add sp, sp, #?16
1195 ** |
1196 ** ubfx x0, x0, 48, 8
1197 ** )
1198 ** ret
1199 */
1200 /* { dg-final { scan-assembler-not {\t\.variant_pcs\ttest_nonpst8\n} } } */
1201 unsigned int
1202 test_nonpst8 (struct nonpst8 x)
1203 {
1204 return x.a[1];
1205 }
1206
1207 /*
1208 ** ret_nonpst8: { target aarch64_little_endian }
1209 ** (
1210 ** sub sp, sp, #16
1211 ** mov w0, #?513
1212 ** movk w0, #?0x403, lsl #?16
1213 ** add sp, sp, #?16
1214 ** |
1215 ** mov w0, #?513
1216 ** movk w0, #?0x403, lsl #?16
1217 ** )
1218 ** ret
1219 */
1220 /*
1221 ** ret_nonpst8: { target aarch64_big_endian }
1222 ** mov x0, #?3315714752512
1223 ** movk x0, #?0x102, lsl #?48
1224 ** ret
1225 */
1226 /* { dg-final { scan-assembler-not {\t\.variant_pcs\tret_nonpst8\n} } } */
1227 struct nonpst8
1228 ret_nonpst8 (void)
1229 {
1230 return (struct nonpst8) { { 1, 2, 3, 4 } };
1231 }