1 /* { dg-require-effective-target ppc_float128_hw } */
2 /* { dg-options "-mdejagnu-cpu=power9 -O2 -mlong-double-128 -Wno-psabi -mabi=ieeelongdouble" } */
3
4 /* Test if switching long double to IEEE 128-bit maps all of the math built-in
5 function names correctly. We leave off the \M in matching the calls, so
6 power10 will match using bl foo@notoc. */
7
8 #ifdef DO_FUNC
9 #define BUILTIN1(FUNC, ARG1) FUNC (ARG1)
10 #define BUILTIN2(FUNC, ARG1, ARG2) FUNC (ARG1, ARG2)
11 #define BUILTIN3(FUNC, ARG1, ARG2, ARG3) FUNC (ARG1, ARG2, ARG3)
12
13 #else
14 #define BUILTIN1(FUNC, ARG1) __builtin_ ## FUNC (ARG1)
15 #define BUILTIN2(FUNC, ARG1, ARG2) __builtin_ ## FUNC (ARG1, ARG2)
16 #define BUILTIN3(FUNC, ARG1, ARG2, ARG3) __builtin_ ## FUNC (ARG1, ARG2, ARG3)
17 #endif
18
19 /* Built-in functions that returns a long double and take one long double
20 argument. */
21
22 void
23 return_ld_arg_ld (long double *p,
24 long double *q)
25 {
26 /* { dg-final { scan-assembler {\mbl __acoshieee128} } } */
27 *p++ = BUILTIN1 (acoshl, *q++);
28
29 /* { dg-final { scan-assembler {\mbl __acosieee128} } } */
30 *p++ = BUILTIN1 (acosl, *q++);
31
32 /* { dg-final { scan-assembler {\mbl __asinhieee128} } } */
33 *p++ = BUILTIN1 (asinhl, *q++);
34
35 /* { dg-final { scan-assembler {\mbl __asinieee128} } } */
36 *p++ = BUILTIN1 (asinl, *q++);
37
38 /* { dg-final { scan-assembler {\mbl __atanhieee128} } } */
39 *p++ = BUILTIN1 (atanhl, *q++);
40
41 /* { dg-final { scan-assembler {\mbl __atanieee128} } } */
42 *p++ = BUILTIN1 (atanl, *q++);
43
44 /* { dg-final { scan-assembler {\mbl __cbrtieee128} } } */
45 *p++ = BUILTIN1 (cbrtl, *q++);
46
47 /* inline code. */
48 /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,2} } } */
49 *p++ = BUILTIN1 (ceill, *q++);
50
51 /* { dg-final { scan-assembler {\mbl __coshieee128} } } */
52 *p++ = BUILTIN1 (coshl, *q++);
53
54 /* { dg-final { scan-assembler {\mbl __cosieee128} } } */
55 *p++ = BUILTIN1 (cosl, *q++);
56
57 /* { dg-final { scan-assembler {\mbl __erfcieee128} } } */
58 *p++ = BUILTIN1 (erfcl, *q++);
59
60 /* { dg-final { scan-assembler {\mbl __erfieee128} } } */
61 *p++ = BUILTIN1 (erfl, *q++);
62
63 /* { dg-final { scan-assembler {\mbl __exp10ieee128} } } */
64 *p++ = BUILTIN1 (exp10l, *q++);
65
66 /* { dg-final { scan-assembler {\mbl __exp2ieee128} } } */
67 *p++ = BUILTIN1 (exp2l, *q++);
68
69 /* { dg-final { scan-assembler {\mbl __expieee128} } } */
70 *p++ = BUILTIN1 (expl, *q++);
71
72 /* { dg-final { scan-assembler {\mbl __expm1ieee128} } } */
73 *p++ = BUILTIN1 (expm1l, *q++);
74
75 /* inline code. */
76 /* { dg-final { scan-assembler {\mxsabsqp} } } */
77 *p++ = BUILTIN1 (fabsl, *q++);
78
79 /* inline code. */
80 /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,3} } } */
81 *p++ = BUILTIN1 (floorl, *q++);
82
83 /* { dg-final { scan-assembler {\mbl __lgammaieee128} } } */
84 *p++ = BUILTIN1 (gammal, *q++);
85
86 /* { dg-final { scan-assembler {\mbl __j0ieee128} } } */
87 *p++ = BUILTIN1 (j0l, *q++);
88
89 /* { dg-final { scan-assembler {\mbl __j1ieee128} } } */
90 *p++ = BUILTIN1 (j1l, *q++);
91
92 /* { dg-final { scan-assembler {\mbl __log10ieee128} } } */
93 *p++ = BUILTIN1 (log10l, *q++);
94
95 /* { dg-final { scan-assembler {\mbl __log1pieee128} } } */
96 *p++ = BUILTIN1 (log1pl, *q++);
97
98 /* { dg-final { scan-assembler {\mbl __log2ieee128} } } */
99 *p++ = BUILTIN1 (log2l, *q++);
100
101 /* { dg-final { scan-assembler {\mbl __logbieee128} } } */
102 *p++ = BUILTIN1 (logbl, *q++);
103
104 /* { dg-final { scan-assembler {\mbl __logieee128} } } */
105 *p++ = BUILTIN1 (logl, *q++);
106
107 /* { dg-final { scan-assembler {\mbl __nearbyintieee128} } } */
108 *p++ = BUILTIN1 (nearbyintl, *q++);
109
110 /* { dg-final { scan-assembler {\mbl __exp10ieee128} } } */
111 *p++ = BUILTIN1 (pow10l, *q++);
112
113 /* { dg-final { scan-assembler {\mbl __rintieee128} } } */
114 *p++ = BUILTIN1 (rintl, *q++);
115
116 /* { dg-final { scan-assembler {\mbl __roundevenieee128} } } */
117 *p++ = BUILTIN1 (roundevenl, *q++);
118
119 /* inline code. */
120 /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,0} } } */
121 *p++ = BUILTIN1 (roundl, *q++);
122
123 /* { dg-final { scan-assembler {\mbl __significandieee128} } } */
124 *p++ = BUILTIN1 (significandl, *q++);
125
126 /* { dg-final { scan-assembler {\mbl __sinhieee128} } } */
127 *p++ = BUILTIN1 (sinhl, *q++);
128
129 /* { dg-final { scan-assembler {\mbl __sinieee128} } } */
130 *p++ = BUILTIN1 (sinl, *q++);
131
132 /* { dg-final { scan-assembler {\mbl __sqrtieee128} } } */
133 *p++ = BUILTIN1 (sqrtl, *q++);
134
135 /* { dg-final { scan-assembler {\mbl __tanhieee128} } } */
136 *p++ = BUILTIN1 (tanhl, *q++);
137
138 /* { dg-final { scan-assembler {\mbl __tanieee128} } } */
139 *p++ = BUILTIN1 (tanl, *q++);
140
141 /* { dg-final { scan-assembler {\mbl __tgammaieee128} } } */
142 *p++ = BUILTIN1 (tgammal, *q++);
143
144 /* inline code. */
145 /* { dg-final { scan-assembler {\mxsrqpi +[0-9]+,[0-9]+,[0-9]+,1} } } */
146 *p++ = BUILTIN1 (truncl, *q++);
147
148 /* { dg-final { scan-assembler {\mbl __y0ieee128} } } */
149 *p++ = BUILTIN1 (y0l, *q++);
150
151 /* { dg-final { scan-assembler {\mbl __y1ieee128} } } */
152 *p = BUILTIN1 (y1l, *q);
153
154 }
155
156 /* Built-in functions that returns a long double and take two long double
157 arguments. */
158
159 void
160 return_ld_arg_ld_ld (long double *p,
161 long double *q,
162 long double *r)
163 {
164 /* { dg-final { scan-assembler {\mbl __atan2ieee128} } } */
165 *p++ = BUILTIN2 (atan2l, *q++, *r++);
166
167 /* inline code. */
168 /* { dg-final { scan-assembler {\mxscpsgnqp} } } */
169 *p++ = BUILTIN2 (copysignl, *q++, *r++);
170
171 /* { dg-final { scan-assembler {\mbl __remainderieee128} } } */
172 *p++ = BUILTIN2 (dreml, *q++, *r++);
173
174 /* { dg-final { scan-assembler {\mbl __fdimieee128} } } */
175 *p++ = BUILTIN2 (fdiml, *q++, *r++);
176
177 /* { dg-final { scan-assembler {\mbl __fmaxieee128} } } */
178 *p++ = BUILTIN2 (fmaxl, *q++, *r++);
179
180 /* { dg-final { scan-assembler {\mbl __fminieee128} } } */
181 *p++ = BUILTIN2 (fminl, *q++, *r++);
182
183 /* { dg-final { scan-assembler {\mbl __fmodieee128} } } */
184 *p++ = BUILTIN2 (fmodl, *q++, *r++);
185
186 /* { dg-final { scan-assembler {\mbl __hypotieee128} } } */
187 *p++ = BUILTIN2 (hypotl, *q++, *r++);
188
189 /* { dg-final { scan-assembler {\mbl __nextafterieee128} } } */
190 *p++ = BUILTIN2 (nextafterl, *q++, *r++);
191
192 /* { dg-final { scan-assembler {\mbl __nexttowardieee128} } } */
193 *p++ = BUILTIN2 (nexttowardl, *q++, *r++);
194
195 /* { dg-final { scan-assembler {\mbl __powieee128} } } */
196 *p++ = BUILTIN2 (powl, *q++, *r++);
197
198 /* { dg-final { scan-assembler {\mbl __scalbnieee128} } } */
199 *p = BUILTIN2 (scalbl, *q, *r);
200 }
201
202 /* Built-in function that returns a long double and take three long double
203 arguments. */
204
205 void
206 return_ld_arg_ld_ld_ld (long double *p,
207 long double *q,
208 long double *r,
209 long double *s)
210 {
211 /* inline code. */
212 /* { dg-final { scan-assembler {\mxsmaddqp} } } */
213 *p = BUILTIN3 (fmal, *q, *r, *s);
214 }
215
216 /* Built-in functions that returns a long double and take one
217 _Complex long double argument. */
218
219 void
220 return_ld_arg_cld (long double *p,
221 _Complex long double *q)
222 {
223 /* { dg-final { scan-assembler {\mbl __cabsieee128} } } */
224 *p++ = BUILTIN1 (cabsl, *q++);
225 }
226
227 /* Built-in functions that returns a _Complex long double and takes one
228 _Complex long double argument. */
229
230 void
231 return_cld_arg_cld (_Complex long double *p,
232 _Complex long double *q)
233 {
234 /* { dg-final { scan-assembler {\mbl __cacoshieee128} } } */
235 *p++ = BUILTIN1 (cacoshl, *q++);
236
237 /* { dg-final { scan-assembler {\mbl __cacosieee128} } } */
238 *p++ = BUILTIN1 (cacosl, *q++);
239
240 /* { dg-final { scan-assembler {\mbl __casinhieee128} } } */
241 *p++ = BUILTIN1 (casinhl, *q++);
242
243 /* { dg-final { scan-assembler {\mbl __casinieee128} } } */
244 *p++ = BUILTIN1 (casinl, *q++);
245
246 /* { dg-final { scan-assembler {\mbl __catanhieee128} } } */
247 *p++ = BUILTIN1 (catanhl, *q++);
248
249 /* { dg-final { scan-assembler {\mbl __catanieee128} } } */
250 *p++ = BUILTIN1 (catanl, *q++);
251
252 /* { dg-final { scan-assembler {\mbl __ccoshieee128} } } */
253 *p++ = BUILTIN1 (ccoshl, *q++);
254
255 /* { dg-final { scan-assembler {\mbl __ccosieee128} } } */
256 *p++ = BUILTIN1 (ccosl, *q++);
257
258 /* { dg-final { scan-assembler {\mbl __cexpieee128} } } */
259 *p++ = BUILTIN1 (cexpl, *q++);
260
261 /* { dg-final { scan-assembler {\mbl __clogieee128} } } */
262 *p++ = BUILTIN1 (clogl, *q++);
263
264 /* { dg-final { scan-assembler {\mbl __clog10ieee128} } } */
265 *p++ = BUILTIN1 (clog10l, *q++);
266
267 /* { dg-final { scan-assembler {\mbl __cprojieee128} } } */
268 *p++ = BUILTIN1 (cprojl, *q++);
269
270 /* { dg-final { scan-assembler {\mbl __csinhieee128} } } */
271 *p++ = BUILTIN1 (csinhl, *q++);
272
273 /* { dg-final { scan-assembler {\mbl __csinieee128} } } */
274 *p++ = BUILTIN1 (csinl, *q++);
275
276 /* { dg-final { scan-assembler {\mbl __csqrtieee128} } } */
277 *p++ = BUILTIN1 (csqrtl, *q++);
278
279 /* { dg-final { scan-assembler {\mbl __ctanhieee128} } } */
280 *p++ = BUILTIN1 (ctanhl, *q++);
281
282 /* { dg-final { scan-assembler {\mbl __ctanieee128} } } */
283 *p = BUILTIN1 (ctanl, *q);
284 }
285
286 /* Built-in functions that returns a _Complex long double and takes one
287 long double argument. */
288
289 void
290 return_cld_arg_ld (_Complex long double *p,
291 long double *q)
292 {
293 /* { dg-final { scan-assembler {\mbl __sincosieee128} } } */
294 *p = BUILTIN1 (cexpil, *q);
295 }
296
297 /* Built-in function that returns a _Complex long double and takes two
298 _Complex long double arguments. */
299
300 void
301 return_cld_arg_cld_cld (_Complex long double *p,
302 _Complex long double *q,
303 _Complex long double *r)
304 {
305 /* { dg-final { scan-assembler {\mbl __cpowieee128} } } */
306 *p = BUILTIN2 (cpowl, *q, *r);
307 }
308
309 /* Built-in functions that returns a long double and takes a long double and a
310 pointer to an int arguments. */
311
312 void
313 return_ld_arg_ld_pi (long double *p,
314 long double *q,
315 int **r)
316 {
317 /* { dg-final { scan-assembler {\mbl __frexpieee128} } } */
318 *p++ = BUILTIN2 (frexpl, *q++, *r++);
319
320 /* { dg-final { scan-assembler {\mbl __lgammaieee128_r} } } */
321 *p++ = BUILTIN2 (gammal_r, *q++, *r++);
322 }
323
324 /* Built-in functions that returns a long double and takes a long double and an
325 int arguments. */
326
327 void
328 return_ld_arg_ld_i (long double *p,
329 long double *q,
330 int *r)
331 {
332 /* { dg-final { scan-assembler {\mbl __ldexpieee128} } } */
333 *p++ = BUILTIN2 (ldexpl, *q++, *r++);
334
335 /* { dg-final { scan-assembler {\mbl __powikf2} } } */
336 *p++ = BUILTIN2 (powil, *q++, *r++);
337
338 /* { dg-final { scan-assembler {\mbl __scalbnieee128} } } */
339 *p = BUILTIN2 (scalbnl, *q, *r);
340 }
341
342 /* Built-in function that returns a long double and takes a long double and a
343 long arguments. */
344
345 void
346 return_ld_arg_ld_l (long double *p,
347 long double *q,
348 long *r)
349 {
350 /* { dg-final { scan-assembler {\mbl __scalblnieee128} } } */
351 *p = BUILTIN2 (scalblnl, *q, *r);
352 }
353
354 /* Built-in functions that returns a long double and takes a long double and a
355 long long arguments. */
356
357 void
358 return_ld_arg_i_ld (long double *p,
359 int *q,
360 long double *r)
361 {
362 /* { dg-final { scan-assembler {\mbl __jnieee128} } } */
363 *p++ = BUILTIN2 (jnl, *q++, *r++);
364
365 /* { dg-final { scan-assembler {\mbl __ynieee128} } } */
366 *p = BUILTIN2 (ynl, *q, *r);
367 }
368
369 /* Built-in functions that returns a long double and takes a long double and a
370 pointer to a long double arguments. */
371
372 void
373 return_ld_arg_ld_pld (long double *p,
374 long double *q,
375 long double **r)
376 {
377 /* { dg-final { scan-assembler {\mbl __modfieee128} } } */
378 *p = BUILTIN2 (modfl, *q, *r);
379 }
380
381 /* Built-in function that returns a long double and takes two long double and a
382 pointer to an int arguments. */
383
384 void
385 return_ld_arg_ld_ld_pi (long double *p,
386 long double *q,
387 long double *r,
388 int **s)
389 {
390 /* { dg-final { scan-assembler {\mbl __remquoieee128} } } */
391 *p = BUILTIN3 (remquol, *q, *r, *s);
392 }
393
394 /* Built-in functions that return san int and takes one long double argument. */
395
396 void
397 return_i_arg_ld (int *p,
398 long double *q)
399 {
400 /* { dg-final { scan-assembler {\mbl __ceilieee128} } } */
401 *p++ = BUILTIN1 (iceill, *q++);
402
403 /* { dg-final { scan-assembler {\mbl __floorieee128} } } */
404 *p++ = BUILTIN1 (ifloorl, *q++);
405
406 /* { dg-final { scan-assembler {\mbl __ilogbieee128} } } */
407 *p++ = BUILTIN1 (ilogbl, *q++);
408
409 /* { dg-final { scan-assembler {\mbl __lrintieee128} } } */
410 *p++ = BUILTIN1 (irintl, *q++);
411
412 /* { dg-final { scan-assembler {\mbl __lroundieee128} } } */
413 *p++ = BUILTIN1 (iroundl, *q++);
414
415 /* inline code. */
416 /* { dg-final { scan-assembler {\mxscvqpswz} } } */
417 *p++ = BUILTIN1 (signbitl, *q++);
418 }
419
420 /* Built-in function that returns a double and takes one double and one long
421 double arguments. */
422
423 void
424 return_d_arg_d_ld (double *p,
425 double *q,
426 long double *r)
427 {
428 /* { dg-final { scan-assembler {\mbl __nexttoward_to_ieee128} } } */
429 *p = BUILTIN2 (nexttoward, *q, *r);
430 }
431
432 /* Built-in function that returns a float and takes one float and one long
433 double arguments. */
434
435 void
436 return_f_arg_f_ld (float *p,
437 float *q,
438 long double *r)
439 {
440 /* { dg-final { scan-assembler {\mbl __nexttowardf_to_ieee128} } } */
441 *p = BUILTIN2 (nexttowardf, *q, *r);
442 }