1 /* { dg-do run { target powerpc64-*-linux* } } */
2 /* { dg-options "-O2 -fprofile -mprofile-kernel -maltivec -mabi=altivec" } */
7 /* Testcase to check for ABI compliance of parameter passing
8 for the PowerPC64 ABI. */
10 void __attribute__((no_instrument_function))
11 sig_ill_handler (int sig)
16 extern void abort (void);
20 unsigned long gprs[8];
28 /* _mcount call is done on Linux ppc64 early in the prologue.
29 my_mcount will provide a entry point _mcount,
30 which will save all register to gparms.
31 Note that _mcount need to restore lr to original value,
32 therefor use ctr to return.
35 void __attribute__((no_instrument_function))
38 asm volatile (".type _mcount,@function\n\t"
45 "ld 11,gparms@got(2)\n\t"
95 /* Stackframe structure relevant for parameter passing. */
105 struct sf *backchain;
126 void __attribute__ ((noinline))
127 fcvi (char *s, vector int v, int i)
129 reg_parms_t lparms = gparms;
131 if (s != (char *) lparms.gprs[0])
134 if (!vec_all_eq (v, lparms.vrs[0]))
137 if ((long) i != lparms.gprs[4])
146 void __attribute__ ((noinline))
147 fcvv (char *s, vector int v, vector int w)
149 vector int a, c = {6, 8, 10, 12};
150 reg_parms_t lparms = gparms;
152 if (s != (char *) lparms.gprs[0])
155 if (!vec_all_eq (v, lparms.vrs[0]))
158 if (!vec_all_eq (w, lparms.vrs[1]))
163 if (!vec_all_eq (a, c))
173 void __attribute__ ((noinline))
174 fcivv (char *s, int i, vector int v, vector int w)
176 vector int a, c = {6, 8, 10, 12};
177 reg_parms_t lparms = gparms;
179 if (s != (char *) lparms.gprs[0])
182 if ((long) i != lparms.gprs[1])
185 if (!vec_all_eq (v, lparms.vrs[0]))
188 if (!vec_all_eq (w, lparms.vrs[1]))
193 if (!vec_all_eq (a, c))
203 void __attribute__ ((noinline))
206 vector int a, c = {6, 8, 10, 12};
209 reg_parms_t lparms = gparms;
214 if (s != (char *) lparms.gprs[0])
217 v = va_arg(arg, vector int);
218 w = va_arg(arg, vector int);
221 if (!vec_all_eq (a, c))
224 /* Go back one frame. */
225 sp = __builtin_frame_address(0);
228 if (sp->slot[2].l != 0x100000002ULL
229 || sp->slot[4].l != 0x500000006ULL)
240 void __attribute__ ((noinline))
241 fciievv (char *s, int i, int j, ...)
243 vector int a, c = {6, 8, 10, 12};
246 reg_parms_t lparms = gparms;
251 if (s != (char *) lparms.gprs[0])
254 if ((long) i != lparms.gprs[1])
257 if ((long) j != lparms.gprs[2])
260 v = va_arg(arg, vector int);
261 w = va_arg(arg, vector int);
264 if (!vec_all_eq (a, c))
267 sp = __builtin_frame_address(0);
270 if (sp->slot[4].l != 0x100000002ULL
271 || sp->slot[6].l != 0x500000006ULL)
275 void __attribute__ ((noinline))
276 fcvevv (char *s, vector int x, ...)
278 vector int a, c = {7, 10, 13, 16};
281 reg_parms_t lparms = gparms;
286 v = va_arg(arg, vector int);
287 w = va_arg(arg, vector int);
292 if (!vec_all_eq (a, c))
295 sp = __builtin_frame_address(0);
298 if (sp->slot[4].l != 0x100000002ULL
299 || sp->slot[6].l != 0x500000006ULL)
305 int __attribute__((no_instrument_function, noinline))
309 vector int v = {1, 2, 3, 4};
310 vector int w = {5, 6, 7, 8};
314 fnp_cvvvv (s, v, w, v, w);
317 fciievv (s, 1, 2, v, w);
322 int __attribute__((no_instrument_function))
325 /* Exit on systems without altivec. */
326 signal (SIGILL, sig_ill_handler);
327 /* Altivec instruction, 'vor %v0,%v0,%v0'. */
328 asm volatile (".long 0x10000484");
329 signal (SIGILL, SIG_DFL);
335 Function called with no prototype.
343 fnp_cvvvv (char *s, vector int v, vector int w,
344 vector int x, vector int y)
346 vector int a, c = {12, 16, 20, 24};
347 reg_parms_t lparms = gparms;
349 vector_int_t v0, v1, v2, v3;
351 if (s != (char *) lparms.gprs[0])
354 if (!vec_all_eq (v, lparms.vrs[0]))
357 if (!vec_all_eq (w, lparms.vrs[1]))
360 if (!vec_all_eq (x, lparms.vrs[2]))
363 if (!vec_all_eq (y, lparms.vrs[3]))
370 if (!vec_all_eq (a, c))
373 v0.v = lparms.vrs[0];
374 v1.v = lparms.vrs[1];
375 v2.v = lparms.vrs[2];
376 v3.v = lparms.vrs[3];
378 if (v0.l[0] != lparms.gprs[2])
381 if (v0.l[1] != lparms.gprs[3])
384 if (v1.l[0] != lparms.gprs[4])
387 if (v1.l[1] != lparms.gprs[5])
390 if (v2.l[0] != lparms.gprs[6])
393 if (v2.l[1] != lparms.gprs[7])
396 sp = __builtin_frame_address(0);
399 if (sp->slot[8].l != v3.l[0])
402 if (sp->slot[9].l != v3.l[1])