1 /* { dg-do compile { target lp64 } } */
2 /* { dg-options "-O -mlittle-endian -fno-stack-clash-protection -g" } */
3 /* { dg-final { check-function-bodies "**" "" } } */
4
5 #pragma GCC aarch64 "arm_sve.h"
6
7 /*
8 ** callee1:
9 ** ...
10 ** ldr (z[0-9]+), \[x1, #3, mul vl\]
11 ** ...
12 ** st4h {z[0-9]+\.h - \1\.h}, p0, \[x0\]
13 ** st2h {z3\.h - z4\.h}, p1, \[x0\]
14 ** st3h {z5\.h - z7\.h}, p2, \[x0\]
15 ** ret
16 */
17 void __attribute__((noipa))
callee1(void * x0,svint16x3_t z0,svint16x2_t z3,svint16x3_t z5,svint16x4_t stack1,svint16_t stack2,svbool_t p0,svbool_t p1,svbool_t p2)18 callee1 (void *x0, svint16x3_t z0, svint16x2_t z3, svint16x3_t z5,
19 svint16x4_t stack1, svint16_t stack2, svbool_t p0,
20 svbool_t p1, svbool_t p2)
21 {
22 svst4_s16 (p0, x0, stack1);
23 svst2_s16 (p1, x0, z3);
24 svst3_s16 (p2, x0, z5);
25 }
26
27 /*
28 ** callee2:
29 ** ptrue p3\.b, all
30 ** ld1h (z[0-9]+\.h), p3/z, \[x2\]
31 ** st1h \1, p0, \[x0\]
32 ** st2h {z3\.h - z4\.h}, p1, \[x0\]
33 ** st3h {z0\.h - z2\.h}, p2, \[x0\]
34 ** ret
35 */
36 void __attribute__((noipa))
callee2(void * x0,svint16x3_t z0,svint16x2_t z3,svint16x3_t z5,svint16x4_t stack1,svint16_t stack2,svbool_t p0,svbool_t p1,svbool_t p2)37 callee2 (void *x0, svint16x3_t z0, svint16x2_t z3, svint16x3_t z5,
38 svint16x4_t stack1, svint16_t stack2, svbool_t p0,
39 svbool_t p1, svbool_t p2)
40 {
41 svst1_s16 (p0, x0, stack2);
42 svst2_s16 (p1, x0, z3);
43 svst3_s16 (p2, x0, z0);
44 }
45
46 void __attribute__((noipa))
caller(void * x0)47 caller (void *x0)
48 {
49 svbool_t pg;
50 pg = svptrue_b8 ();
51 callee1 (x0,
52 svld3_vnum_s16 (pg, x0, -9),
53 svld2_vnum_s16 (pg, x0, -2),
54 svld3_vnum_s16 (pg, x0, 0),
55 svld4_vnum_s16 (pg, x0, 8),
56 svld1_vnum_s16 (pg, x0, 5),
57 svptrue_pat_b8 (SV_VL1),
58 svptrue_pat_b16 (SV_VL2),
59 svptrue_pat_b32 (SV_VL3));
60 }
61
62 /* { dg-final { scan-assembler {\tld3h\t{z0\.h - z2\.h}, p[0-7]/z, \[x0, #-9, mul vl\]\n} } } */
63 /* { dg-final { scan-assembler {\tld2h\t{z3\.h - z4\.h}, p[0-7]/z, \[x0, #-2, mul vl\]\n} } } */
64 /* { dg-final { scan-assembler {\tld3h\t{z5\.h - z7\.h}, p[0-7]/z, \[x0\]\n} } } */
65 /* { dg-final { scan-assembler {\tld4h\t{(z[0-9]+)\.h - z[0-9]+\.h}.*\tstr\t\1, \[x1\]\n} } } */
66 /* { dg-final { scan-assembler {\tld4h\t{z[0-9]+\.h - (z[0-9]+)\.h}.*\tstr\t\1, \[x1, #3, mul vl\]\n} } } */
67 /* { dg-final { scan-assembler {\tld1h\t(z[0-9]+\.h), p[0-7]/z, \[x0, #5, mul vl\]\n.*\tst1h\t\1, p[0-7], \[x2\]\n} } } */
68 /* { dg-final { scan-assembler {\tptrue\tp0\.b, vl1\n} } } */
69 /* { dg-final { scan-assembler {\tptrue\tp1\.h, vl2\n} } } */
70 /* { dg-final { scan-assembler {\tptrue\tp2\.s, vl3\n} } } */
71