1/*-
2 * Copyright (c) 2004 Stefan Farfeleder <stefanf@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28
29#include <sys/cdefs.h>
30/* All of our functions have side effects, __pure2 causes functions calls to
31 * be optimised away.  Stop that. */
32#undef __pure2
33#define	__pure2
34
35#include <assert.h>
36#include <stdio.h>
37#include <tgmath.h>
38
39int n_float, n_double, n_long_double;
40int n_float_complex, n_double_complex, n_long_double_complex;
41
42int currtest = 0;
43
44#define	TGMACRO(FNC)							\
45	TGMACRO_REAL(FNC)						\
46	TGMACRO_COMPLEX(c ## FNC)
47
48#define	TGMACRO_REAL(FNC)						\
49	float (FNC ## f)(float x) { n_float++; }			\
50	double (FNC)(double x) { n_double++; }				\
51	long double (FNC ## l)(long double x) { n_long_double++; }
52
53#define	TGMACRO_REAL_REAL(FNC)						\
54	float (FNC ## f)(float x, float y) { n_float++; }		\
55	double (FNC)(double x, double y) { n_double++; }		\
56	long double							\
57	(FNC ## l)(long double x, long double y) { n_long_double++; }
58
59#define	TGMACRO_REAL_FIXED_RET(FNC, TYPE)				\
60	TYPE (FNC ## f)(float x) { n_float++; }				\
61	TYPE (FNC)(double x) { n_double++; }				\
62	TYPE (FNC ## l)(long double x) { n_long_double++; }
63
64#define	TGMACRO_COMPLEX(FNC)						\
65	float complex (FNC ## f)(float complex x) { n_float_complex++; }\
66	double complex (FNC)(double complex x) { n_double_complex++; }	\
67	long double complex						\
68	(FNC ## l)(long double complex x) { n_long_double_complex++; }
69
70#define	TGMACRO_COMPLEX_REAL_RET(FNC)					\
71	float (FNC ## f)(float complex x) { n_float_complex++; }	\
72	double (FNC)(double complex x) { n_double_complex++; }		\
73	long double							\
74	(FNC ## l)(long double complex x) { n_long_double_complex++; }
75
76
77/* 7.22#4 */
78TGMACRO(acos)
79TGMACRO(asin)
80TGMACRO(atan)
81TGMACRO(acosh)
82TGMACRO(asinh)
83TGMACRO(atanh)
84TGMACRO(cos)
85TGMACRO(sin)
86TGMACRO(tan)
87TGMACRO(cosh)
88TGMACRO(sinh)
89TGMACRO(tanh)
90TGMACRO(exp)
91TGMACRO(log)
92TGMACRO_REAL_REAL(pow)
93float complex (cpowf)(float complex x, float complex y) { n_float_complex++; }
94double complex
95(cpow)(double complex x, double complex y) { n_double_complex++; }
96long double complex
97(cpowl)(long double complex x, long double complex y)
98{ n_long_double_complex++; }
99TGMACRO(sqrt)
100TGMACRO_REAL(fabs)
101TGMACRO_COMPLEX_REAL_RET(cabs)
102
103/* 7.22#5 */
104TGMACRO_REAL_REAL(atan2)
105TGMACRO_REAL(cbrt)
106TGMACRO_REAL(ceil)
107TGMACRO_REAL_REAL(copysign)
108TGMACRO_REAL(erf)
109TGMACRO_REAL(erfc)
110TGMACRO_REAL(exp2)
111TGMACRO_REAL(expm1)
112TGMACRO_REAL_REAL(fdim)
113TGMACRO_REAL(floor)
114float (fmaf)(float x, float y, float z) { n_float++; }
115double (fma)(double x, double y, double z) { n_double++; }
116long double
117(fmal)(long double x, long double y, long double z) { n_long_double++; }
118TGMACRO_REAL_REAL(fmax)
119TGMACRO_REAL_REAL(fmin)
120TGMACRO_REAL_REAL(fmod)
121float (frexpf)(float x, int *e) { n_float++; }
122double (frexp)(double x, int *e) { n_double++; }
123long double (frexpl)(long double x, int *e) { n_long_double++; }
124TGMACRO_REAL_REAL(hypot)
125TGMACRO_REAL_FIXED_RET(ilogb, int)
126float (ldexpf)(float x, int e) { n_float++; }
127double (ldexp)(double x, int e) { n_double++; }
128long double (ldexpl)(long double x, int e) { n_long_double++; }
129TGMACRO_REAL(lgamma)
130TGMACRO_REAL_FIXED_RET(llrint, long long)
131TGMACRO_REAL_FIXED_RET(llround, long long)
132TGMACRO_REAL(log10)
133TGMACRO_REAL(log1p)
134TGMACRO_REAL(log2)
135TGMACRO_REAL(logb)
136TGMACRO_REAL_FIXED_RET(lrint, long)
137TGMACRO_REAL_FIXED_RET(lround, long)
138TGMACRO_REAL(nearbyint)
139TGMACRO_REAL_REAL(nextafter)
140float (nexttowardf)(float x, long double y) { n_float++; }
141double (nexttoward)(double x, long double y) { n_double++; }
142long double (nexttowardl)(long double x, long double y) { n_long_double++; }
143TGMACRO_REAL_REAL(remainder)
144float (remquof)(float x, float y, int *q) { n_float++; }
145double (remquo)(double x, double y, int *q) { n_double++; }
146long double (remquol)(long double x, long double y, int *q) { n_long_double++; }
147TGMACRO_REAL(rint)
148TGMACRO_REAL(round)
149float (scalbnf)(float x, int n) { n_float++; }
150double (scalbn)(double x, int n) { n_double++; }
151long double (scalbnl)(long double x, int n) { n_long_double++; }
152float (scalblnf)(float x, long n) { n_float++; }
153double (scalbln)(double x, long n) { n_double++; }
154long double (scalblnl)(long double x, long n) { n_long_double++; }
155TGMACRO_REAL(tgamma)
156TGMACRO_REAL(trunc)
157
158/* 7.22#6 */
159TGMACRO_COMPLEX_REAL_RET(carg)
160TGMACRO_COMPLEX_REAL_RET(cimag)
161TGMACRO_COMPLEX(conj)
162TGMACRO_COMPLEX(cproj)
163TGMACRO_COMPLEX_REAL_RET(creal)
164
165
166long double ld;
167double d;
168float f;
169long double complex ldc;
170double complex dc;
171float complex fc;
172unsigned long long ull;
173int i;
174_Bool b;
175
176#define	SAMETYPE(EXP, TYPE)						\
177	__builtin_types_compatible_p(__typeof__(EXP), TYPE)
178
179#define	CLEAR_COUNTERS							\
180	(n_float = n_double = n_long_double = 0,			\
181	    n_float_complex = n_double_complex = n_long_double_complex = 0, 1)
182
183#define	RUN_TEST(EXP, TYPE)	(EXP, SAMETYPE(EXP, TYPE))
184
185#define	PASS_REAL_ARG_REAL_RET(FNC) PASS_REAL_ARG_REAL_RET_(FNC,)
186
187#define	PASS_REAL_ARG_REAL_RET_(FNC, SUFFIX)				\
188	CLEAR_COUNTERS &&						\
189	RUN_TEST(FNC(1.l), long double) &&				\
190	RUN_TEST(FNC(ld), long double) &&				\
191	n_long_double ## SUFFIX == 2 &&					\
192	RUN_TEST(FNC(1.), double) &&					\
193	RUN_TEST(FNC(d), double) &&					\
194	RUN_TEST(FNC(1ull), double) &&					\
195	RUN_TEST(FNC(ull), double) &&					\
196	RUN_TEST(FNC(1), double) &&					\
197	RUN_TEST(FNC(i), double) &&					\
198	RUN_TEST(FNC((_Bool)0), double) &&				\
199	RUN_TEST(FNC(b), double) &&					\
200	n_double ## SUFFIX == 8 &&					\
201	RUN_TEST(FNC(1.f), float) &&					\
202	RUN_TEST(FNC(f), float) &&					\
203	n_float ## SUFFIX == 2
204
205#define	PASS_REAL_ARG_FIXED_RET(FNC, RET)				\
206	CLEAR_COUNTERS &&						\
207	RUN_TEST(FNC(1.l), RET) &&					\
208	RUN_TEST(FNC(ld), RET) &&					\
209	n_long_double == 2 &&						\
210	RUN_TEST(FNC(1.), RET) &&					\
211	RUN_TEST(FNC(d), RET) &&					\
212	RUN_TEST(FNC(1ull), RET) &&					\
213	RUN_TEST(FNC(ull), RET) &&					\
214	RUN_TEST(FNC(1), RET) &&					\
215	RUN_TEST(FNC(i), RET) &&					\
216	RUN_TEST(FNC((_Bool)0), RET) &&					\
217	RUN_TEST(FNC(b), RET) &&					\
218	n_double == 8 &&						\
219	RUN_TEST(FNC(1.f), RET) &&					\
220	RUN_TEST(FNC(f), RET) &&					\
221	n_float == 2
222
223#define	PASS_REAL_FIXED_ARG_REAL_RET(FNC, ARG2)				\
224	CLEAR_COUNTERS &&						\
225	RUN_TEST(FNC(1.l, ARG2), long double) &&			\
226	RUN_TEST(FNC(ld, ARG2), long double) &&				\
227	n_long_double == 2 &&						\
228	RUN_TEST(FNC(1., ARG2), double) &&				\
229	RUN_TEST(FNC(d, ARG2), double) &&				\
230	RUN_TEST(FNC(1ull, ARG2), double) &&				\
231	RUN_TEST(FNC(ull, ARG2), double) &&				\
232	RUN_TEST(FNC(1, ARG2), double) &&				\
233	RUN_TEST(FNC(i, ARG2), double) &&				\
234	RUN_TEST(FNC((_Bool)0, ARG2), double) &&			\
235	RUN_TEST(FNC(b, ARG2), double) &&				\
236	n_double == 8 &&						\
237	RUN_TEST(FNC(1.f, ARG2), float) &&				\
238	RUN_TEST(FNC(f, ARG2), float) &&				\
239	n_float == 2
240
241#define	PASS_REAL_REAL_ARG_REAL_RET(FNC)				\
242	CLEAR_COUNTERS &&						\
243	RUN_TEST(FNC(1.l, 1.l), long double) &&				\
244	RUN_TEST(FNC(1.l, 1.), long double) &&				\
245	RUN_TEST(FNC(1.l, 1.f), long double) &&				\
246	RUN_TEST(FNC(1.l, 1), long double) &&				\
247	RUN_TEST(FNC(1.l, (_Bool)0), long double) &&			\
248	RUN_TEST(FNC(1.l, ld), long double) &&				\
249	RUN_TEST(FNC(1., ld), long double) &&				\
250	RUN_TEST(FNC(1.f, ld), long double) &&				\
251	RUN_TEST(FNC(1, ld), long double) &&				\
252	RUN_TEST(FNC((_Bool)0, ld), long double) &&			\
253	n_long_double == 10 &&						\
254	RUN_TEST(FNC(d, 1.), double) &&					\
255	RUN_TEST(FNC(d, 1.f), double) &&				\
256	RUN_TEST(FNC(d, 1l), double) &&					\
257	RUN_TEST(FNC(d, (_Bool)0), double) &&				\
258	RUN_TEST(FNC(1., 1.), double) &&				\
259	RUN_TEST(FNC(1.f, 1.), double) &&				\
260	RUN_TEST(FNC(1l, 1.), double) &&				\
261	RUN_TEST(FNC((_Bool)0, 1.), double) &&				\
262	RUN_TEST(FNC(1ull, f), double) &&				\
263	RUN_TEST(FNC(1.f, ull), double) &&				\
264	RUN_TEST(FNC(1, 1l), double) &&					\
265	RUN_TEST(FNC(1u, i), double) &&					\
266	RUN_TEST(FNC((_Bool)0, 1.f), double) &&				\
267	RUN_TEST(FNC(1.f, b), double) &&				\
268	n_double == 14 &&						\
269	RUN_TEST(FNC(1.f, 1.f), float) &&				\
270	RUN_TEST(FNC(1.f, 1.f), float) &&				\
271	RUN_TEST(FNC(f, 1.f), float) &&					\
272	RUN_TEST(FNC(f, f), float) &&					\
273	n_float == 4
274
275#define	PASS_REAL_REAL_FIXED_ARG_REAL_RET(FNC, ARG3)			\
276	CLEAR_COUNTERS &&						\
277	RUN_TEST(FNC(1.l, 1.l, ARG3), long double) &&			\
278	RUN_TEST(FNC(1.l, 1., ARG3), long double) &&			\
279	RUN_TEST(FNC(1.l, 1.f, ARG3), long double) &&			\
280	RUN_TEST(FNC(1.l, 1, ARG3), long double) &&			\
281	RUN_TEST(FNC(1.l, (_Bool)0, ARG3), long double) &&		\
282	RUN_TEST(FNC(1.l, ld, ARG3), long double) &&			\
283	RUN_TEST(FNC(1., ld, ARG3), long double) &&			\
284	RUN_TEST(FNC(1.f, ld, ARG3), long double) &&			\
285	RUN_TEST(FNC(1, ld, ARG3), long double) &&			\
286	RUN_TEST(FNC((_Bool)0, ld, ARG3), long double) &&		\
287	n_long_double == 10 &&						\
288	RUN_TEST(FNC(d, 1., ARG3), double) &&				\
289	RUN_TEST(FNC(d, 1.f, ARG3), double) &&				\
290	RUN_TEST(FNC(d, 1l, ARG3), double) &&				\
291	RUN_TEST(FNC(d, (_Bool)0, ARG3), double) &&			\
292	RUN_TEST(FNC(1., 1., ARG3), double) &&				\
293	RUN_TEST(FNC(1.f, 1., ARG3), double) &&				\
294	RUN_TEST(FNC(1l, 1., ARG3), double) &&				\
295	RUN_TEST(FNC((_Bool)0, 1., ARG3), double) &&			\
296	RUN_TEST(FNC(1ull, f, ARG3), double) &&				\
297	RUN_TEST(FNC(1.f, ull, ARG3), double) &&			\
298	RUN_TEST(FNC(1, 1l, ARG3), double) &&				\
299	RUN_TEST(FNC(1u, i, ARG3), double) &&				\
300	RUN_TEST(FNC((_Bool)0, 1.f, ARG3), double) &&			\
301	RUN_TEST(FNC(1.f, b, ARG3), double) &&				\
302	n_double == 14 &&						\
303	RUN_TEST(FNC(1.f, 1.f, ARG3), float) &&				\
304	RUN_TEST(FNC(1.f, 1.f, ARG3), float) &&				\
305	RUN_TEST(FNC(f, 1.f, ARG3), float) &&				\
306	RUN_TEST(FNC(f, f, ARG3), float) &&				\
307	n_float == 4
308
309#define	PASS_REAL_REAL_REAL_ARG_REAL_RET(FNC)				\
310	CLEAR_COUNTERS &&						\
311	RUN_TEST(FNC(ld, d, f), long double) &&				\
312	RUN_TEST(FNC(1, ld, ld), long double) &&			\
313	RUN_TEST(FNC(1, d, ld), long double) &&				\
314	n_long_double == 3 &&						\
315	RUN_TEST(FNC(1, f, 1.f), double) &&				\
316	RUN_TEST(FNC(f, d, 1.f), double) &&				\
317	RUN_TEST(FNC(f, 1.f, 1.), double) &&				\
318	n_double == 3 &&						\
319	RUN_TEST(FNC(f, 1.f, f), float) &&				\
320	n_float == 1
321
322#define	PASS_REAL_ARG_COMPLEX_RET(FNC)					\
323	CLEAR_COUNTERS &&						\
324	RUN_TEST(FNC(1.l), long double complex) &&			\
325	RUN_TEST(FNC(ld), long double complex) &&			\
326	n_long_double_complex == 2 &&					\
327	RUN_TEST(FNC(1.), double complex) &&				\
328	RUN_TEST(FNC(d), double complex) &&				\
329	RUN_TEST(FNC(1l), double complex) &&				\
330	RUN_TEST(FNC(i), double complex) &&				\
331	RUN_TEST(FNC(b), double complex) &&				\
332	n_double_complex == 5 &&					\
333	RUN_TEST(FNC(1.f), float complex) &&				\
334	RUN_TEST(FNC(f), float complex) &&				\
335	n_float_complex == 2
336
337#define	PASS_COMPLEX_ARG_COMPLEX_RET(FNC)				\
338	CLEAR_COUNTERS &&						\
339	RUN_TEST(FNC(ldc), long double complex) &&			\
340	n_long_double_complex == 1 &&					\
341	RUN_TEST(FNC(dc), double complex) &&				\
342	n_double_complex == 1 &&					\
343	RUN_TEST(FNC(fc), float complex) &&				\
344	RUN_TEST(FNC(I), float complex) &&				\
345	n_float_complex == 2
346
347#define	PASS_COMPLEX_ARG_REAL_RET(FNC)					\
348	CLEAR_COUNTERS &&						\
349	RUN_TEST(FNC(ldc), long double) &&				\
350	n_long_double_complex == 1 &&					\
351	RUN_TEST(FNC(dc), double) &&					\
352	n_double_complex == 1 &&					\
353	RUN_TEST(FNC(fc), float) &&					\
354	RUN_TEST(FNC(I), float) &&					\
355	n_float_complex == 2
356
357#define	PASS_COMPLEX_COMPLEX_ARG_COMPLEX_RET(FNC)			\
358	CLEAR_COUNTERS &&						\
359	RUN_TEST(FNC(ldc, ldc), long double complex) &&			\
360	RUN_TEST(FNC(ldc, dc), long double complex) &&			\
361	RUN_TEST(FNC(ldc, fc), long double complex) &&			\
362	RUN_TEST(FNC(ldc, ld), long double complex) &&			\
363	RUN_TEST(FNC(ldc, d), long double complex) &&			\
364	RUN_TEST(FNC(ldc, f), long double complex) &&			\
365	RUN_TEST(FNC(ldc, i), long double complex) &&			\
366	RUN_TEST(FNC(dc, ldc), long double complex) &&			\
367	RUN_TEST(FNC(I, ldc), long double complex) &&			\
368	RUN_TEST(FNC(1.l, ldc), long double complex) &&			\
369	RUN_TEST(FNC(1., ldc), long double complex) &&			\
370	RUN_TEST(FNC(1.f, ldc), long double complex) &&			\
371	RUN_TEST(FNC(1, ldc), long double complex) &&			\
372	RUN_TEST(FNC(ld, dc), long double complex) &&			\
373	RUN_TEST(FNC(ld, fc), long double complex) &&			\
374	RUN_TEST(FNC(I, 1.l), long double complex) &&			\
375	RUN_TEST(FNC(dc, 1.l), long double complex) &&			\
376	n_long_double_complex == 17 &&					\
377	RUN_TEST(FNC(dc, dc), double complex) &&			\
378	RUN_TEST(FNC(dc, fc), double complex) &&			\
379	RUN_TEST(FNC(dc, d), double complex) &&				\
380	RUN_TEST(FNC(dc, f), double complex) &&				\
381	RUN_TEST(FNC(dc, ull), double complex) &&			\
382	RUN_TEST(FNC(I, dc), double complex) &&				\
383	RUN_TEST(FNC(1., dc), double complex) &&			\
384	RUN_TEST(FNC(1, dc), double complex) &&				\
385	RUN_TEST(FNC(fc, d), double complex) &&				\
386	RUN_TEST(FNC(1, I), double complex) &&				\
387	n_double_complex == 10 &&					\
388	RUN_TEST(FNC(fc, fc), float complex) &&				\
389	RUN_TEST(FNC(fc, I), float complex) &&				\
390	RUN_TEST(FNC(1.f, fc), float complex) &&			\
391	n_float_complex == 3
392
393int failed = 0;
394#define	PRINT(STR, X) do {						\
395	currtest++;							\
396	int result = (X);						\
397	if (!result)							\
398		failed = 1;						\
399	printf("%s %d - %s\n", result ? "ok" : "not ok", currtest, (STR));		\
400	fflush(stdout);							\
401} while (0)
402
403int
404main(void)
405{
406	printf("1..60\n");
407
408	/* 7.22#4 */
409	PRINT("acos",
410	    PASS_REAL_ARG_REAL_RET(acos) &&
411	    PASS_COMPLEX_ARG_COMPLEX_RET(acos));
412
413	PRINT("asin",
414	    PASS_REAL_ARG_REAL_RET(asin) &&
415	    PASS_COMPLEX_ARG_COMPLEX_RET(asin));
416
417	PRINT("atan",
418	    PASS_REAL_ARG_REAL_RET(atan) &&
419	    PASS_COMPLEX_ARG_COMPLEX_RET(atan));
420
421	PRINT("acosh",
422	    PASS_REAL_ARG_REAL_RET(acosh) &&
423	    PASS_COMPLEX_ARG_COMPLEX_RET(acosh));
424
425	PRINT("asinh",
426	    PASS_REAL_ARG_REAL_RET(asinh) &&
427	    PASS_COMPLEX_ARG_COMPLEX_RET(asinh));
428
429	PRINT("atanh",
430	    PASS_REAL_ARG_REAL_RET(atanh) &&
431	    PASS_COMPLEX_ARG_COMPLEX_RET(atanh));
432
433	PRINT("cos",
434	    PASS_REAL_ARG_REAL_RET(cos) &&
435	    PASS_COMPLEX_ARG_COMPLEX_RET(cos));
436
437	PRINT("sin",
438	    PASS_REAL_ARG_REAL_RET(sin) &&
439	    PASS_COMPLEX_ARG_COMPLEX_RET(sin));
440
441	PRINT("tan",
442	    PASS_REAL_ARG_REAL_RET(tan) &&
443	    PASS_COMPLEX_ARG_COMPLEX_RET(tan));
444
445	PRINT("cosh",
446	    PASS_REAL_ARG_REAL_RET(cosh) &&
447	    PASS_COMPLEX_ARG_COMPLEX_RET(cosh));
448
449	PRINT("sinh",
450	    PASS_REAL_ARG_REAL_RET(sinh) &&
451	    PASS_COMPLEX_ARG_COMPLEX_RET(sinh));
452
453	PRINT("tanh",
454	    PASS_REAL_ARG_REAL_RET(tanh) &&
455	    PASS_COMPLEX_ARG_COMPLEX_RET(tanh));
456
457	PRINT("exp",
458	    PASS_REAL_ARG_REAL_RET(exp) &&
459	    PASS_COMPLEX_ARG_COMPLEX_RET(exp));
460
461	PRINT("log",
462	    PASS_REAL_ARG_REAL_RET(log) &&
463	    PASS_COMPLEX_ARG_COMPLEX_RET(log));
464
465	PRINT("pow",
466	    PASS_REAL_REAL_ARG_REAL_RET(pow) &&
467	    PASS_COMPLEX_COMPLEX_ARG_COMPLEX_RET(pow));
468
469	PRINT("sqrt",
470	    PASS_REAL_ARG_REAL_RET(sqrt) &&
471	    PASS_COMPLEX_ARG_COMPLEX_RET(sqrt));
472
473	PRINT("fabs",
474	    PASS_REAL_ARG_REAL_RET(fabs) &&
475	    PASS_COMPLEX_ARG_REAL_RET(fabs));
476
477	/* 7.22#5 */
478	PRINT("atan2",
479	    PASS_REAL_REAL_ARG_REAL_RET(atan2));
480
481	PRINT("cbrt",
482	    PASS_REAL_ARG_REAL_RET(cbrt));
483
484	PRINT("ceil",
485	    PASS_REAL_ARG_REAL_RET(ceil));
486
487	PRINT("copysign",
488	    PASS_REAL_REAL_ARG_REAL_RET(copysign));
489
490	PRINT("erf",
491	    PASS_REAL_ARG_REAL_RET(erf));
492
493	PRINT("erfc",
494	    PASS_REAL_ARG_REAL_RET(erfc));
495
496	PRINT("exp2",
497	    PASS_REAL_ARG_REAL_RET(exp2));
498
499	PRINT("expm1",
500	    PASS_REAL_ARG_REAL_RET(expm1));
501
502	PRINT("fdim",
503	    PASS_REAL_REAL_ARG_REAL_RET(fdim));
504
505	PRINT("floor",
506	    PASS_REAL_ARG_REAL_RET(floor));
507
508	PRINT("fma",
509	    PASS_REAL_REAL_REAL_ARG_REAL_RET(fma));
510
511	PRINT("fmax",
512	    PASS_REAL_REAL_ARG_REAL_RET(fmax));
513
514	PRINT("fmin",
515	    PASS_REAL_REAL_ARG_REAL_RET(fmin));
516
517	PRINT("fmod",
518	    PASS_REAL_REAL_ARG_REAL_RET(fmod));
519
520	PRINT("frexp",
521	    PASS_REAL_FIXED_ARG_REAL_RET(frexp, &i));
522
523	PRINT("hypot",
524	    PASS_REAL_REAL_ARG_REAL_RET(hypot));
525
526	PRINT("ilogb",
527	    PASS_REAL_ARG_FIXED_RET(ilogb, int));
528
529	PRINT("ldexp",
530	    PASS_REAL_FIXED_ARG_REAL_RET(ldexp, 1) &&
531	    PASS_REAL_FIXED_ARG_REAL_RET(ldexp, ld) &&
532	    PASS_REAL_FIXED_ARG_REAL_RET(ldexp, ldc));
533
534	PRINT("lgamma",
535	    PASS_REAL_ARG_REAL_RET(lgamma));
536
537	PRINT("llrint",
538	    PASS_REAL_ARG_FIXED_RET(llrint, long long));
539
540	PRINT("llround",
541	    PASS_REAL_ARG_FIXED_RET(llround, long long));
542
543	PRINT("log10",
544	    PASS_REAL_ARG_REAL_RET(log10));
545
546	PRINT("log1p",
547	    PASS_REAL_ARG_REAL_RET(log1p));
548
549	PRINT("log2",
550	    PASS_REAL_ARG_REAL_RET(log2));
551
552	PRINT("logb",
553	    PASS_REAL_ARG_REAL_RET(logb));
554
555	PRINT("lrint",
556	    PASS_REAL_ARG_FIXED_RET(lrint, long));
557
558	PRINT("lround",
559	    PASS_REAL_ARG_FIXED_RET(lround, long));
560
561	PRINT("nearbyint",
562	    PASS_REAL_ARG_REAL_RET(nearbyint));
563
564	PRINT("nextafter",
565	    PASS_REAL_REAL_ARG_REAL_RET(nextafter));
566
567	PRINT("nexttoward",
568	    PASS_REAL_FIXED_ARG_REAL_RET(nexttoward, 1) &&
569	    PASS_REAL_FIXED_ARG_REAL_RET(nexttoward, ull) &&
570	    PASS_REAL_FIXED_ARG_REAL_RET(nexttoward, d) &&
571	    PASS_REAL_FIXED_ARG_REAL_RET(nexttoward, fc));
572
573	PRINT("remainder",
574	    PASS_REAL_REAL_ARG_REAL_RET(remainder));
575
576	PRINT("remquo",
577	    PASS_REAL_REAL_FIXED_ARG_REAL_RET(remquo, &i));
578
579	PRINT("rint",
580	    PASS_REAL_ARG_REAL_RET(rint));
581
582	PRINT("round",
583	    PASS_REAL_ARG_REAL_RET(round));
584
585	PRINT("scalbn",
586	    PASS_REAL_FIXED_ARG_REAL_RET(scalbn, 1) &&
587	    PASS_REAL_FIXED_ARG_REAL_RET(scalbn, b) &&
588	    PASS_REAL_FIXED_ARG_REAL_RET(scalbn, I));
589
590	PRINT("scalbln",
591	    PASS_REAL_FIXED_ARG_REAL_RET(scalbln, i) &&
592	    PASS_REAL_FIXED_ARG_REAL_RET(scalbln, 1.l) &&
593	    PASS_REAL_FIXED_ARG_REAL_RET(scalbln, dc));
594
595	PRINT("tgamma",
596	    PASS_REAL_ARG_REAL_RET(tgamma));
597
598	PRINT("trunc",
599	    PASS_REAL_ARG_REAL_RET(trunc));
600
601	/* 7.22#6 */
602	PRINT("carg",
603	    PASS_REAL_ARG_REAL_RET_(carg, _complex) &&
604	    PASS_COMPLEX_ARG_REAL_RET(carg));
605
606	PRINT("cimag",
607	    PASS_REAL_ARG_REAL_RET_(cimag, _complex) &&
608	    PASS_COMPLEX_ARG_REAL_RET(cimag));
609
610	PRINT("conj",
611	    PASS_REAL_ARG_COMPLEX_RET(conj) &&
612	    PASS_COMPLEX_ARG_COMPLEX_RET(conj));
613
614	PRINT("cproj",
615	    PASS_REAL_ARG_COMPLEX_RET(cproj) &&
616	    PASS_COMPLEX_ARG_COMPLEX_RET(cproj));
617
618	PRINT("creal",
619	    PASS_REAL_ARG_REAL_RET_(creal, _complex) &&
620	    PASS_COMPLEX_ARG_REAL_RET(creal));
621}
622