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