1 /* { dg-do run { target { powerpc*-*-* && { ilp32 && dfprt } } } } */
2 /* { dg-options "-std=gnu99 -O2 -fno-strict-aliasing" } */
4 /* Testcase to check for ABI compliance of parameter passing
5 for the PowerPC ELF ABI for decimal float values. */
7 extern void abort (void);
10 /* Support compiling the test to report individual failures; default is
11 to abort as soon as a check fails. */
14 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
16 #define FAILURE abort ();
34 /* Testcase could break on future gcc's, if parameter regs
35 are changed before this asm. */
37 #define save_parms(lparms) \
38 asm volatile ("lis 11,gparms@ha\n\t" \
39 "la 11,gparms@l(11)\n\t" \
55 "stfd 8,88(11)\n\t":::"11", "memory"); \
62 unsigned int slot[200];
65 /* Fill up floating point registers with double arguments, forcing
66 decimal float arguments into the parameter save area. */
67 void __attribute__ ((noinline))
68 func0 (double a1, double a2, double a3, double a4, double a5,
69 double a6, double a7, double a8, _Decimal64 a9, _Decimal128 a10)
75 sp = __builtin_frame_address (0);
78 if (a1 != lparms.fprs[0]) FAILURE
79 if (a2 != lparms.fprs[1]) FAILURE
80 if (a3 != lparms.fprs[2]) FAILURE
81 if (a4 != lparms.fprs[3]) FAILURE
82 if (a5 != lparms.fprs[4]) FAILURE
83 if (a6 != lparms.fprs[5]) FAILURE
84 if (a7 != lparms.fprs[6]) FAILURE
85 if (a8 != lparms.fprs[7]) FAILURE
86 if (a9 != *(_Decimal64 *)&sp->slot[0]) FAILURE
87 if (a10 != *(_Decimal128 *)&sp->slot[2]) FAILURE
90 /* Alternate 64-bit and 128-bit decimal float arguments, checking that
91 _Decimal128 is always passed in even/odd register pairs. */
92 void __attribute__ ((noinline))
93 func1 (_Decimal64 a1, _Decimal128 a2, _Decimal64 a3, _Decimal128 a4,
94 _Decimal64 a5, _Decimal128 a6, _Decimal64 a7, _Decimal128 a8)
100 sp = __builtin_frame_address (0);
103 if (a1 != *(_Decimal64 *)&lparms.fprs[0]) FAILURE /* f1 */
104 if (a2 != *(_Decimal128 *)&lparms.fprs[1]) FAILURE /* f2 & f3 */
105 if (a3 != *(_Decimal64 *)&lparms.fprs[3]) FAILURE /* f4 */
106 if (a4 != *(_Decimal128 *)&lparms.fprs[5]) FAILURE /* f6 & f7 */
107 if (a5 != *(_Decimal64 *)&lparms.fprs[7]) FAILURE /* f8 */
108 if (a6 != *(_Decimal128 *)&sp->slot[0]) FAILURE
109 if (a7 != *(_Decimal64 *)&sp->slot[4]) FAILURE
110 if (a8 != *(_Decimal128 *)&sp->slot[6]) FAILURE
113 void __attribute__ ((noinline))
114 func2 (_Decimal128 a1, _Decimal64 a2, _Decimal128 a3, _Decimal64 a4,
115 _Decimal128 a5, _Decimal64 a6, _Decimal128 a7, _Decimal64 a8)
121 sp = __builtin_frame_address (0);
124 if (a1 != *(_Decimal128 *)&lparms.fprs[1]) FAILURE /* f2 & f3 */
125 if (a2 != *(_Decimal64 *)&lparms.fprs[3]) FAILURE /* f4 */
126 if (a3 != *(_Decimal128 *)&lparms.fprs[5]) FAILURE /* f6 & f7 */
127 if (a4 != *(_Decimal64 *)&lparms.fprs[7]) FAILURE /* f8 */
128 if (a5 != *(_Decimal128 *)&sp->slot[0]) FAILURE
129 if (a6 != *(_Decimal64 *)&sp->slot[4]) FAILURE
130 if (a7 != *(_Decimal128 *)&sp->slot[6]) FAILURE
131 if (a8 != *(_Decimal64 *)&sp->slot[10]) FAILURE
134 void __attribute__ ((noinline))
135 func3 (_Decimal64 a1, _Decimal128 a2, _Decimal64 a3, _Decimal128 a4,
142 sp = __builtin_frame_address (0);
145 if (a1 != *(_Decimal64 *)&lparms.fprs[0]) FAILURE /* f1 */
146 if (a2 != *(_Decimal128 *)&lparms.fprs[1]) FAILURE /* f2 & f3 */
147 if (a3 != *(_Decimal64 *)&lparms.fprs[3]) FAILURE /* f4 */
148 if (a4 != *(_Decimal128 *)&lparms.fprs[5]) FAILURE /* f6 & f7 */
149 if (a5 != *(_Decimal128 *)&sp->slot[0]) FAILURE
152 void __attribute__ ((noinline))
153 func4 (_Decimal32 a1, _Decimal32 a2, _Decimal32 a3, _Decimal32 a4,
154 _Decimal32 a5, _Decimal32 a6, _Decimal32 a7, _Decimal32 a8,
155 _Decimal32 a9, _Decimal32 a10, _Decimal32 a11, _Decimal32 a12,
156 _Decimal32 a13, _Decimal32 a14, _Decimal32 a15, _Decimal32 a16)
162 sp = __builtin_frame_address (0);
165 /* _Decimal32 is passed in the lower half of an FPR, or in parameter slot. */
166 if (a1 != ((d32parm_t *)&lparms.fprs[0])->d) FAILURE /* f1 */
167 if (a2 != ((d32parm_t *)&lparms.fprs[1])->d) FAILURE /* f2 */
168 if (a3 != ((d32parm_t *)&lparms.fprs[2])->d) FAILURE /* f3 */
169 if (a4 != ((d32parm_t *)&lparms.fprs[3])->d) FAILURE /* f4 */
170 if (a5 != ((d32parm_t *)&lparms.fprs[4])->d) FAILURE /* f5 */
171 if (a6 != ((d32parm_t *)&lparms.fprs[5])->d) FAILURE /* f6 */
172 if (a7 != ((d32parm_t *)&lparms.fprs[6])->d) FAILURE /* f7 */
173 if (a8 != ((d32parm_t *)&lparms.fprs[7])->d) FAILURE /* f8 */
174 if (a9 != *(_Decimal32 *)&sp->slot[0]) FAILURE
175 if (a10 != *(_Decimal32 *)&sp->slot[1]) FAILURE
176 if (a11 != *(_Decimal32 *)&sp->slot[2]) FAILURE
177 if (a12 != *(_Decimal32 *)&sp->slot[3]) FAILURE
178 if (a13 != *(_Decimal32 *)&sp->slot[4]) FAILURE
179 if (a14 != *(_Decimal32 *)&sp->slot[5]) FAILURE
180 if (a15 != *(_Decimal32 *)&sp->slot[6]) FAILURE
181 if (a16 != *(_Decimal32 *)&sp->slot[7]) FAILURE
184 void __attribute__ ((noinline))
185 func5 (_Decimal32 a1, _Decimal64 a2, _Decimal128 a3,
186 _Decimal32 a4, _Decimal64 a5, _Decimal128 a6,
187 _Decimal32 a7, _Decimal64 a8, _Decimal128 a9,
188 _Decimal32 a10, _Decimal64 a11, _Decimal128 a12)
194 sp = __builtin_frame_address (0);
197 if (a1 != ((d32parm_t *)&lparms.fprs[0])->d) FAILURE /* f1 */
198 if (a2 != *(_Decimal64 *)&lparms.fprs[1]) FAILURE /* f2 */
199 if (a3 != *(_Decimal128 *)&lparms.fprs[3]) FAILURE /* f4 & f5 */
200 if (a4 != ((d32parm_t *)&lparms.fprs[5])->d) FAILURE /* f6 */
201 if (a5 != *(_Decimal64 *)&lparms.fprs[6]) FAILURE /* f7 */
203 if (a6 != *(_Decimal128 *)&sp->slot[0]) FAILURE
204 if (a7 != *(_Decimal32 *)&sp->slot[4]) FAILURE
205 if (a8 != *(_Decimal64 *)&sp->slot[6]) FAILURE
206 if (a9 != *(_Decimal128 *)&sp->slot[8]) FAILURE
207 if (a10 != *(_Decimal32 *)&sp->slot[12]) FAILURE
208 if (a11 != *(_Decimal64 *)&sp->slot[14]) FAILURE
209 if (a12 != *(_Decimal128 *)&sp->slot[16]) FAILURE
215 func0 (1., 2., 3., 4., 5., 6., 7., 8., 9.dd, 10.dl);
216 func1 (1.dd, 2.dl, 3.dd, 4.dl, 5.dd, 6.dl, 7.dd, 8.dl);
217 func2 (1.dl, 2.dd, 3.dl, 4.dd, 5.dl, 6.dd, 7.dl, 8.dd);
218 func3 (1.dd, 2.dl, 3.dd, 4.dl, 5.dl);
219 func4 (501.2df, 502.2df, 503.2df, 504.2df, 505.2df, 506.2df, 507.2df,
220 508.2df, 509.2df, 510.2df, 511.2df, 512.2df, 513.2df, 514.2df,
222 func5 (601.2df, 602.2dd, 603.2dl, 604.2df, 605.2dd, 606.2dl,
223 607.2df, 608.2dd, 609.2dl, 610.2df, 611.2dd, 612.2dl);