1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fno-stack-clash-protection -g" } */
3 /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
4 
5 #include <arm_sve.h>
6 #include <stdarg.h>
7 
8 /*
9 ** callee_0:
10 **	...
11 **	ld1h	(z[0-9]+\.h), (p[0-7])/z, \[x1\]
12 **	...
13 **	st1h	\1, \2, \[x0\]
14 **	...
15 **	ret
16 */
17 void __attribute__((noipa))
callee_0(int16_t * ptr,...)18 callee_0 (int16_t *ptr, ...)
19 {
20   va_list va;
21   svint16_t vec;
22 
23   va_start (va, ptr);
24   vec = va_arg (va, svint16_t);
25   va_end (va);
26   svst1 (svptrue_b8 (), ptr, vec);
27 }
28 
29 /*
30 ** caller_0:
31 **	...
32 **	mov	(z[0-9]+\.h), #42
33 **	...
34 **	st1h	\1, p[0-7], \[x1\]
35 **	...
36 **	ret
37 */
38 void __attribute__((noipa))
caller_0(int16_t * ptr)39 caller_0 (int16_t *ptr)
40 {
41   callee_0 (ptr, svdup_u16 (42));
42 }
43 
44 /*
45 ** callee_1:
46 **	...
47 **	ld1h	(z[0-9]+\.h), (p[0-7])/z, \[x2\]
48 **	...
49 **	st1h	\1, p[0-7], \[x0\]
50 **	...
51 **	ret
52 */
53 void __attribute__((noipa))
callee_1(int16_t * ptr,...)54 callee_1 (int16_t *ptr, ...)
55 {
56   va_list va;
57   svint16_t vec;
58 
59   va_start (va, ptr);
60   va_arg (va, int);
61   vec = va_arg (va, svint16_t);
62   va_end (va);
63   svst1 (svptrue_b8 (), ptr, vec);
64 }
65 
66 /*
67 ** caller_1:
68 **	...
69 **	mov	(z[0-9]+\.h), #42
70 **	...
71 **	st1h	\1, p[0-7], \[x2\]
72 **	...
73 **	ret
74 */
75 void __attribute__((noipa))
caller_1(int16_t * ptr)76 caller_1 (int16_t *ptr)
77 {
78   callee_1 (ptr, 1, svdup_u16 (42));
79 }
80 
81 /*
82 ** callee_7:
83 **	...
84 **	ld1h	(z[0-9]+\.h), (p[0-7])/z, \[x7\]
85 **	...
86 **	st1h	\1, p[0-7], \[x0\]
87 **	...
88 **	ret
89 */
90 void __attribute__((noipa))
callee_7(int16_t * ptr,...)91 callee_7 (int16_t *ptr, ...)
92 {
93   va_list va;
94   svint16_t vec;
95 
96   va_start (va, ptr);
97   va_arg (va, int);
98   va_arg (va, int);
99   va_arg (va, int);
100   va_arg (va, int);
101   va_arg (va, int);
102   va_arg (va, int);
103   vec = va_arg (va, svint16_t);
104   va_end (va);
105   svst1 (svptrue_b8 (), ptr, vec);
106 }
107 
108 /*
109 ** caller_7:
110 **	...
111 **	mov	(z[0-9]+\.h), #42
112 **	...
113 **	st1h	\1, p[0-7], \[x7\]
114 **	...
115 **	ret
116 */
117 void __attribute__((noipa))
caller_7(int16_t * ptr)118 caller_7 (int16_t *ptr)
119 {
120   callee_7 (ptr, 1, 2, 3, 4, 5, 6, svdup_u16 (42));
121 }
122 
123 /* FIXME: We should be able to get rid of the va_list object.  */
124 /*
125 ** callee_8:
126 **	sub	sp, sp, #([0-9]+)
127 **	...
128 **	ldr	(x[0-9]+), \[sp, \1\]
129 **	...
130 **	ld1h	(z[0-9]+\.h), (p[0-7])/z, \[\2\]
131 **	...
132 **	st1h	\3, \4, \[x0\]
133 **	...
134 **	ret
135 */
136 void __attribute__((noipa))
callee_8(int16_t * ptr,...)137 callee_8 (int16_t *ptr, ...)
138 {
139   va_list va;
140   svint16_t vec;
141 
142   va_start (va, ptr);
143   va_arg (va, int);
144   va_arg (va, int);
145   va_arg (va, int);
146   va_arg (va, int);
147   va_arg (va, int);
148   va_arg (va, int);
149   va_arg (va, int);
150   vec = va_arg (va, svint16_t);
151   va_end (va);
152   svst1 (svptrue_b8 (), ptr, vec);
153 }
154 
155 /*
156 ** caller_8:
157 **	...
158 **	mov	(z[0-9]+\.h), #42
159 **	...
160 **	st1h	\1, p[0-7], \[(x[0-9]+)\]
161 **	...
162 **	str	\2, \[sp\]
163 **	...
164 **	ret
165 */
166 void __attribute__((noipa))
caller_8(int16_t * ptr)167 caller_8 (int16_t *ptr)
168 {
169   callee_8 (ptr, 1, 2, 3, 4, 5, 6, 7, svdup_u16 (42));
170 }
171