1 /* { dg-do compile } */
2 /* { dg-options "-O -fshrink-wrap -fstack-clash-protection -msve-vector-bits=128 -g" } */
3 /* { dg-final { check-function-bodies "**" "" "" { target { aarch64_little_endian && lp64 } } } } */
4 
5 #pragma GCC aarch64 "arm_sve.h"
6 
7 svbool_t take_stack_args (volatile void *, void *, int, int, int,
8 			  int, int, int, int);
9 
10 /*
11 ** test_1:
12 **	sub	sp, sp, #32
13 **	str	p4, \[sp\]
14 **	...
15 **	ptrue	p0\.b, vl16
16 **	ldr	p4, \[sp\]
17 **	add	sp, sp, #?32
18 **	ret
19 */
20 svbool_t
test_1(void)21 test_1 (void)
22 {
23   volatile int x = 1;
24   asm volatile ("" ::: "p4");
25   return svptrue_b8 ();
26 }
27 
28 /*
29 ** test_2:
30 **	sub	sp, sp, #64
31 **	stp	x24, x25, \[sp, 16\]
32 **	str	x26, \[sp, 32\]
33 **	str	p4, \[sp\]
34 **	...
35 **	ptrue	p0\.b, vl16
36 **	ldr	p4, \[sp\]
37 **	ldp	x24, x25, \[sp, 16\]
38 **	ldr	x26, \[sp, 32\]
39 **	add	sp, sp, #?64
40 **	ret
41 */
42 svbool_t
test_2(void)43 test_2 (void)
44 {
45   volatile int x = 1;
46   asm volatile ("" ::: "p4", "x24", "x25", "x26");
47   return svptrue_b8 ();
48 }
49 
50 /*
51 ** test_3:
52 **	mov	x12, #?4144
53 **	sub	sp, sp, x12
54 **	stp	x24, x25, \[sp, 16\]
55 **	str	x26, \[sp, 32\]
56 **	str	p4, \[sp\]
57 **	...
58 **	ptrue	p0\.b, vl16
59 **	ldr	p4, \[sp\]
60 **	ldp	x24, x25, \[sp, 16\]
61 **	ldr	x26, \[sp, 32\]
62 **	add	sp, sp, x12
63 **	ret
64 */
65 svbool_t
test_3(void)66 test_3 (void)
67 {
68   volatile int x[1024];
69   asm volatile ("" :: "r" (x) : "p4", "x24", "x25", "x26");
70   return svptrue_b8 ();
71 }
72 
73 /*
74 ** test_4:
75 **	sub	sp, sp, #32
76 **	str	p4, \[sp\]
77 **	...
78 **	ptrue	p0\.h, vl8
79 **	ldr	p4, \[sp\]
80 **	add	sp, sp, #?32
81 **	ret
82 */
83 svbool_t
test_4(void)84 test_4 (void)
85 {
86   volatile svint32_t b;
87   b = svdup_s32 (1);
88   asm volatile ("" ::: "p4");
89   return svptrue_b16 ();
90 }
91 
92 /*
93 ** test_5:
94 **	sub	sp, sp, #64
95 **	stp	x24, x25, \[sp, 16\]
96 **	str	x26, \[sp, 32\]
97 **	str	p4, \[sp\]
98 **	...
99 **	ptrue	p0\.h, vl8
100 **	ldr	p4, \[sp\]
101 **	ldp	x24, x25, \[sp, 16\]
102 **	ldr	x26, \[sp, 32\]
103 **	add	sp, sp, #?64
104 **	ret
105 */
106 svbool_t
test_5(void)107 test_5 (void)
108 {
109   volatile svint32_t b;
110   b = svdup_s32 (1);
111   asm volatile ("" ::: "p4", "x24", "x25", "x26");
112   return svptrue_b16 ();
113 }
114 
115 /*
116 ** test_6:
117 **	stp	x29, x30, \[sp, -16\]!
118 **	mov	x29, sp
119 **	sub	sp, sp, #16
120 **	str	p4, \[sp\]
121 **	...
122 **	ptrue	p0\.b, vl16
123 **	add	sp, sp, #?16
124 **	ldr	p4, \[sp\]
125 **	add	sp, sp, #?16
126 **	ldp	x29, x30, \[sp\], 16
127 **	ret
128 */
129 svbool_t
test_6(void)130 test_6 (void)
131 {
132   take_stack_args (0, 0, 1, 2, 3, 4, 5, 6, 7);
133   asm volatile ("" ::: "p4");
134   return svptrue_b8 ();
135 }
136 
137 /*
138 ** test_7:
139 **	mov	x12, #?4128
140 **	sub	sp, sp, x12
141 **	stp	x29, x30, \[sp, 16\]
142 **	add	x29, sp, #?16
143 **	str	p4, \[sp\]
144 **	sub	sp, sp, #16
145 **	...
146 **	ptrue	p0\.b, vl16
147 **	add	sp, sp, #?16
148 **	ldr	p4, \[sp\]
149 **	add	sp, sp, #?16
150 **	ldp	x29, x30, \[sp\]
151 **	mov	x12, #?4112
152 **	add	sp, sp, x12
153 **	ret
154 */
155 svbool_t
test_7(void)156 test_7 (void)
157 {
158   volatile int x[1024];
159   take_stack_args (x, 0, 1, 2, 3, 4, 5, 6, 7);
160   asm volatile ("" ::: "p4");
161   return svptrue_b8 ();
162 }
163 
164 /*
165 ** test_8:
166 **	mov	x12, #?4160
167 **	sub	sp, sp, x12
168 **	stp	x29, x30, \[sp, 16\]
169 **	add	x29, sp, #?16
170 **	stp	x24, x25, \[sp, 32\]
171 **	str	x26, \[sp, 48\]
172 **	str	p4, \[sp\]
173 **	sub	sp, sp, #16
174 **	...
175 **	ptrue	p0\.b, vl16
176 **	add	sp, sp, #?16
177 **	ldr	p4, \[sp\]
178 **	add	sp, sp, #?16
179 **	ldp	x24, x25, \[sp, 16\]
180 **	ldr	x26, \[sp, 32\]
181 **	ldp	x29, x30, \[sp\]
182 **	mov	x12, #?4144
183 **	add	sp, sp, x12
184 **	ret
185 */
186 svbool_t
test_8(void)187 test_8 (void)
188 {
189   volatile int x[1024];
190   take_stack_args (x, 0, 1, 2, 3, 4, 5, 6, 7);
191   asm volatile ("" ::: "p4", "x24", "x25", "x26");
192   return svptrue_b8 ();
193 }
194 
195 /*
196 ** test_9:
197 **	mov	x12, #?4128
198 **	sub	sp, sp, x12
199 **	stp	x29, x30, \[sp, 16\]
200 **	add	x29, sp, #?16
201 **	str	p4, \[sp\]
202 **	sub	sp, sp, #16
203 **	...
204 **	ptrue	p0\.b, vl16
205 **	sub	sp, x29, #16
206 **	ldr	p4, \[sp\]
207 **	add	sp, sp, #?16
208 **	ldp	x29, x30, \[sp\]
209 **	mov	x12, #?4112
210 **	add	sp, sp, x12
211 **	ret
212 */
213 svbool_t
test_9(int n)214 test_9 (int n)
215 {
216   volatile int x[1024];
217   take_stack_args (x, __builtin_alloca (n), 1, 2, 3, 4, 5, 6, 7);
218   asm volatile ("" ::: "p4");
219   return svptrue_b8 ();
220 }
221 
222 /*
223 ** test_10:
224 **	mov	x12, #?4160
225 **	sub	sp, sp, x12
226 **	stp	x29, x30, \[sp, 16\]
227 **	add	x29, sp, #?16
228 **	stp	x24, x25, \[sp, 32\]
229 **	str	x26, \[sp, 48\]
230 **	str	p4, \[sp\]
231 **	sub	sp, sp, #16
232 **	...
233 **	ptrue	p0\.b, vl16
234 **	sub	sp, x29, #16
235 **	ldr	p4, \[sp\]
236 **	add	sp, sp, #?16
237 **	ldp	x24, x25, \[sp, 16\]
238 **	ldr	x26, \[sp, 32\]
239 **	ldp	x29, x30, \[sp\]
240 **	mov	x12, #?4144
241 **	add	sp, sp, x12
242 **	ret
243 */
244 svbool_t
test_10(int n)245 test_10 (int n)
246 {
247   volatile int x[1024];
248   take_stack_args (x, __builtin_alloca (n), 1, 2, 3, 4, 5, 6, 7);
249   asm volatile ("" ::: "p4", "x24", "x25", "x26");
250   return svptrue_b8 ();
251 }
252 
253 /*
254 ** test_11:
255 **	sub	sp, sp, #65536
256 **	str	xzr, \[sp, 1024\]
257 **	mov	x12, #?64464
258 **	sub	sp, sp, x12
259 **	stp	x29, x30, \[sp, 16\]
260 **	add	x29, sp, #?16
261 **	stp	x24, x25, \[sp, 32\]
262 **	str	x26, \[sp, 48\]
263 **	str	p4, \[sp\]
264 **	sub	sp, sp, #16
265 **	...
266 **	ptrue	p0\.b, vl16
267 **	sub	sp, x29, #16
268 **	ldr	p4, \[sp\]
269 **	add	sp, sp, #?16
270 **	ldp	x24, x25, \[sp, 16\]
271 **	ldr	x26, \[sp, 32\]
272 **	ldp	x29, x30, \[sp\]
273 **	add	sp, sp, #?3008
274 **	add	sp, sp, #?126976
275 **	ret
276 */
277 svbool_t
test_11(int n)278 test_11 (int n)
279 {
280   volatile int x[0x7ee4];
281   take_stack_args (x, __builtin_alloca (n), 1, 2, 3, 4, 5, 6, 7);
282   asm volatile ("" ::: "p4", "x24", "x25", "x26");
283   return svptrue_b8 ();
284 }
285