1 /* { dg-do compile } */
2 /* { dg-options "-O -mbig-endian -fshrink-wrap -fno-stack-clash-protection -g" } */
3 /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
4
5 void standard_callee (void);
6 __attribute__((aarch64_vector_pcs)) void vpcs_callee (void);
7
8 /*
9 ** calls_standard:
10 ** stp x29, x30, \[sp, -16\]!
11 ** mov x29, sp
12 ** addvl sp, sp, #-18
13 ** str p4, \[sp\]
14 ** str p5, \[sp, #1, mul vl\]
15 ** str p6, \[sp, #2, mul vl\]
16 ** str p7, \[sp, #3, mul vl\]
17 ** str p8, \[sp, #4, mul vl\]
18 ** str p9, \[sp, #5, mul vl\]
19 ** str p10, \[sp, #6, mul vl\]
20 ** str p11, \[sp, #7, mul vl\]
21 ** str p12, \[sp, #8, mul vl\]
22 ** str p13, \[sp, #9, mul vl\]
23 ** str p14, \[sp, #10, mul vl\]
24 ** str p15, \[sp, #11, mul vl\]
25 ** ptrue p0\.b, all
26 ** st1d z8\.d, p0, \[sp, #2, mul vl\]
27 ** st1d z9\.d, p0, \[sp, #3, mul vl\]
28 ** st1d z10\.d, p0, \[sp, #4, mul vl\]
29 ** st1d z11\.d, p0, \[sp, #5, mul vl\]
30 ** st1d z12\.d, p0, \[sp, #6, mul vl\]
31 ** st1d z13\.d, p0, \[sp, #7, mul vl\]
32 ** addvl x11, sp, #16
33 ** st1d z14\.d, p0, \[x11, #-8, mul vl\]
34 ** st1d z15\.d, p0, \[x11, #-7, mul vl\]
35 ** str z16, \[sp, #10, mul vl\]
36 ** str z17, \[sp, #11, mul vl\]
37 ** str z18, \[sp, #12, mul vl\]
38 ** str z19, \[sp, #13, mul vl\]
39 ** str z20, \[sp, #14, mul vl\]
40 ** str z21, \[sp, #15, mul vl\]
41 ** str z22, \[sp, #16, mul vl\]
42 ** str z23, \[sp, #17, mul vl\]
43 ** bl standard_callee
44 ** ptrue p0\.b, all
45 ** ld1d z8\.d, p0/z, \[sp, #2, mul vl\]
46 ** ld1d z9\.d, p0/z, \[sp, #3, mul vl\]
47 ** ld1d z10\.d, p0/z, \[sp, #4, mul vl\]
48 ** ld1d z11\.d, p0/z, \[sp, #5, mul vl\]
49 ** ld1d z12\.d, p0/z, \[sp, #6, mul vl\]
50 ** ld1d z13\.d, p0/z, \[sp, #7, mul vl\]
51 ** addvl x11, sp, #16
52 ** ld1d z14\.d, p0/z, \[x11, #-8, mul vl\]
53 ** ld1d z15\.d, p0/z, \[x11, #-7, mul vl\]
54 ** ldr z16, \[sp, #10, mul vl\]
55 ** ldr z17, \[sp, #11, mul vl\]
56 ** ldr z18, \[sp, #12, mul vl\]
57 ** ldr z19, \[sp, #13, mul vl\]
58 ** ldr z20, \[sp, #14, mul vl\]
59 ** ldr z21, \[sp, #15, mul vl\]
60 ** ldr z22, \[sp, #16, mul vl\]
61 ** ldr z23, \[sp, #17, mul vl\]
62 ** ldr p4, \[sp\]
63 ** ldr p5, \[sp, #1, mul vl\]
64 ** ldr p6, \[sp, #2, mul vl\]
65 ** ldr p7, \[sp, #3, mul vl\]
66 ** ldr p8, \[sp, #4, mul vl\]
67 ** ldr p9, \[sp, #5, mul vl\]
68 ** ldr p10, \[sp, #6, mul vl\]
69 ** ldr p11, \[sp, #7, mul vl\]
70 ** ldr p12, \[sp, #8, mul vl\]
71 ** ldr p13, \[sp, #9, mul vl\]
72 ** ldr p14, \[sp, #10, mul vl\]
73 ** ldr p15, \[sp, #11, mul vl\]
74 ** addvl sp, sp, #18
75 ** ldp x29, x30, \[sp\], 16
76 ** ret
77 */
calls_standard(__SVInt8_t x)78 void calls_standard (__SVInt8_t x) { standard_callee (); }
79
80 /*
81 ** calls_vpcs:
82 ** stp x29, x30, \[sp, -16\]!
83 ** mov x29, sp
84 ** addvl sp, sp, #-18
85 ** str p4, \[sp\]
86 ** str p5, \[sp, #1, mul vl\]
87 ** str p6, \[sp, #2, mul vl\]
88 ** str p7, \[sp, #3, mul vl\]
89 ** str p8, \[sp, #4, mul vl\]
90 ** str p9, \[sp, #5, mul vl\]
91 ** str p10, \[sp, #6, mul vl\]
92 ** str p11, \[sp, #7, mul vl\]
93 ** str p12, \[sp, #8, mul vl\]
94 ** str p13, \[sp, #9, mul vl\]
95 ** str p14, \[sp, #10, mul vl\]
96 ** str p15, \[sp, #11, mul vl\]
97 ** ptrue p0\.b, all
98 ** st1d z8\.d, p0, \[sp, #2, mul vl\]
99 ** st1d z9\.d, p0, \[sp, #3, mul vl\]
100 ** st1d z10\.d, p0, \[sp, #4, mul vl\]
101 ** st1d z11\.d, p0, \[sp, #5, mul vl\]
102 ** st1d z12\.d, p0, \[sp, #6, mul vl\]
103 ** st1d z13\.d, p0, \[sp, #7, mul vl\]
104 ** addvl x11, sp, #16
105 ** st1d z14\.d, p0, \[x11, #-8, mul vl\]
106 ** st1d z15\.d, p0, \[x11, #-7, mul vl\]
107 ** str z16, \[sp, #10, mul vl\]
108 ** str z17, \[sp, #11, mul vl\]
109 ** str z18, \[sp, #12, mul vl\]
110 ** str z19, \[sp, #13, mul vl\]
111 ** str z20, \[sp, #14, mul vl\]
112 ** str z21, \[sp, #15, mul vl\]
113 ** str z22, \[sp, #16, mul vl\]
114 ** str z23, \[sp, #17, mul vl\]
115 ** bl vpcs_callee
116 ** ptrue p0\.b, all
117 ** ld1d z8\.d, p0/z, \[sp, #2, mul vl\]
118 ** ld1d z9\.d, p0/z, \[sp, #3, mul vl\]
119 ** ld1d z10\.d, p0/z, \[sp, #4, mul vl\]
120 ** ld1d z11\.d, p0/z, \[sp, #5, mul vl\]
121 ** ld1d z12\.d, p0/z, \[sp, #6, mul vl\]
122 ** ld1d z13\.d, p0/z, \[sp, #7, mul vl\]
123 ** addvl x11, sp, #16
124 ** ld1d z14\.d, p0/z, \[x11, #-8, mul vl\]
125 ** ld1d z15\.d, p0/z, \[x11, #-7, mul vl\]
126 ** ldr z16, \[sp, #10, mul vl\]
127 ** ldr z17, \[sp, #11, mul vl\]
128 ** ldr z18, \[sp, #12, mul vl\]
129 ** ldr z19, \[sp, #13, mul vl\]
130 ** ldr z20, \[sp, #14, mul vl\]
131 ** ldr z21, \[sp, #15, mul vl\]
132 ** ldr z22, \[sp, #16, mul vl\]
133 ** ldr z23, \[sp, #17, mul vl\]
134 ** ldr p4, \[sp\]
135 ** ldr p5, \[sp, #1, mul vl\]
136 ** ldr p6, \[sp, #2, mul vl\]
137 ** ldr p7, \[sp, #3, mul vl\]
138 ** ldr p8, \[sp, #4, mul vl\]
139 ** ldr p9, \[sp, #5, mul vl\]
140 ** ldr p10, \[sp, #6, mul vl\]
141 ** ldr p11, \[sp, #7, mul vl\]
142 ** ldr p12, \[sp, #8, mul vl\]
143 ** ldr p13, \[sp, #9, mul vl\]
144 ** ldr p14, \[sp, #10, mul vl\]
145 ** ldr p15, \[sp, #11, mul vl\]
146 ** addvl sp, sp, #18
147 ** ldp x29, x30, \[sp\], 16
148 ** ret
149 */
calls_vpcs(__SVInt8_t x)150 void calls_vpcs (__SVInt8_t x) { vpcs_callee (); }
151
152 /*
153 ** calls_standard_ptr:
154 ** stp x29, x30, \[sp, -16\]!
155 ** mov x29, sp
156 ** addvl sp, sp, #-18
157 ** str p4, \[sp\]
158 ** str p5, \[sp, #1, mul vl\]
159 ** str p6, \[sp, #2, mul vl\]
160 ** str p7, \[sp, #3, mul vl\]
161 ** str p8, \[sp, #4, mul vl\]
162 ** str p9, \[sp, #5, mul vl\]
163 ** str p10, \[sp, #6, mul vl\]
164 ** str p11, \[sp, #7, mul vl\]
165 ** str p12, \[sp, #8, mul vl\]
166 ** str p13, \[sp, #9, mul vl\]
167 ** str p14, \[sp, #10, mul vl\]
168 ** str p15, \[sp, #11, mul vl\]
169 ** ptrue p0\.b, all
170 ** st1d z8\.d, p0, \[sp, #2, mul vl\]
171 ** st1d z9\.d, p0, \[sp, #3, mul vl\]
172 ** st1d z10\.d, p0, \[sp, #4, mul vl\]
173 ** st1d z11\.d, p0, \[sp, #5, mul vl\]
174 ** st1d z12\.d, p0, \[sp, #6, mul vl\]
175 ** st1d z13\.d, p0, \[sp, #7, mul vl\]
176 ** addvl x11, sp, #16
177 ** st1d z14\.d, p0, \[x11, #-8, mul vl\]
178 ** st1d z15\.d, p0, \[x11, #-7, mul vl\]
179 ** str z16, \[sp, #10, mul vl\]
180 ** str z17, \[sp, #11, mul vl\]
181 ** str z18, \[sp, #12, mul vl\]
182 ** str z19, \[sp, #13, mul vl\]
183 ** str z20, \[sp, #14, mul vl\]
184 ** str z21, \[sp, #15, mul vl\]
185 ** str z22, \[sp, #16, mul vl\]
186 ** str z23, \[sp, #17, mul vl\]
187 ** blr x0
188 ** ptrue p0\.b, all
189 ** ld1d z8\.d, p0/z, \[sp, #2, mul vl\]
190 ** ld1d z9\.d, p0/z, \[sp, #3, mul vl\]
191 ** ld1d z10\.d, p0/z, \[sp, #4, mul vl\]
192 ** ld1d z11\.d, p0/z, \[sp, #5, mul vl\]
193 ** ld1d z12\.d, p0/z, \[sp, #6, mul vl\]
194 ** ld1d z13\.d, p0/z, \[sp, #7, mul vl\]
195 ** addvl x11, sp, #16
196 ** ld1d z14\.d, p0/z, \[x11, #-8, mul vl\]
197 ** ld1d z15\.d, p0/z, \[x11, #-7, mul vl\]
198 ** ldr z16, \[sp, #10, mul vl\]
199 ** ldr z17, \[sp, #11, mul vl\]
200 ** ldr z18, \[sp, #12, mul vl\]
201 ** ldr z19, \[sp, #13, mul vl\]
202 ** ldr z20, \[sp, #14, mul vl\]
203 ** ldr z21, \[sp, #15, mul vl\]
204 ** ldr z22, \[sp, #16, mul vl\]
205 ** ldr z23, \[sp, #17, mul vl\]
206 ** ldr p4, \[sp\]
207 ** ldr p5, \[sp, #1, mul vl\]
208 ** ldr p6, \[sp, #2, mul vl\]
209 ** ldr p7, \[sp, #3, mul vl\]
210 ** ldr p8, \[sp, #4, mul vl\]
211 ** ldr p9, \[sp, #5, mul vl\]
212 ** ldr p10, \[sp, #6, mul vl\]
213 ** ldr p11, \[sp, #7, mul vl\]
214 ** ldr p12, \[sp, #8, mul vl\]
215 ** ldr p13, \[sp, #9, mul vl\]
216 ** ldr p14, \[sp, #10, mul vl\]
217 ** ldr p15, \[sp, #11, mul vl\]
218 ** addvl sp, sp, #18
219 ** ldp x29, x30, \[sp\], 16
220 ** ret
221 */
222 void
calls_standard_ptr(__SVInt8_t x,void (* fn)(void))223 calls_standard_ptr (__SVInt8_t x, void (*fn) (void))
224 {
225 fn ();
226 }
227
228 /*
229 ** calls_vpcs_ptr:
230 ** stp x29, x30, \[sp, -16\]!
231 ** mov x29, sp
232 ** addvl sp, sp, #-18
233 ** str p4, \[sp\]
234 ** str p5, \[sp, #1, mul vl\]
235 ** str p6, \[sp, #2, mul vl\]
236 ** str p7, \[sp, #3, mul vl\]
237 ** str p8, \[sp, #4, mul vl\]
238 ** str p9, \[sp, #5, mul vl\]
239 ** str p10, \[sp, #6, mul vl\]
240 ** str p11, \[sp, #7, mul vl\]
241 ** str p12, \[sp, #8, mul vl\]
242 ** str p13, \[sp, #9, mul vl\]
243 ** str p14, \[sp, #10, mul vl\]
244 ** str p15, \[sp, #11, mul vl\]
245 ** ptrue p0\.b, all
246 ** st1d z8\.d, p0, \[sp, #2, mul vl\]
247 ** st1d z9\.d, p0, \[sp, #3, mul vl\]
248 ** st1d z10\.d, p0, \[sp, #4, mul vl\]
249 ** st1d z11\.d, p0, \[sp, #5, mul vl\]
250 ** st1d z12\.d, p0, \[sp, #6, mul vl\]
251 ** st1d z13\.d, p0, \[sp, #7, mul vl\]
252 ** addvl x11, sp, #16
253 ** st1d z14\.d, p0, \[x11, #-8, mul vl\]
254 ** st1d z15\.d, p0, \[x11, #-7, mul vl\]
255 ** str z16, \[sp, #10, mul vl\]
256 ** str z17, \[sp, #11, mul vl\]
257 ** str z18, \[sp, #12, mul vl\]
258 ** str z19, \[sp, #13, mul vl\]
259 ** str z20, \[sp, #14, mul vl\]
260 ** str z21, \[sp, #15, mul vl\]
261 ** str z22, \[sp, #16, mul vl\]
262 ** str z23, \[sp, #17, mul vl\]
263 ** blr x0
264 ** ptrue p0\.b, all
265 ** ld1d z8\.d, p0/z, \[sp, #2, mul vl\]
266 ** ld1d z9\.d, p0/z, \[sp, #3, mul vl\]
267 ** ld1d z10\.d, p0/z, \[sp, #4, mul vl\]
268 ** ld1d z11\.d, p0/z, \[sp, #5, mul vl\]
269 ** ld1d z12\.d, p0/z, \[sp, #6, mul vl\]
270 ** ld1d z13\.d, p0/z, \[sp, #7, mul vl\]
271 ** addvl x11, sp, #16
272 ** ld1d z14\.d, p0/z, \[x11, #-8, mul vl\]
273 ** ld1d z15\.d, p0/z, \[x11, #-7, mul vl\]
274 ** ldr z16, \[sp, #10, mul vl\]
275 ** ldr z17, \[sp, #11, mul vl\]
276 ** ldr z18, \[sp, #12, mul vl\]
277 ** ldr z19, \[sp, #13, mul vl\]
278 ** ldr z20, \[sp, #14, mul vl\]
279 ** ldr z21, \[sp, #15, mul vl\]
280 ** ldr z22, \[sp, #16, mul vl\]
281 ** ldr z23, \[sp, #17, mul vl\]
282 ** ldr p4, \[sp\]
283 ** ldr p5, \[sp, #1, mul vl\]
284 ** ldr p6, \[sp, #2, mul vl\]
285 ** ldr p7, \[sp, #3, mul vl\]
286 ** ldr p8, \[sp, #4, mul vl\]
287 ** ldr p9, \[sp, #5, mul vl\]
288 ** ldr p10, \[sp, #6, mul vl\]
289 ** ldr p11, \[sp, #7, mul vl\]
290 ** ldr p12, \[sp, #8, mul vl\]
291 ** ldr p13, \[sp, #9, mul vl\]
292 ** ldr p14, \[sp, #10, mul vl\]
293 ** ldr p15, \[sp, #11, mul vl\]
294 ** addvl sp, sp, #18
295 ** ldp x29, x30, \[sp\], 16
296 ** ret
297 */
298 void
calls_vpcs_ptr(__SVInt8_t x,void (* fn)(void))299 calls_vpcs_ptr (__SVInt8_t x,
300 void (*__attribute__((aarch64_vector_pcs)) fn) (void))
301 {
302 fn ();
303 }
304