xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/ginclude/tgmath.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1*8feb0f0bSmrg /* Copyright (C) 2004-2020 Free Software Foundation, Inc.
236ac495dSmrg    Contributed by Apple, Inc.
336ac495dSmrg 
436ac495dSmrg This file is part of GCC.
536ac495dSmrg 
636ac495dSmrg GCC is free software; you can redistribute it and/or modify
736ac495dSmrg it under the terms of the GNU General Public License as published by
836ac495dSmrg the Free Software Foundation; either version 3, or (at your option)
936ac495dSmrg any later version.
1036ac495dSmrg 
1136ac495dSmrg GCC is distributed in the hope that it will be useful,
1236ac495dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
1336ac495dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1436ac495dSmrg GNU General Public License for more details.
1536ac495dSmrg 
1636ac495dSmrg Under Section 7 of GPL version 3, you are granted additional
1736ac495dSmrg permissions described in the GCC Runtime Library Exception, version
1836ac495dSmrg 3.1, as published by the Free Software Foundation.
1936ac495dSmrg 
2036ac495dSmrg You should have received a copy of the GNU General Public License and
2136ac495dSmrg a copy of the GCC Runtime Library Exception along with this program;
2236ac495dSmrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2336ac495dSmrg <http://www.gnu.org/licenses/>.  */
2436ac495dSmrg 
2536ac495dSmrg /*
2636ac495dSmrg  * ISO C Standard:  7.22  Type-generic math <tgmath.h>
2736ac495dSmrg  */
2836ac495dSmrg 
2936ac495dSmrg #ifndef _TGMATH_H
3036ac495dSmrg #define _TGMATH_H
3136ac495dSmrg 
3236ac495dSmrg #include <math.h>
3336ac495dSmrg 
3436ac495dSmrg #ifndef __cplusplus
3536ac495dSmrg #include <complex.h>
3636ac495dSmrg 
3736ac495dSmrg /* Naming convention: generic macros are defining using
3836ac495dSmrg    __TGMATH_CPLX*, __TGMATH_REAL*, and __TGMATH_CPLX_ONLY.  _CPLX
3936ac495dSmrg    means the generic argument(s) may be real or complex, _REAL means
4036ac495dSmrg    real only, _CPLX means complex only.  If there is no suffix, we are
41a2dc1f3fSmrg    defining a function of one argument.  If the suffix is _n
42a2dc1f3fSmrg    it is a function of n arguments.  We only define these macros for
43a2dc1f3fSmrg    values of n that are needed. */
4436ac495dSmrg 
4536ac495dSmrg #define __TGMATH_CPLX(z,R,C)				\
46a2dc1f3fSmrg   __builtin_tgmath (R##f, R, R##l, C##f, C, C##l, (z))
4736ac495dSmrg 
4836ac495dSmrg #define __TGMATH_CPLX_2(z1,z2,R,C)				\
49a2dc1f3fSmrg   __builtin_tgmath (R##f, R, R##l, C##f, C, C##l, (z1), (z2))
5036ac495dSmrg 
5136ac495dSmrg #define __TGMATH_REAL(x,R) \
52a2dc1f3fSmrg   __builtin_tgmath (R##f, R, R##l, (x))
5336ac495dSmrg #define __TGMATH_REAL_2(x,y,R) \
54a2dc1f3fSmrg   __builtin_tgmath (R##f, R, R##l, (x), (y))
5536ac495dSmrg #define __TGMATH_REAL_3(x,y,z,R) \
56a2dc1f3fSmrg   __builtin_tgmath (R##f, R, R##l, (x), (y), (z))
5736ac495dSmrg #define __TGMATH_CPLX_ONLY(z,C) \
58a2dc1f3fSmrg   __builtin_tgmath (C##f, C, C##l, (z))
5936ac495dSmrg 
6036ac495dSmrg /* Functions defined in both <math.h> and <complex.h> (7.22p4) */
6136ac495dSmrg #define acos(z)          __TGMATH_CPLX(z, acos, cacos)
6236ac495dSmrg #define asin(z)          __TGMATH_CPLX(z, asin, casin)
6336ac495dSmrg #define atan(z)          __TGMATH_CPLX(z, atan, catan)
6436ac495dSmrg #define acosh(z)         __TGMATH_CPLX(z, acosh, cacosh)
6536ac495dSmrg #define asinh(z)         __TGMATH_CPLX(z, asinh, casinh)
6636ac495dSmrg #define atanh(z)         __TGMATH_CPLX(z, atanh, catanh)
6736ac495dSmrg #define cos(z)           __TGMATH_CPLX(z, cos, ccos)
6836ac495dSmrg #define sin(z)           __TGMATH_CPLX(z, sin, csin)
6936ac495dSmrg #define tan(z)           __TGMATH_CPLX(z, tan, ctan)
7036ac495dSmrg #define cosh(z)          __TGMATH_CPLX(z, cosh, ccosh)
7136ac495dSmrg #define sinh(z)          __TGMATH_CPLX(z, sinh, csinh)
7236ac495dSmrg #define tanh(z)          __TGMATH_CPLX(z, tanh, ctanh)
7336ac495dSmrg #define exp(z)           __TGMATH_CPLX(z, exp, cexp)
7436ac495dSmrg #define log(z)           __TGMATH_CPLX(z, log, clog)
7536ac495dSmrg #define pow(z1,z2)       __TGMATH_CPLX_2(z1, z2, pow, cpow)
7636ac495dSmrg #define sqrt(z)          __TGMATH_CPLX(z, sqrt, csqrt)
7736ac495dSmrg #define fabs(z)          __TGMATH_CPLX(z, fabs, cabs)
7836ac495dSmrg 
7936ac495dSmrg /* Functions defined in <math.h> only (7.22p5) */
8036ac495dSmrg #define atan2(x,y)       __TGMATH_REAL_2(x, y, atan2)
8136ac495dSmrg #define cbrt(x)          __TGMATH_REAL(x, cbrt)
8236ac495dSmrg #define ceil(x)          __TGMATH_REAL(x, ceil)
8336ac495dSmrg #define copysign(x,y)    __TGMATH_REAL_2(x, y, copysign)
8436ac495dSmrg #define erf(x)           __TGMATH_REAL(x, erf)
8536ac495dSmrg #define erfc(x)          __TGMATH_REAL(x, erfc)
8636ac495dSmrg #define exp2(x)          __TGMATH_REAL(x, exp2)
8736ac495dSmrg #define expm1(x)         __TGMATH_REAL(x, expm1)
8836ac495dSmrg #define fdim(x,y)        __TGMATH_REAL_2(x, y, fdim)
8936ac495dSmrg #define floor(x)         __TGMATH_REAL(x, floor)
9036ac495dSmrg #define fma(x,y,z)       __TGMATH_REAL_3(x, y, z, fma)
9136ac495dSmrg #define fmax(x,y)        __TGMATH_REAL_2(x, y, fmax)
9236ac495dSmrg #define fmin(x,y)        __TGMATH_REAL_2(x, y, fmin)
9336ac495dSmrg #define fmod(x,y)        __TGMATH_REAL_2(x, y, fmod)
94a2dc1f3fSmrg #define frexp(x,y)       __TGMATH_REAL_2(x, y, frexp)
9536ac495dSmrg #define hypot(x,y)       __TGMATH_REAL_2(x, y, hypot)
9636ac495dSmrg #define ilogb(x)         __TGMATH_REAL(x, ilogb)
97a2dc1f3fSmrg #define ldexp(x,y)       __TGMATH_REAL_2(x, y, ldexp)
9836ac495dSmrg #define lgamma(x)        __TGMATH_REAL(x, lgamma)
9936ac495dSmrg #define llrint(x)        __TGMATH_REAL(x, llrint)
10036ac495dSmrg #define llround(x)       __TGMATH_REAL(x, llround)
10136ac495dSmrg #define log10(x)         __TGMATH_REAL(x, log10)
10236ac495dSmrg #define log1p(x)         __TGMATH_REAL(x, log1p)
10336ac495dSmrg #define log2(x)          __TGMATH_REAL(x, log2)
10436ac495dSmrg #define logb(x)          __TGMATH_REAL(x, logb)
10536ac495dSmrg #define lrint(x)         __TGMATH_REAL(x, lrint)
10636ac495dSmrg #define lround(x)        __TGMATH_REAL(x, lround)
10736ac495dSmrg #define nearbyint(x)     __TGMATH_REAL(x, nearbyint)
10836ac495dSmrg #define nextafter(x,y)   __TGMATH_REAL_2(x, y, nextafter)
109a2dc1f3fSmrg #define nexttoward(x,y)  __TGMATH_REAL_2(x, y, nexttoward)
11036ac495dSmrg #define remainder(x,y)   __TGMATH_REAL_2(x, y, remainder)
111a2dc1f3fSmrg #define remquo(x,y,z)    __TGMATH_REAL_3(x, y, z, remquo)
11236ac495dSmrg #define rint(x)          __TGMATH_REAL(x, rint)
11336ac495dSmrg #define round(x)         __TGMATH_REAL(x, round)
114a2dc1f3fSmrg #define scalbn(x,y)      __TGMATH_REAL_2(x, y, scalbn)
115a2dc1f3fSmrg #define scalbln(x,y)     __TGMATH_REAL_2(x, y, scalbln)
11636ac495dSmrg #define tgamma(x)        __TGMATH_REAL(x, tgamma)
11736ac495dSmrg #define trunc(x)         __TGMATH_REAL(x, trunc)
11836ac495dSmrg 
11936ac495dSmrg /* Functions defined in <complex.h> only (7.22p6) */
12036ac495dSmrg #define carg(z)          __TGMATH_CPLX_ONLY(z, carg)
12136ac495dSmrg #define cimag(z)         __TGMATH_CPLX_ONLY(z, cimag)
12236ac495dSmrg #define conj(z)          __TGMATH_CPLX_ONLY(z, conj)
12336ac495dSmrg #define cproj(z)         __TGMATH_CPLX_ONLY(z, cproj)
12436ac495dSmrg #define creal(z)         __TGMATH_CPLX_ONLY(z, creal)
12536ac495dSmrg 
12636ac495dSmrg #endif /* __cplusplus */
12736ac495dSmrg #endif /* _TGMATH_H */
128