1 /* { dg-do run { target powerpc64-*-* } } */
2 /* { dg-options "-O2" } */
7 /* Testcase to check for ABI compliance of parameter passing
9 Parameter passing of integral and floating point is tested. */
11 extern void abort (void);
15 unsigned long gprs[8];
22 /* Testcase could break on future gcc's, if parameter regs
23 are changed before this asm. */
26 #define save_parms(lparms) \
27 asm volatile ("ld 11,gparms@got(2)\n\t" \
41 "stfd 6,104(11)\n\t" \
42 "stfd 7,112(11)\n\t" \
43 "stfd 8,120(11)\n\t" \
44 "stfd 9,128(11)\n\t" \
45 "stfd 10,136(11)\n\t" \
46 "stfd 11,144(11)\n\t" \
47 "stfd 12,152(11)\n\t" \
48 "stfd 13,160(11)\n\t":::"11", "memory"); \
51 #define save_parms(lparms) \
52 asm volatile ("ld r11,gparms@got(r2)\n\t" \
55 "std r5,16(r11)\n\t" \
56 "std r6,24(r11)\n\t" \
57 "std r7,32(r11)\n\t" \
58 "std r8,40(r11)\n\t" \
59 "std r9,48(r11)\n\t" \
60 "std r10,56(r11)\n\t" \
61 "stfd f1,64(r11)\n\t" \
62 "stfd f2,72(r11)\n\t" \
63 "stfd f3,80(r11)\n\t" \
64 "stfd f4,88(r11)\n\t" \
65 "stfd f5,96(r11)\n\t" \
66 "stfd f6,104(r11)\n\t" \
67 "stfd f7,112(r11)\n\t" \
68 "stfd f8,120(r11)\n\t" \
69 "stfd f9,128(r11)\n\t" \
70 "stfd f10,136(r11)\n\t" \
71 "stfd f11,144(r11)\n\t" \
72 "stfd f12,152(r11)\n\t" \
73 "stfd f13,160(r11)\n\t":::"r11", "memory"); \
77 /* Stackframe structure relevant for parameter passing. */
102 void __attribute__ ((noinline)) fcld (char *s, long l, double d)
107 if (s != (char *) lparms.gprs[0])
110 if (l != lparms.gprs[1])
113 if (d != lparms.fprs[0])
123 void __attribute__ ((noinline))
124 fcldi (char *s, long l, double d, signed int i)
129 if (s != (char *) lparms.gprs[0])
132 if (l != lparms.gprs[1])
135 if (d != lparms.fprs[0])
138 if ((signed long) i != lparms.gprs[3])
148 void __attribute__ ((noinline))
149 fcldu (char *s, long l, float d, unsigned int i)
154 if (s != (char *) lparms.gprs[0])
157 if (l != lparms.gprs[1])
160 if ((double) d != lparms.fprs[0])
163 if ((unsigned long) i != lparms.gprs[3])
173 void __attribute__ ((noinline)) fceld (char *s, ...)
184 if (s != (char *) lparms.gprs[0])
187 l = va_arg (arg, long);
188 d = va_arg (arg, double);
190 /* Go back one frame. */
191 sp = __builtin_frame_address (0);
194 if (sp->slot[1].l != l)
197 if (sp->slot[2].d != d)
208 void __attribute__ ((noinline)) fciiedl (char *s, int i, int j, ...)
219 if (s != (char *) lparms.gprs[0])
222 if ((long) i != lparms.gprs[1])
225 if ((long) j != lparms.gprs[2])
228 d = va_arg (arg, double);
229 l = va_arg (arg, long);
231 sp = __builtin_frame_address (0);
234 if (sp->slot[3].d != d)
237 if (sp->slot[4].l != l)
242 Parameter Register Offset in parameter save area
243 c r3 0-7 (not stored in parameter save area)
244 ff f1 8-15 (not stored)
245 d r5 16-23 (not stored)
246 ld f2 24-31 (not stored)
247 f r7 32-39 (not stored)
248 s r8,r9 40-55 (not stored)
249 gg f3 56-63 (not stored)
250 t (none) 64-79 (stored in parameter save area)
251 e (none) 80-87 (stored)
269 /* Example from ABI documentation with slight changes.
278 t : save area offset 64 - 79
279 e : save area offset 80 - 88
283 void __attribute__ ((noinline))
284 fididisdsid (int c, double ff, int d, double ld, int f,
285 sparm s, double gg, sparm t, int e, double hh)
294 if ((long) c != lparms.gprs[0])
297 /* Parm 1: double. */
298 if (ff != lparms.fprs[0])
302 if ((long) d != lparms.gprs[2])
305 /* Parm 3: double. */
306 if (ld != lparms.fprs[1])
310 if ((long) f != lparms.gprs[4])
313 /* Parm 5: struct sparm. */
314 dx.l = lparms.gprs[5];
315 dy.l = lparms.gprs[6];
322 /* Parm 6: double. */
323 if (gg != lparms.fprs[2])
326 sp = __builtin_frame_address (0);
329 /* Parm 7: struct sparm. */
330 dx.l = sp->slot[8].l;
331 dy.l = sp->slot[9].l;
338 if (e != sp->slot[10].l)
341 /* Parm 9: double. */
343 if (hh != lparms.fprs[3])
353 fcldi (s, 1, 1.0, -2);
354 fcldu (s, 1, 1.0, 2);
356 fciiedl (s, 1, 2, 1.0, 3);
357 fididisdsid (1, 1.0, 2, 2.0, -1, (sparm)
359 3, 3.0}, 4.0, (sparm)