]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/tgmath.h
Do not define tgmath.h fmaxmag, fminmag macros for C2X (bug 28397)
[thirdparty/glibc.git] / math / tgmath.h
CommitLineData
2b778ceb 1/* Copyright (C) 1997-2021 Free Software Foundation, Inc.
dfd2257a
UD
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
dfd2257a
UD
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
dfd2257a 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>. */
dfd2257a
UD
17
18/*
63ae7b63 19 * ISO C99 Standard: 7.22 Type-generic math <tgmath.h>
dfd2257a
UD
20 */
21
22#ifndef _TGMATH_H
23#define _TGMATH_H 1
24
614d15f9
JM
25#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
26#include <bits/libc-header-start.h>
27
dfd2257a 28/* Include the needed headers. */
614d15f9 29#include <bits/floatn.h>
dfd2257a
UD
30#include <math.h>
31#include <complex.h>
32
33
be3a79a3
JM
34/* There are two variant implementations of type-generic macros in
35 this file: one for GCC 8 and later, using __builtin_tgmath and
36 where each macro expands each of its arguments only once, and one
37 for older GCC, using other compiler extensions but with macros
38 expanding their arguments many times (so resulting in exponential
39 blowup of the size of expansions when calls to such macros are
40 nested inside arguments to such macros). */
41
42#define __HAVE_BUILTIN_TGMATH __GNUC_PREREQ (8, 0)
dfd2257a 43
4360eafd 44#if __GNUC_PREREQ (2, 7)
dfd2257a 45
f9fabc1b
JM
46/* Certain cases of narrowing macros only need to call a single
47 function so cannot use __builtin_tgmath and do not need any
48 complicated logic. */
49# if __HAVE_FLOAT128X
50# error "Unsupported _Float128x type for <tgmath.h>."
51# endif
52# if ((__HAVE_FLOAT64X && !__HAVE_FLOAT128) \
53 || (__HAVE_FLOAT128 && !__HAVE_FLOAT64X))
54# error "Unsupported combination of types for <tgmath.h>."
55# endif
abd38358
JM
56# define __TGMATH_1_NARROW_D(F, X) \
57 (F ## l (X))
f9fabc1b
JM
58# define __TGMATH_2_NARROW_D(F, X, Y) \
59 (F ## l (X, Y))
b3f27d81
JM
60# define __TGMATH_3_NARROW_D(F, X, Y, Z) \
61 (F ## l (X, Y, Z))
abd38358
JM
62# define __TGMATH_1_NARROW_F64X(F, X) \
63 (F ## f128 (X))
f9fabc1b
JM
64# define __TGMATH_2_NARROW_F64X(F, X, Y) \
65 (F ## f128 (X, Y))
b3f27d81
JM
66# define __TGMATH_3_NARROW_F64X(F, X, Y, Z) \
67 (F ## f128 (X, Y, Z))
f9fabc1b 68# if !__HAVE_FLOAT128
abd38358
JM
69# define __TGMATH_1_NARROW_F32X(F, X) \
70 (F ## f64 (X))
f9fabc1b
JM
71# define __TGMATH_2_NARROW_F32X(F, X, Y) \
72 (F ## f64 (X, Y))
b3f27d81
JM
73# define __TGMATH_3_NARROW_F32X(F, X, Y, Z) \
74 (F ## f64 (X, Y, Z))
f9fabc1b
JM
75# endif
76
be3a79a3 77# if __HAVE_BUILTIN_TGMATH
0d3fee40 78
be3a79a3
JM
79# if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT)
80# define __TG_F16_ARG(X) X ## f16,
81# else
82# define __TG_F16_ARG(X)
83# endif
84# if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT)
85# define __TG_F32_ARG(X) X ## f32,
86# else
87# define __TG_F32_ARG(X)
88# endif
89# if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT)
90# define __TG_F64_ARG(X) X ## f64,
91# else
92# define __TG_F64_ARG(X)
93# endif
94# if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
95# define __TG_F128_ARG(X) X ## f128,
96# else
97# define __TG_F128_ARG(X)
98# endif
99# if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT)
100# define __TG_F32X_ARG(X) X ## f32x,
101# else
102# define __TG_F32X_ARG(X)
103# endif
104# if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT)
105# define __TG_F64X_ARG(X) X ## f64x,
106# else
107# define __TG_F64X_ARG(X)
108# endif
109# if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT)
110# define __TG_F128X_ARG(X) X ## f128x,
111# else
112# define __TG_F128X_ARG(X)
113# endif
114
115# define __TGMATH_FUNCS(X) X ## f, X, X ## l, \
116 __TG_F16_ARG (X) __TG_F32_ARG (X) __TG_F64_ARG (X) __TG_F128_ARG (X) \
117 __TG_F32X_ARG (X) __TG_F64X_ARG (X) __TG_F128X_ARG (X)
118# define __TGMATH_RCFUNCS(F, C) __TGMATH_FUNCS (F) __TGMATH_FUNCS (C)
119# define __TGMATH_1(F, X) __builtin_tgmath (__TGMATH_FUNCS (F) (X))
120# define __TGMATH_2(F, X, Y) __builtin_tgmath (__TGMATH_FUNCS (F) (X), (Y))
121# define __TGMATH_2STD(F, X, Y) __builtin_tgmath (F ## f, F, F ## l, (X), (Y))
122# define __TGMATH_3(F, X, Y, Z) __builtin_tgmath (__TGMATH_FUNCS (F) \
123 (X), (Y), (Z))
124# define __TGMATH_1C(F, C, X) __builtin_tgmath (__TGMATH_RCFUNCS (F, C) (X))
125# define __TGMATH_2C(F, C, X, Y) __builtin_tgmath (__TGMATH_RCFUNCS (F, C) \
126 (X), (Y))
127
f9fabc1b
JM
128# define __TGMATH_NARROW_FUNCS_F(X) X, X ## l,
129# define __TGMATH_NARROW_FUNCS_F16(X) \
130 __TG_F32_ARG (X) __TG_F64_ARG (X) __TG_F128_ARG (X) \
131 __TG_F32X_ARG (X) __TG_F64X_ARG (X) __TG_F128X_ARG (X)
132# define __TGMATH_NARROW_FUNCS_F32(X) \
133 __TG_F64_ARG (X) __TG_F128_ARG (X) \
134 __TG_F32X_ARG (X) __TG_F64X_ARG (X) __TG_F128X_ARG (X)
135# define __TGMATH_NARROW_FUNCS_F64(X) \
136 __TG_F128_ARG (X) \
137 __TG_F64X_ARG (X) __TG_F128X_ARG (X)
138# define __TGMATH_NARROW_FUNCS_F32X(X) \
139 __TG_F64X_ARG (X) __TG_F128X_ARG (X) \
140 __TG_F64_ARG (X) __TG_F128_ARG (X)
141
abd38358
JM
142# define __TGMATH_1_NARROW_F(F, X) \
143 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X))
f9fabc1b
JM
144# define __TGMATH_2_NARROW_F(F, X, Y) \
145 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X), (Y))
b3f27d81
JM
146# define __TGMATH_3_NARROW_F(F, X, Y, Z) \
147 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F (F) (X), (Y), (Z))
abd38358
JM
148# define __TGMATH_1_NARROW_F16(F, X) \
149 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X))
f9fabc1b
JM
150# define __TGMATH_2_NARROW_F16(F, X, Y) \
151 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X), (Y))
b3f27d81
JM
152# define __TGMATH_3_NARROW_F16(F, X, Y, Z) \
153 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F16 (F) (X), (Y), (Z))
abd38358
JM
154# define __TGMATH_1_NARROW_F32(F, X) \
155 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X))
f9fabc1b
JM
156# define __TGMATH_2_NARROW_F32(F, X, Y) \
157 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X), (Y))
b3f27d81
JM
158# define __TGMATH_3_NARROW_F32(F, X, Y, Z) \
159 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32 (F) (X), (Y), (Z))
abd38358
JM
160# define __TGMATH_1_NARROW_F64(F, X) \
161 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X))
f9fabc1b
JM
162# define __TGMATH_2_NARROW_F64(F, X, Y) \
163 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X), (Y))
b3f27d81
JM
164# define __TGMATH_3_NARROW_F64(F, X, Y, Z) \
165 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F64 (F) (X), (Y), (Z))
f9fabc1b 166# if __HAVE_FLOAT128
abd38358
JM
167# define __TGMATH_1_NARROW_F32X(F, X) \
168 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X))
f9fabc1b
JM
169# define __TGMATH_2_NARROW_F32X(F, X, Y) \
170 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X), (Y))
b3f27d81
JM
171# define __TGMATH_3_NARROW_F32X(F, X, Y, Z) \
172 __builtin_tgmath (__TGMATH_NARROW_FUNCS_F32X (F) (X), (Y), (Z))
f9fabc1b
JM
173# endif
174
be3a79a3
JM
175# else /* !__HAVE_BUILTIN_TGMATH. */
176
177# ifdef __NO_LONG_DOUBLE_MATH
178# define __tgml(fct) fct
179# else
180# define __tgml(fct) fct ## l
181# endif
925e31d9 182
d9bef9c0
JM
183/* __floating_type expands to 1 if TYPE is a floating type (including
184 complex floating types), 0 if TYPE is an integer type (including
185 complex integer types). __real_integer_type expands to 1 if TYPE
186 is a real integer type. __complex_integer_type expands to 1 if
187 TYPE is a complex integer type. All these macros expand to integer
188 constant expressions. All these macros can assume their argument
189 has an arithmetic type (not vector, decimal floating-point or
190 fixed-point), valid to pass to tgmath.h macros. */
be3a79a3 191# if __GNUC_PREREQ (3, 1)
d9bef9c0
JM
192/* __builtin_classify_type expands to an integer constant expression
193 in GCC 3.1 and later. Default conversions applied to the argument
194 of __builtin_classify_type mean it always returns 1 for real
195 integer types rather than ever returning different values for
196 character, boolean or enumerated types. */
be3a79a3 197# define __floating_type(type) \
d9bef9c0 198 (__builtin_classify_type (__real__ ((type) 0)) == 8)
be3a79a3 199# define __real_integer_type(type) \
d9bef9c0 200 (__builtin_classify_type ((type) 0) == 1)
be3a79a3 201# define __complex_integer_type(type) \
d9bef9c0
JM
202 (__builtin_classify_type ((type) 0) == 9 \
203 && __builtin_classify_type (__real__ ((type) 0)) == 1)
be3a79a3 204# else
d9bef9c0
JM
205/* GCC versions predating __builtin_classify_type are also looser on
206 what counts as an integer constant expression. */
be3a79a3
JM
207# define __floating_type(type) (((type) 1.25) != 1)
208# define __real_integer_type(type) (((type) (1.25 + _Complex_I)) == 1)
209# define __complex_integer_type(type) \
d9bef9c0 210 (((type) (1.25 + _Complex_I)) == (1 + _Complex_I))
be3a79a3 211# endif
925e31d9 212
d9bef9c0 213/* Whether an expression (of arithmetic type) has a real type. */
be3a79a3 214# define __expr_is_real(E) (__builtin_classify_type (E) != 9)
d9bef9c0
JM
215
216/* The tgmath real type for T, where E is 0 if T is an integer type
217 and 1 for a floating type. If T has a complex type, it is
218 unspecified whether the return type is real or complex (but it has
219 the correct corresponding real type). */
be3a79a3 220# define __tgmath_real_type_sub(T, E) \
1c298d08
UD
221 __typeof__ (*(0 ? (__typeof__ (0 ? (double *) 0 : (void *) (E))) 0 \
222 : (__typeof__ (0 ? (T *) 0 : (void *) (!(E)))) 0))
925e31d9
UD
223
224/* The tgmath real type of EXPR. */
be3a79a3 225# define __tgmath_real_type(expr) \
2fee621d
JM
226 __tgmath_real_type_sub (__typeof__ ((__typeof__ (+(expr))) 0), \
227 __floating_type (__typeof__ (+(expr))))
925e31d9 228
d9bef9c0
JM
229/* The tgmath complex type for T, where E1 is 1 if T has a floating
230 type and 0 otherwise, E2 is 1 if T has a real integer type and 0
231 otherwise, and E3 is 1 if T has a complex type and 0 otherwise. */
be3a79a3 232# define __tgmath_complex_type_sub(T, E1, E2, E3) \
d9bef9c0
JM
233 __typeof__ (*(0 \
234 ? (__typeof__ (0 ? (T *) 0 : (void *) (!(E1)))) 0 \
235 : (__typeof__ (0 \
236 ? (__typeof__ (0 \
237 ? (double *) 0 \
238 : (void *) (!(E2)))) 0 \
239 : (__typeof__ (0 \
240 ? (_Complex double *) 0 \
241 : (void *) (!(E3)))) 0)) 0))
242
243/* The tgmath complex type of EXPR. */
be3a79a3 244# define __tgmath_complex_type(expr) \
d9bef9c0
JM
245 __tgmath_complex_type_sub (__typeof__ ((__typeof__ (+(expr))) 0), \
246 __floating_type (__typeof__ (+(expr))), \
247 __real_integer_type (__typeof__ (+(expr))), \
248 __complex_integer_type (__typeof__ (+(expr))))
249
be3a79a3 250# if (__HAVE_DISTINCT_FLOAT16 \
86ec4865
JM
251 || __HAVE_DISTINCT_FLOAT32 \
252 || __HAVE_DISTINCT_FLOAT64 \
253 || __HAVE_DISTINCT_FLOAT32X \
254 || __HAVE_DISTINCT_FLOAT64X \
255 || __HAVE_DISTINCT_FLOAT128X)
be3a79a3
JM
256# error "Unsupported _FloatN or _FloatNx types for <tgmath.h>."
257# endif
86ec4865 258
614d15f9
JM
259/* Expand to text that checks if ARG_COMB has type _Float128, and if
260 so calls the appropriately suffixed FCT (which may include a cast),
261 or FCT and CFCT for complex functions, with arguments ARG_CALL. */
be3a79a3
JM
262# if __HAVE_DISTINCT_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)
263# if (!__HAVE_FLOAT64X \
86ec4865
JM
264 || __HAVE_FLOAT64X_LONG_DOUBLE \
265 || !__HAVE_FLOATN_NOT_TYPEDEF)
be3a79a3 266# define __TGMATH_F128(arg_comb, fct, arg_call) \
2fee621d 267 __builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128) \
614d15f9 268 ? fct ## f128 arg_call :
be3a79a3 269# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) \
2fee621d 270 __builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), _Float128) \
d9bef9c0 271 ? (__expr_is_real (arg_comb) \
614d15f9
JM
272 ? fct ## f128 arg_call \
273 : cfct ## f128 arg_call) :
be3a79a3 274# else
86ec4865
JM
275/* _Float64x is a distinct type at the C language level, which must be
276 handled like _Float128. */
be3a79a3 277# define __TGMATH_F128(arg_comb, fct, arg_call) \
86ec4865
JM
278 (__builtin_types_compatible_p (__typeof (+(arg_comb)), _Float128) \
279 || __builtin_types_compatible_p (__typeof (+(arg_comb)), _Float64x)) \
280 ? fct ## f128 arg_call :
be3a79a3 281# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) \
86ec4865
JM
282 (__builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), _Float128) \
283 || __builtin_types_compatible_p (__typeof (+__real__ (arg_comb)), \
284 _Float64x)) \
285 ? (__expr_is_real (arg_comb) \
286 ? fct ## f128 arg_call \
287 : cfct ## f128 arg_call) :
be3a79a3
JM
288# endif
289# else
290# define __TGMATH_F128(arg_comb, fct, arg_call) /* Nothing. */
291# define __TGMATH_CF128(arg_comb, fct, cfct, arg_call) /* Nothing. */
86ec4865 292# endif
614d15f9 293
be3a79a3 294# endif /* !__HAVE_BUILTIN_TGMATH. */
925e31d9 295
dfd2257a
UD
296/* We have two kinds of generic macros: to support functions which are
297 only defined on real valued parameters and those which are defined
298 for complex functions as well. */
be3a79a3
JM
299# if __HAVE_BUILTIN_TGMATH
300
301# define __TGMATH_UNARY_REAL_ONLY(Val, Fct) __TGMATH_1 (Fct, (Val))
302# define __TGMATH_UNARY_REAL_RET_ONLY(Val, Fct) __TGMATH_1 (Fct, (Val))
303# define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
304 __TGMATH_2 (Fct, (Val1), (Val2))
305# define __TGMATH_BINARY_FIRST_REAL_STD_ONLY(Val1, Val2, Fct) \
306 __TGMATH_2STD (Fct, (Val1), (Val2))
307# define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
308 __TGMATH_2 (Fct, (Val1), (Val2))
309# define __TGMATH_BINARY_REAL_STD_ONLY(Val1, Val2, Fct) \
310 __TGMATH_2STD (Fct, (Val1), (Val2))
be3a79a3
JM
311# define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
312 __TGMATH_3 (Fct, (Val1), (Val2), (Val3))
313# define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
314 __TGMATH_3 (Fct, (Val1), (Val2), (Val3))
315# define __TGMATH_TERNARY_FIRST_REAL_RET_ONLY(Val1, Val2, Val3, Fct) \
316 __TGMATH_3 (Fct, (Val1), (Val2), (Val3))
317# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
318 __TGMATH_1C (Fct, Cfct, (Val))
319# define __TGMATH_UNARY_IMAG(Val, Cfct) __TGMATH_1 (Cfct, (Val))
320# define __TGMATH_UNARY_REAL_IMAG_RET_REAL(Val, Fct, Cfct) \
321 __TGMATH_1C (Fct, Cfct, (Val))
322# define __TGMATH_UNARY_REAL_IMAG_RET_REAL_SAME(Val, Cfct) \
323 __TGMATH_1 (Cfct, (Val))
324# define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
325 __TGMATH_2C (Fct, Cfct, (Val1), (Val2))
326
327# else /* !__HAVE_BUILTIN_TGMATH. */
328
329# define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \
2fee621d 330 (__extension__ ((sizeof (+(Val)) == sizeof (double) \
1c298d08
UD
331 || __builtin_classify_type (Val) != 8) \
332 ? (__tgmath_real_type (Val)) Fct (Val) \
2fee621d 333 : (sizeof (+(Val)) == sizeof (float)) \
1c298d08 334 ? (__tgmath_real_type (Val)) Fct##f (Val) \
614d15f9
JM
335 : __TGMATH_F128 ((Val), (__tgmath_real_type (Val)) Fct, \
336 (Val)) \
337 (__tgmath_real_type (Val)) __tgml(Fct) (Val)))
71502ebe 338
be3a79a3 339# define __TGMATH_UNARY_REAL_RET_ONLY(Val, Fct) \
2fee621d 340 (__extension__ ((sizeof (+(Val)) == sizeof (double) \
1c298d08 341 || __builtin_classify_type (Val) != 8) \
cfa44345 342 ? Fct (Val) \
2fee621d 343 : (sizeof (+(Val)) == sizeof (float)) \
cfa44345 344 ? Fct##f (Val) \
614d15f9
JM
345 : __TGMATH_F128 ((Val), Fct, (Val)) \
346 __tgml(Fct) (Val)))
dfd2257a 347
be3a79a3 348# define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
2fee621d 349 (__extension__ ((sizeof (+(Val1)) == sizeof (double) \
614d15f9
JM
350 || __builtin_classify_type (Val1) != 8) \
351 ? (__tgmath_real_type (Val1)) Fct (Val1, Val2) \
2fee621d 352 : (sizeof (+(Val1)) == sizeof (float)) \
614d15f9
JM
353 ? (__tgmath_real_type (Val1)) Fct##f (Val1, Val2) \
354 : __TGMATH_F128 ((Val1), (__tgmath_real_type (Val1)) Fct, \
355 (Val1, Val2)) \
356 (__tgmath_real_type (Val1)) __tgml(Fct) (Val1, Val2)))
357
be3a79a3 358# define __TGMATH_BINARY_FIRST_REAL_STD_ONLY(Val1, Val2, Fct) \
2fee621d 359 (__extension__ ((sizeof (+(Val1)) == sizeof (double) \
1c298d08
UD
360 || __builtin_classify_type (Val1) != 8) \
361 ? (__tgmath_real_type (Val1)) Fct (Val1, Val2) \
2fee621d 362 : (sizeof (+(Val1)) == sizeof (float)) \
1c298d08
UD
363 ? (__tgmath_real_type (Val1)) Fct##f (Val1, Val2) \
364 : (__tgmath_real_type (Val1)) __tgml(Fct) (Val1, Val2)))
dfd2257a 365
be3a79a3 366# define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
42df8d59 367 (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double) \
1c298d08 368 && __builtin_classify_type ((Val1) + (Val2)) == 8) \
614d15f9
JM
369 ? __TGMATH_F128 ((Val1) + (Val2), \
370 (__typeof \
371 ((__tgmath_real_type (Val1)) 0 \
372 + (__tgmath_real_type (Val2)) 0)) Fct, \
373 (Val1, Val2)) \
374 (__typeof ((__tgmath_real_type (Val1)) 0 \
375 + (__tgmath_real_type (Val2)) 0)) \
376 __tgml(Fct) (Val1, Val2) \
2fee621d
JM
377 : (sizeof (+(Val1)) == sizeof (double) \
378 || sizeof (+(Val2)) == sizeof (double) \
614d15f9
JM
379 || __builtin_classify_type (Val1) != 8 \
380 || __builtin_classify_type (Val2) != 8) \
1c298d08
UD
381 ? (__typeof ((__tgmath_real_type (Val1)) 0 \
382 + (__tgmath_real_type (Val2)) 0)) \
614d15f9
JM
383 Fct (Val1, Val2) \
384 : (__typeof ((__tgmath_real_type (Val1)) 0 \
385 + (__tgmath_real_type (Val2)) 0)) \
386 Fct##f (Val1, Val2)))
387
be3a79a3 388# define __TGMATH_BINARY_REAL_STD_ONLY(Val1, Val2, Fct) \
42df8d59 389 (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double) \
614d15f9
JM
390 && __builtin_classify_type ((Val1) + (Val2)) == 8) \
391 ? (__typeof ((__tgmath_real_type (Val1)) 0 \
392 + (__tgmath_real_type (Val2)) 0)) \
1c298d08 393 __tgml(Fct) (Val1, Val2) \
2fee621d
JM
394 : (sizeof (+(Val1)) == sizeof (double) \
395 || sizeof (+(Val2)) == sizeof (double) \
1c298d08
UD
396 || __builtin_classify_type (Val1) != 8 \
397 || __builtin_classify_type (Val2) != 8) \
398 ? (__typeof ((__tgmath_real_type (Val1)) 0 \
399 + (__tgmath_real_type (Val2)) 0)) \
400 Fct (Val1, Val2) \
401 : (__typeof ((__tgmath_real_type (Val1)) 0 \
402 + (__tgmath_real_type (Val2)) 0)) \
403 Fct##f (Val1, Val2)))
dfd2257a 404
be3a79a3 405# define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
42df8d59 406 (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double) \
1c298d08 407 && __builtin_classify_type ((Val1) + (Val2)) == 8) \
614d15f9
JM
408 ? __TGMATH_F128 ((Val1) + (Val2), \
409 (__typeof \
410 ((__tgmath_real_type (Val1)) 0 \
411 + (__tgmath_real_type (Val2)) 0)) Fct, \
412 (Val1, Val2, Val3)) \
413 (__typeof ((__tgmath_real_type (Val1)) 0 \
414 + (__tgmath_real_type (Val2)) 0)) \
415 __tgml(Fct) (Val1, Val2, Val3) \
2fee621d
JM
416 : (sizeof (+(Val1)) == sizeof (double) \
417 || sizeof (+(Val2)) == sizeof (double) \
1c298d08
UD
418 || __builtin_classify_type (Val1) != 8 \
419 || __builtin_classify_type (Val2) != 8) \
420 ? (__typeof ((__tgmath_real_type (Val1)) 0 \
421 + (__tgmath_real_type (Val2)) 0)) \
422 Fct (Val1, Val2, Val3) \
423 : (__typeof ((__tgmath_real_type (Val1)) 0 \
424 + (__tgmath_real_type (Val2)) 0)) \
425 Fct##f (Val1, Val2, Val3)))
bfce746a 426
be3a79a3 427# define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
42df8d59 428 (__extension__ ((sizeof ((Val1) + (Val2) + (Val3)) > sizeof (double) \
1c298d08
UD
429 && __builtin_classify_type ((Val1) + (Val2) + (Val3)) \
430 == 8) \
614d15f9
JM
431 ? __TGMATH_F128 ((Val1) + (Val2) + (Val3), \
432 (__typeof \
433 ((__tgmath_real_type (Val1)) 0 \
434 + (__tgmath_real_type (Val2)) 0 \
435 + (__tgmath_real_type (Val3)) 0)) Fct, \
436 (Val1, Val2, Val3)) \
437 (__typeof ((__tgmath_real_type (Val1)) 0 \
438 + (__tgmath_real_type (Val2)) 0 \
439 + (__tgmath_real_type (Val3)) 0)) \
1c298d08 440 __tgml(Fct) (Val1, Val2, Val3) \
2fee621d
JM
441 : (sizeof (+(Val1)) == sizeof (double) \
442 || sizeof (+(Val2)) == sizeof (double) \
443 || sizeof (+(Val3)) == sizeof (double) \
1c298d08
UD
444 || __builtin_classify_type (Val1) != 8 \
445 || __builtin_classify_type (Val2) != 8 \
446 || __builtin_classify_type (Val3) != 8) \
447 ? (__typeof ((__tgmath_real_type (Val1)) 0 \
448 + (__tgmath_real_type (Val2)) 0 \
449 + (__tgmath_real_type (Val3)) 0)) \
450 Fct (Val1, Val2, Val3) \
451 : (__typeof ((__tgmath_real_type (Val1)) 0 \
452 + (__tgmath_real_type (Val2)) 0 \
453 + (__tgmath_real_type (Val3)) 0)) \
454 Fct##f (Val1, Val2, Val3)))
dfd2257a 455
be3a79a3 456# define __TGMATH_TERNARY_FIRST_REAL_RET_ONLY(Val1, Val2, Val3, Fct) \
2fee621d 457 (__extension__ ((sizeof (+(Val1)) == sizeof (double) \
423c2b9d 458 || __builtin_classify_type (Val1) != 8) \
cfa44345 459 ? Fct (Val1, Val2, Val3) \
2fee621d 460 : (sizeof (+(Val1)) == sizeof (float)) \
cfa44345 461 ? Fct##f (Val1, Val2, Val3) \
614d15f9
JM
462 : __TGMATH_F128 ((Val1), Fct, (Val1, Val2, Val3)) \
463 __tgml(Fct) (Val1, Val2, Val3)))
423c2b9d 464
48244d09
UD
465/* XXX This definition has to be changed as soon as the compiler understands
466 the imaginary keyword. */
be3a79a3 467# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
2fee621d 468 (__extension__ ((sizeof (+__real__ (Val)) == sizeof (double) \
1c298d08 469 || __builtin_classify_type (__real__ (Val)) != 8) \
d9bef9c0
JM
470 ? (__expr_is_real (Val) \
471 ? (__tgmath_complex_type (Val)) Fct (Val) \
472 : (__tgmath_complex_type (Val)) Cfct (Val)) \
2fee621d 473 : (sizeof (+__real__ (Val)) == sizeof (float)) \
d9bef9c0
JM
474 ? (__expr_is_real (Val) \
475 ? (__tgmath_complex_type (Val)) Fct##f (Val) \
476 : (__tgmath_complex_type (Val)) Cfct##f (Val)) \
477 : __TGMATH_CF128 ((Val), \
478 (__tgmath_complex_type (Val)) Fct, \
479 (__tgmath_complex_type (Val)) Cfct, \
614d15f9 480 (Val)) \
d9bef9c0
JM
481 (__expr_is_real (Val) \
482 ? (__tgmath_complex_type (Val)) __tgml(Fct) (Val) \
483 : (__tgmath_complex_type (Val)) __tgml(Cfct) (Val))))
1c298d08 484
be3a79a3 485# define __TGMATH_UNARY_IMAG(Val, Cfct) \
2fee621d 486 (__extension__ ((sizeof (+__real__ (Val)) == sizeof (double) \
1c298d08
UD
487 || __builtin_classify_type (__real__ (Val)) != 8) \
488 ? (__typeof__ ((__tgmath_real_type (Val)) 0 \
489 + _Complex_I)) Cfct (Val) \
2fee621d 490 : (sizeof (+__real__ (Val)) == sizeof (float)) \
1c298d08
UD
491 ? (__typeof__ ((__tgmath_real_type (Val)) 0 \
492 + _Complex_I)) Cfct##f (Val) \
614d15f9
JM
493 : __TGMATH_F128 (__real__ (Val), \
494 (__typeof__ \
495 ((__tgmath_real_type (Val)) 0 \
496 + _Complex_I)) Cfct, (Val)) \
497 (__typeof__ ((__tgmath_real_type (Val)) 0 \
498 + _Complex_I)) __tgml(Cfct) (Val)))
dfd2257a 499
58d87ee1
UD
500/* XXX This definition has to be changed as soon as the compiler understands
501 the imaginary keyword. */
be3a79a3 502# define __TGMATH_UNARY_REAL_IMAG_RET_REAL(Val, Fct, Cfct) \
2fee621d 503 (__extension__ ((sizeof (+__real__ (Val)) == sizeof (double) \
1c298d08 504 || __builtin_classify_type (__real__ (Val)) != 8) \
d9bef9c0 505 ? (__expr_is_real (Val) \
1c298d08
UD
506 ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
507 Fct (Val) \
508 : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
509 Cfct (Val)) \
2fee621d 510 : (sizeof (+__real__ (Val)) == sizeof (float)) \
d9bef9c0 511 ? (__expr_is_real (Val) \
1c298d08
UD
512 ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
513 Fct##f (Val) \
514 : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0))\
515 Cfct##f (Val)) \
614d15f9
JM
516 : __TGMATH_CF128 ((Val), \
517 (__typeof__ \
518 (__real__ \
519 (__tgmath_real_type (Val)) 0)) Fct, \
520 (__typeof__ \
521 (__real__ \
522 (__tgmath_real_type (Val)) 0)) Cfct, \
523 (Val)) \
d9bef9c0 524 (__expr_is_real (Val) \
614d15f9
JM
525 ? (__typeof__ (__real__ (__tgmath_real_type (Val)) 0)) \
526 __tgml(Fct) (Val) \
527 : (__typeof__ (__real__ (__tgmath_real_type (Val)) 0)) \
528 __tgml(Cfct) (Val))))
be3a79a3
JM
529# define __TGMATH_UNARY_REAL_IMAG_RET_REAL_SAME(Val, Cfct) \
530 __TGMATH_UNARY_REAL_IMAG_RET_REAL ((Val), Cfct, Cfct)
58d87ee1 531
48244d09
UD
532/* XXX This definition has to be changed as soon as the compiler understands
533 the imaginary keyword. */
be3a79a3 534# define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
42df8d59
JM
535 (__extension__ ((sizeof (__real__ (Val1) \
536 + __real__ (Val2)) > sizeof (double) \
1c298d08
UD
537 && __builtin_classify_type (__real__ (Val1) \
538 + __real__ (Val2)) == 8) \
614d15f9
JM
539 ? __TGMATH_CF128 ((Val1) + (Val2), \
540 (__typeof \
d9bef9c0
JM
541 ((__tgmath_complex_type (Val1)) 0 \
542 + (__tgmath_complex_type (Val2)) 0)) \
614d15f9
JM
543 Fct, \
544 (__typeof \
d9bef9c0
JM
545 ((__tgmath_complex_type (Val1)) 0 \
546 + (__tgmath_complex_type (Val2)) 0)) \
614d15f9
JM
547 Cfct, \
548 (Val1, Val2)) \
d9bef9c0
JM
549 (__expr_is_real ((Val1) + (Val2)) \
550 ? (__typeof ((__tgmath_complex_type (Val1)) 0 \
551 + (__tgmath_complex_type (Val2)) 0)) \
614d15f9 552 __tgml(Fct) (Val1, Val2) \
d9bef9c0
JM
553 : (__typeof ((__tgmath_complex_type (Val1)) 0 \
554 + (__tgmath_complex_type (Val2)) 0)) \
614d15f9 555 __tgml(Cfct) (Val1, Val2)) \
2fee621d
JM
556 : (sizeof (+__real__ (Val1)) == sizeof (double) \
557 || sizeof (+__real__ (Val2)) == sizeof (double) \
1c298d08
UD
558 || __builtin_classify_type (__real__ (Val1)) != 8 \
559 || __builtin_classify_type (__real__ (Val2)) != 8) \
d9bef9c0
JM
560 ? (__expr_is_real ((Val1) + (Val2)) \
561 ? (__typeof ((__tgmath_complex_type (Val1)) 0 \
562 + (__tgmath_complex_type (Val2)) 0)) \
1c298d08 563 Fct (Val1, Val2) \
d9bef9c0
JM
564 : (__typeof ((__tgmath_complex_type (Val1)) 0 \
565 + (__tgmath_complex_type (Val2)) 0)) \
1c298d08 566 Cfct (Val1, Val2)) \
d9bef9c0
JM
567 : (__expr_is_real ((Val1) + (Val2)) \
568 ? (__typeof ((__tgmath_complex_type (Val1)) 0 \
569 + (__tgmath_complex_type (Val2)) 0)) \
1c298d08 570 Fct##f (Val1, Val2) \
d9bef9c0
JM
571 : (__typeof ((__tgmath_complex_type (Val1)) 0 \
572 + (__tgmath_complex_type (Val2)) 0)) \
1c298d08 573 Cfct##f (Val1, Val2))))
f9fabc1b 574
abd38358
JM
575# define __TGMATH_1_NARROW_F(F, X) \
576 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (double) \
577 ? F ## l (X) \
578 : F (X)))
f9fabc1b
JM
579# define __TGMATH_2_NARROW_F(F, X, Y) \
580 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
581 + (__tgmath_real_type (Y)) 0) > sizeof (double) \
582 ? F ## l (X, Y) \
583 : F (X, Y)))
b3f27d81
JM
584# define __TGMATH_3_NARROW_F(F, X, Y, Z) \
585 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
586 + (__tgmath_real_type (Y)) 0 \
587 + (__tgmath_real_type (Z)) 0) > sizeof (double) \
588 ? F ## l (X, Y, Z) \
589 : F (X, Y, Z)))
f9fabc1b
JM
590/* In most cases, these narrowing macro definitions based on sizeof
591 ensure that the function called has the right argument format, as
592 for other <tgmath.h> macros for compilers before GCC 8, but may not
593 have exactly the argument type (among the types with that format)
594 specified in the standard logic.
595
596 In the case of macros for _Float32x return type, when _Float64x
597 exists, _Float64 arguments should result in the *f64 function being
598 called while _Float32x arguments should result in the *f64x
599 function being called. These cases cannot be distinguished using
600 sizeof (or at all if the types are typedefs rather than different
601 types). However, for these functions it is OK (does not affect the
602 final result) to call a function with any argument format at least
603 as wide as all the floating-point arguments, unless that affects
604 rounding of integer arguments. Integer arguments are considered to
605 have type _Float64, so the *f64 functions are preferred for f32x*
606 macros when no argument has a wider floating-point type. */
607# if __HAVE_FLOAT64X_LONG_DOUBLE && __HAVE_DISTINCT_FLOAT128
abd38358
JM
608# define __TGMATH_1_NARROW_F32(F, X) \
609 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
610 ? __TGMATH_F128 ((X), F, (X)) \
611 F ## f64x (X) \
612 : F ## f64 (X)))
f9fabc1b
JM
613# define __TGMATH_2_NARROW_F32(F, X, Y) \
614 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
615 + (__tgmath_real_type (Y)) 0) > sizeof (_Float64) \
616 ? __TGMATH_F128 ((X) + (Y), F, (X, Y)) \
617 F ## f64x (X, Y) \
618 : F ## f64 (X, Y)))
b3f27d81
JM
619# define __TGMATH_3_NARROW_F32(F, X, Y, Z) \
620 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
621 + (__tgmath_real_type (Y)) 0 \
622 + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
623 ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z)) \
624 F ## f64x (X, Y, Z) \
625 : F ## f64 (X, Y, Z)))
abd38358
JM
626# define __TGMATH_1_NARROW_F64(F, X) \
627 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
628 ? __TGMATH_F128 ((X), F, (X)) \
629 F ## f64x (X) \
630 : F ## f128 (X)))
f9fabc1b
JM
631# define __TGMATH_2_NARROW_F64(F, X, Y) \
632 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
633 + (__tgmath_real_type (Y)) 0) > sizeof (_Float64) \
634 ? __TGMATH_F128 ((X) + (Y), F, (X, Y)) \
635 F ## f64x (X, Y) \
636 : F ## f128 (X, Y)))
b3f27d81
JM
637# define __TGMATH_3_NARROW_F64(F, X, Y, Z) \
638 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
639 + (__tgmath_real_type (Y)) 0 \
640 + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
641 ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z)) \
642 F ## f64x (X, Y, Z) \
643 : F ## f128 (X, Y, Z)))
abd38358
JM
644# define __TGMATH_1_NARROW_F32X(F, X) \
645 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
646 ? __TGMATH_F128 ((X), F, (X)) \
647 F ## f64x (X) \
648 : F ## f64 (X)))
f9fabc1b
JM
649# define __TGMATH_2_NARROW_F32X(F, X, Y) \
650 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
651 + (__tgmath_real_type (Y)) 0) > sizeof (_Float64) \
652 ? __TGMATH_F128 ((X) + (Y), F, (X, Y)) \
653 F ## f64x (X, Y) \
654 : F ## f64 (X, Y)))
b3f27d81
JM
655# define __TGMATH_3_NARROW_F32X(F, X, Y, Z) \
656 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
657 + (__tgmath_real_type (Y)) 0 \
658 + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
659 ? __TGMATH_F128 ((X) + (Y) + (Z), F, (X, Y, Z)) \
660 F ## f64x (X, Y, Z) \
661 : F ## f64 (X, Y, Z)))
f9fabc1b 662# elif __HAVE_FLOAT128
abd38358
JM
663# define __TGMATH_1_NARROW_F32(F, X) \
664 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float64) \
665 ? F ## f128 (X) \
666 : F ## f64 (X)))
f9fabc1b
JM
667# define __TGMATH_2_NARROW_F32(F, X, Y) \
668 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
669 + (__tgmath_real_type (Y)) 0) > sizeof (_Float64) \
670 ? F ## f128 (X, Y) \
671 : F ## f64 (X, Y)))
b3f27d81
JM
672# define __TGMATH_3_NARROW_F32(F, X, Y, Z) \
673 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
674 + (__tgmath_real_type (Y)) 0 \
675 + (__tgmath_real_type (Z)) 0) > sizeof (_Float64) \
676 ? F ## f128 (X, Y, Z) \
677 : F ## f64 (X, Y, Z)))
abd38358
JM
678# define __TGMATH_1_NARROW_F64(F, X) \
679 (F ## f128 (X))
f9fabc1b
JM
680# define __TGMATH_2_NARROW_F64(F, X, Y) \
681 (F ## f128 (X, Y))
b3f27d81
JM
682# define __TGMATH_3_NARROW_F64(F, X, Y, Z) \
683 (F ## f128 (X, Y, Z))
abd38358
JM
684# define __TGMATH_1_NARROW_F32X(F, X) \
685 (__extension__ (sizeof ((__tgmath_real_type (X)) 0) > sizeof (_Float32x) \
686 ? F ## f64x (X) \
687 : F ## f64 (X)))
f9fabc1b
JM
688# define __TGMATH_2_NARROW_F32X(F, X, Y) \
689 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
690 + (__tgmath_real_type (Y)) 0) > sizeof (_Float32x) \
691 ? F ## f64x (X, Y) \
692 : F ## f64 (X, Y)))
b3f27d81
JM
693# define __TGMATH_3_NARROW_F32X(F, X, Y, Z) \
694 (__extension__ (sizeof ((__tgmath_real_type (X)) 0 \
695 + (__tgmath_real_type (Y)) 0 \
696 + (__tgmath_real_type (Z)) 0) > sizeof (_Float32x) \
697 ? F ## f64x (X, Y, Z) \
698 : F ## f64 (X, Y, Z)))
f9fabc1b 699# else
abd38358
JM
700# define __TGMATH_1_NARROW_F32(F, X) \
701 (F ## f64 (X))
f9fabc1b
JM
702# define __TGMATH_2_NARROW_F32(F, X, Y) \
703 (F ## f64 (X, Y))
b3f27d81
JM
704# define __TGMATH_3_NARROW_F32(F, X, Y, Z) \
705 (F ## f64 (X, Y, Z))
f9fabc1b 706# endif
be3a79a3 707# endif /* !__HAVE_BUILTIN_TGMATH. */
dfd2257a
UD
708#else
709# error "Unsupported compiler; you cannot use <tgmath.h>"
710#endif
711
712
713/* Unary functions defined for real and complex values. */
714
715
716/* Trigonometric functions. */
717
718/* Arc cosine of X. */
719#define acos(Val) __TGMATH_UNARY_REAL_IMAG (Val, acos, cacos)
720/* Arc sine of X. */
721#define asin(Val) __TGMATH_UNARY_REAL_IMAG (Val, asin, casin)
722/* Arc tangent of X. */
723#define atan(Val) __TGMATH_UNARY_REAL_IMAG (Val, atan, catan)
724/* Arc tangent of Y/X. */
cfb32a6c 725#define atan2(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, atan2)
dfd2257a
UD
726
727/* Cosine of X. */
728#define cos(Val) __TGMATH_UNARY_REAL_IMAG (Val, cos, ccos)
729/* Sine of X. */
730#define sin(Val) __TGMATH_UNARY_REAL_IMAG (Val, sin, csin)
731/* Tangent of X. */
732#define tan(Val) __TGMATH_UNARY_REAL_IMAG (Val, tan, ctan)
733
734
735/* Hyperbolic functions. */
736
737/* Hyperbolic arc cosine of X. */
738#define acosh(Val) __TGMATH_UNARY_REAL_IMAG (Val, acosh, cacosh)
739/* Hyperbolic arc sine of X. */
740#define asinh(Val) __TGMATH_UNARY_REAL_IMAG (Val, asinh, casinh)
741/* Hyperbolic arc tangent of X. */
742#define atanh(Val) __TGMATH_UNARY_REAL_IMAG (Val, atanh, catanh)
743
744/* Hyperbolic cosine of X. */
745#define cosh(Val) __TGMATH_UNARY_REAL_IMAG (Val, cosh, ccosh)
746/* Hyperbolic sine of X. */
747#define sinh(Val) __TGMATH_UNARY_REAL_IMAG (Val, sinh, csinh)
748/* Hyperbolic tangent of X. */
749#define tanh(Val) __TGMATH_UNARY_REAL_IMAG (Val, tanh, ctanh)
750
751
752/* Exponential and logarithmic functions. */
753
754/* Exponential function of X. */
755#define exp(Val) __TGMATH_UNARY_REAL_IMAG (Val, exp, cexp)
756
757/* Break VALUE into a normalized fraction and an integral power of 2. */
758#define frexp(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, frexp)
759
760/* X times (two to the EXP power). */
761#define ldexp(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, ldexp)
762
763/* Natural logarithm of X. */
764#define log(Val) __TGMATH_UNARY_REAL_IMAG (Val, log, clog)
765
766/* Base-ten logarithm of X. */
cc3fa755 767#ifdef __USE_GNU
0908a38a 768# define log10(Val) __TGMATH_UNARY_REAL_IMAG (Val, log10, clog10)
cc3fa755
UD
769#else
770# define log10(Val) __TGMATH_UNARY_REAL_ONLY (Val, log10)
771#endif
dfd2257a
UD
772
773/* Return exp(X) - 1. */
774#define expm1(Val) __TGMATH_UNARY_REAL_ONLY (Val, expm1)
775
776/* Return log(1 + X). */
777#define log1p(Val) __TGMATH_UNARY_REAL_ONLY (Val, log1p)
778
779/* Return the base 2 signed integral exponent of X. */
780#define logb(Val) __TGMATH_UNARY_REAL_ONLY (Val, logb)
781
782/* Compute base-2 exponential of X. */
783#define exp2(Val) __TGMATH_UNARY_REAL_ONLY (Val, exp2)
784
785/* Compute base-2 logarithm of X. */
786#define log2(Val) __TGMATH_UNARY_REAL_ONLY (Val, log2)
787
788
789/* Power functions. */
790
791/* Return X to the Y power. */
792#define pow(Val1, Val2) __TGMATH_BINARY_REAL_IMAG (Val1, Val2, pow, cpow)
793
794/* Return the square root of X. */
795#define sqrt(Val) __TGMATH_UNARY_REAL_IMAG (Val, sqrt, csqrt)
796
797/* Return `sqrt(X*X + Y*Y)'. */
798#define hypot(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, hypot)
799
800/* Return the cube root of X. */
801#define cbrt(Val) __TGMATH_UNARY_REAL_ONLY (Val, cbrt)
802
803
804/* Nearest integer, absolute value, and remainder functions. */
805
806/* Smallest integral value not less than X. */
807#define ceil(Val) __TGMATH_UNARY_REAL_ONLY (Val, ceil)
808
809/* Absolute value of X. */
f1debaf6 810#define fabs(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL (Val, fabs, cabs)
dfd2257a
UD
811
812/* Largest integer not greater than X. */
813#define floor(Val) __TGMATH_UNARY_REAL_ONLY (Val, floor)
814
815/* Floating-point modulo remainder of X/Y. */
816#define fmod(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmod)
817
818/* Round X to integral valuein floating-point format using current
819 rounding direction, but do not raise inexact exception. */
820#define nearbyint(Val) __TGMATH_UNARY_REAL_ONLY (Val, nearbyint)
821
822/* Round X to nearest integral value, rounding halfway cases away from
823 zero. */
824#define round(Val) __TGMATH_UNARY_REAL_ONLY (Val, round)
825
826/* Round X to the integral value in floating-point format nearest but
827 not larger in magnitude. */
828#define trunc(Val) __TGMATH_UNARY_REAL_ONLY (Val, trunc)
829
830/* Compute remainder of X and Y and put in *QUO a value with sign of x/y
831 and magnitude congruent `mod 2^n' to the magnitude of the integral
832 quotient x/y, with n >= 3. */
833#define remquo(Val1, Val2, Val3) \
834 __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY (Val1, Val2, Val3, remquo)
835
836/* Round X to nearest integral value according to current rounding
837 direction. */
cfa44345
JM
838#define lrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, lrint)
839#define llrint(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, llrint)
dfd2257a
UD
840
841/* Round X to nearest integral value, rounding halfway cases away from
842 zero. */
cfa44345
JM
843#define lround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, lround)
844#define llround(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, llround)
dfd2257a
UD
845
846
847/* Return X with its signed changed to Y's. */
848#define copysign(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, copysign)
849
850/* Error and gamma functions. */
851#define erf(Val) __TGMATH_UNARY_REAL_ONLY (Val, erf)
852#define erfc(Val) __TGMATH_UNARY_REAL_ONLY (Val, erfc)
00d8bc81 853#define tgamma(Val) __TGMATH_UNARY_REAL_ONLY (Val, tgamma)
dfd2257a
UD
854#define lgamma(Val) __TGMATH_UNARY_REAL_ONLY (Val, lgamma)
855
856
857/* Return the integer nearest X in the direction of the
858 prevailing rounding mode. */
859#define rint(Val) __TGMATH_UNARY_REAL_ONLY (Val, rint)
860
0175c9e9 861#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
41a359e2
RS
862/* Return X - epsilon. */
863# define nextdown(Val) __TGMATH_UNARY_REAL_ONLY (Val, nextdown)
864/* Return X + epsilon. */
865# define nextup(Val) __TGMATH_UNARY_REAL_ONLY (Val, nextup)
866#endif
867
dfd2257a
UD
868/* Return X + epsilon if X < Y, X - epsilon if X > Y. */
869#define nextafter(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, nextafter)
42bd0a85 870#define nexttoward(Val1, Val2) \
614d15f9 871 __TGMATH_BINARY_FIRST_REAL_STD_ONLY (Val1, Val2, nexttoward)
dfd2257a
UD
872
873/* Return the remainder of integer divison X / Y with infinite precision. */
874#define remainder(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, remainder)
875
876/* Return X times (2 to the Nth power). */
de20571d 877#ifdef __USE_MISC
614d15f9 878# define scalb(Val1, Val2) __TGMATH_BINARY_REAL_STD_ONLY (Val1, Val2, scalb)
26644e87 879#endif
dfd2257a
UD
880
881/* Return X times (2 to the Nth power). */
882#define scalbn(Val1, Val2) __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, scalbn)
883
884/* Return X times (2 to the Nth power). */
885#define scalbln(Val1, Val2) \
886 __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, scalbln)
887
888/* Return the binary exponent of X, which must be nonzero. */
cfa44345 889#define ilogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, ilogb)
dfd2257a
UD
890
891
892/* Return positive difference between X and Y. */
893#define fdim(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fdim)
894
895/* Return maximum numeric value from X and Y. */
896#define fmax(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmax)
897
898/* Return minimum numeric value from X and Y. */
899#define fmin(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmin)
900
901
bfce746a 902/* Multiply-add function computed as a ternary operation. */
e7c3d12b 903#define fma(Val1, Val2, Val3) \
bfce746a
UD
904 __TGMATH_TERNARY_REAL_ONLY (Val1, Val2, Val3, fma)
905
0175c9e9 906#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
41c67149
JM
907/* Round X to nearest integer value, rounding halfway cases to even. */
908# define roundeven(Val) __TGMATH_UNARY_REAL_ONLY (Val, roundeven)
909
423c2b9d 910# define fromfp(Val1, Val2, Val3) \
cfa44345 911 __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, fromfp)
423c2b9d
JM
912
913# define ufromfp(Val1, Val2, Val3) \
cfa44345 914 __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, ufromfp)
423c2b9d
JM
915
916# define fromfpx(Val1, Val2, Val3) \
cfa44345 917 __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, fromfpx)
423c2b9d
JM
918
919# define ufromfpx(Val1, Val2, Val3) \
cfa44345 920 __TGMATH_TERNARY_FIRST_REAL_RET_ONLY (Val1, Val2, Val3, ufromfpx)
423c2b9d 921
55a38f82 922/* Like ilogb, but returning long int. */
cfa44345 923# define llogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, llogb)
79850e10 924#endif
55a38f82 925
79850e10 926#if __GLIBC_USE (IEC_60559_BFP_EXT)
525f8039
JM
927/* Return value with maximum magnitude. */
928# define fmaxmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaxmag)
929
930/* Return value with minimum magnitude. */
931# define fminmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminmag)
0175c9e9 932#endif
525f8039 933
90f0ac10
JM
934#if __GLIBC_USE (ISOC2X)
935/* Return maximum value from X and Y. */
936# define fmaximum(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaximum)
937
938/* Return minimum value from X and Y. */
939# define fminimum(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminimum)
940
941/* Return maximum numeric value from X and Y. */
942# define fmaximum_num(Val1, Val2) \
943 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaximum_num)
944
945/* Return minimum numeric value from X and Y. */
946# define fminimum_num(Val1, Val2) \
947 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminimum_num)
948
949/* Return value with maximum magnitude. */
950# define fmaximum_mag(Val1, Val2) \
951 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaximum_mag)
952
953/* Return value with minimum magnitude. */
954# define fminimum_mag(Val1, Val2) \
955 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminimum_mag)
956
957/* Return numeric value with maximum magnitude. */
958# define fmaximum_mag_num(Val1, Val2) \
959 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fmaximum_mag_num)
960
961/* Return numeric value with minimum magnitude. */
962# define fminimum_mag_num(Val1, Val2) \
963 __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminimum_mag_num)
964#endif
965
bfce746a 966
dfd2257a
UD
967/* Absolute value, conjugates, and projection. */
968
969/* Argument value of Z. */
be3a79a3 970#define carg(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL_SAME (Val, carg)
dfd2257a
UD
971
972/* Complex conjugate of Z. */
1c298d08 973#define conj(Val) __TGMATH_UNARY_IMAG (Val, conj)
dfd2257a
UD
974
975/* Projection of Z onto the Riemann sphere. */
1c298d08 976#define cproj(Val) __TGMATH_UNARY_IMAG (Val, cproj)
dfd2257a
UD
977
978
979/* Decomposing complex values. */
980
981/* Imaginary part of Z. */
be3a79a3 982#define cimag(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL_SAME (Val, cimag)
dfd2257a
UD
983
984/* Real part of Z. */
be3a79a3 985#define creal(Val) __TGMATH_UNARY_REAL_IMAG_RET_REAL_SAME (Val, creal)
dfd2257a 986
f9fabc1b
JM
987
988/* Narrowing functions. */
989
990#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
991
992/* Add. */
993# define fadd(Val1, Val2) __TGMATH_2_NARROW_F (fadd, Val1, Val2)
994# define dadd(Val1, Val2) __TGMATH_2_NARROW_D (dadd, Val1, Val2)
995
996/* Divide. */
997# define fdiv(Val1, Val2) __TGMATH_2_NARROW_F (fdiv, Val1, Val2)
998# define ddiv(Val1, Val2) __TGMATH_2_NARROW_D (ddiv, Val1, Val2)
999
1000/* Multiply. */
1001# define fmul(Val1, Val2) __TGMATH_2_NARROW_F (fmul, Val1, Val2)
1002# define dmul(Val1, Val2) __TGMATH_2_NARROW_D (dmul, Val1, Val2)
1003
1004/* Subtract. */
1005# define fsub(Val1, Val2) __TGMATH_2_NARROW_F (fsub, Val1, Val2)
1006# define dsub(Val1, Val2) __TGMATH_2_NARROW_D (dsub, Val1, Val2)
1007
abd38358
JM
1008/* Square root. */
1009# define fsqrt(Val) __TGMATH_1_NARROW_F (fsqrt, Val)
1010# define dsqrt(Val) __TGMATH_1_NARROW_D (dsqrt, Val)
1011
b3f27d81
JM
1012/* Fused multiply-add. */
1013# define ffma(Val1, Val2, Val3) __TGMATH_3_NARROW_F (ffma, Val1, Val2, Val3)
1014# define dfma(Val1, Val2, Val3) __TGMATH_3_NARROW_D (dfma, Val1, Val2, Val3)
1015
f9fabc1b
JM
1016#endif
1017
1018#if __GLIBC_USE (IEC_60559_TYPES_EXT)
1019
1020# if __HAVE_FLOAT16
1021# define f16add(Val1, Val2) __TGMATH_2_NARROW_F16 (f16add, Val1, Val2)
1022# define f16div(Val1, Val2) __TGMATH_2_NARROW_F16 (f16div, Val1, Val2)
1023# define f16mul(Val1, Val2) __TGMATH_2_NARROW_F16 (f16mul, Val1, Val2)
1024# define f16sub(Val1, Val2) __TGMATH_2_NARROW_F16 (f16sub, Val1, Val2)
abd38358 1025# define f16sqrt(Val) __TGMATH_1_NARROW_F16 (f16sqrt, Val)
b3f27d81
JM
1026# define f16fma(Val1, Val2, Val3) \
1027 __TGMATH_3_NARROW_F16 (f16fma, Val1, Val2, Val3)
f9fabc1b
JM
1028# endif
1029
1030# if __HAVE_FLOAT32
1031# define f32add(Val1, Val2) __TGMATH_2_NARROW_F32 (f32add, Val1, Val2)
1032# define f32div(Val1, Val2) __TGMATH_2_NARROW_F32 (f32div, Val1, Val2)
1033# define f32mul(Val1, Val2) __TGMATH_2_NARROW_F32 (f32mul, Val1, Val2)
1034# define f32sub(Val1, Val2) __TGMATH_2_NARROW_F32 (f32sub, Val1, Val2)
abd38358 1035# define f32sqrt(Val) __TGMATH_1_NARROW_F32 (f32sqrt, Val)
b3f27d81
JM
1036# define f32fma(Val1, Val2, Val3) \
1037 __TGMATH_3_NARROW_F32 (f32fma, Val1, Val2, Val3)
f9fabc1b
JM
1038# endif
1039
1040# if __HAVE_FLOAT64 && (__HAVE_FLOAT64X || __HAVE_FLOAT128)
1041# define f64add(Val1, Val2) __TGMATH_2_NARROW_F64 (f64add, Val1, Val2)
1042# define f64div(Val1, Val2) __TGMATH_2_NARROW_F64 (f64div, Val1, Val2)
1043# define f64mul(Val1, Val2) __TGMATH_2_NARROW_F64 (f64mul, Val1, Val2)
1044# define f64sub(Val1, Val2) __TGMATH_2_NARROW_F64 (f64sub, Val1, Val2)
abd38358 1045# define f64sqrt(Val) __TGMATH_1_NARROW_F64 (f64sqrt, Val)
b3f27d81
JM
1046# define f64fma(Val1, Val2, Val3) \
1047 __TGMATH_3_NARROW_F64 (f64fma, Val1, Val2, Val3)
f9fabc1b
JM
1048# endif
1049
1050# if __HAVE_FLOAT32X
1051# define f32xadd(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xadd, Val1, Val2)
1052# define f32xdiv(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xdiv, Val1, Val2)
1053# define f32xmul(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xmul, Val1, Val2)
1054# define f32xsub(Val1, Val2) __TGMATH_2_NARROW_F32X (f32xsub, Val1, Val2)
abd38358 1055# define f32xsqrt(Val) __TGMATH_1_NARROW_F32X (f32xsqrt, Val)
b3f27d81
JM
1056# define f32xfma(Val1, Val2, Val3) \
1057 __TGMATH_3_NARROW_F32X (f32xfma, Val1, Val2, Val3)
f9fabc1b
JM
1058# endif
1059
1060# if __HAVE_FLOAT64X && (__HAVE_FLOAT128X || __HAVE_FLOAT128)
1061# define f64xadd(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xadd, Val1, Val2)
1062# define f64xdiv(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xdiv, Val1, Val2)
1063# define f64xmul(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xmul, Val1, Val2)
1064# define f64xsub(Val1, Val2) __TGMATH_2_NARROW_F64X (f64xsub, Val1, Val2)
abd38358 1065# define f64xsqrt(Val) __TGMATH_1_NARROW_F64X (f64xsqrt, Val)
b3f27d81
JM
1066# define f64xfma(Val1, Val2, Val3) \
1067 __TGMATH_3_NARROW_F64X (f64xfma, Val1, Val2, Val3)
f9fabc1b
JM
1068# endif
1069
1070#endif
1071
dfd2257a 1072#endif /* tgmath.h */