xref: /freebsd/contrib/llvm-project/libcxx/include/math.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric // -*- C++ -*-
2349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric //
40b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric //
80b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric #ifndef _LIBCPP_MATH_H
110b57cec5SDimitry Andric #define _LIBCPP_MATH_H
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric /*
140b57cec5SDimitry Andric     math.h synopsis
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric Macros:
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric     HUGE_VAL
190b57cec5SDimitry Andric     HUGE_VALF               // C99
200b57cec5SDimitry Andric     HUGE_VALL               // C99
210b57cec5SDimitry Andric     INFINITY                // C99
220b57cec5SDimitry Andric     NAN                     // C99
230b57cec5SDimitry Andric     FP_INFINITE             // C99
240b57cec5SDimitry Andric     FP_NAN                  // C99
250b57cec5SDimitry Andric     FP_NORMAL               // C99
260b57cec5SDimitry Andric     FP_SUBNORMAL            // C99
270b57cec5SDimitry Andric     FP_ZERO                 // C99
280b57cec5SDimitry Andric     FP_FAST_FMA             // C99
290b57cec5SDimitry Andric     FP_FAST_FMAF            // C99
300b57cec5SDimitry Andric     FP_FAST_FMAL            // C99
310b57cec5SDimitry Andric     FP_ILOGB0               // C99
320b57cec5SDimitry Andric     FP_ILOGBNAN             // C99
330b57cec5SDimitry Andric     MATH_ERRNO              // C99
340b57cec5SDimitry Andric     MATH_ERREXCEPT          // C99
350b57cec5SDimitry Andric     math_errhandling        // C99
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric Types:
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric     float_t                 // C99
400b57cec5SDimitry Andric     double_t                // C99
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric // C90
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric floating_point abs(floating_point x);
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric floating_point acos (arithmetic x);
470b57cec5SDimitry Andric float          acosf(float x);
480b57cec5SDimitry Andric long double    acosl(long double x);
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric floating_point asin (arithmetic x);
510b57cec5SDimitry Andric float          asinf(float x);
520b57cec5SDimitry Andric long double    asinl(long double x);
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric floating_point atan (arithmetic x);
550b57cec5SDimitry Andric float          atanf(float x);
560b57cec5SDimitry Andric long double    atanl(long double x);
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric floating_point atan2 (arithmetic y, arithmetic x);
590b57cec5SDimitry Andric float          atan2f(float y, float x);
600b57cec5SDimitry Andric long double    atan2l(long double y, long double x);
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric floating_point ceil (arithmetic x);
630b57cec5SDimitry Andric float          ceilf(float x);
640b57cec5SDimitry Andric long double    ceill(long double x);
650b57cec5SDimitry Andric 
660b57cec5SDimitry Andric floating_point cos (arithmetic x);
670b57cec5SDimitry Andric float          cosf(float x);
680b57cec5SDimitry Andric long double    cosl(long double x);
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric floating_point cosh (arithmetic x);
710b57cec5SDimitry Andric float          coshf(float x);
720b57cec5SDimitry Andric long double    coshl(long double x);
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric floating_point exp (arithmetic x);
750b57cec5SDimitry Andric float          expf(float x);
760b57cec5SDimitry Andric long double    expl(long double x);
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric floating_point fabs (arithmetic x);
790b57cec5SDimitry Andric float          fabsf(float x);
800b57cec5SDimitry Andric long double    fabsl(long double x);
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric floating_point floor (arithmetic x);
830b57cec5SDimitry Andric float          floorf(float x);
840b57cec5SDimitry Andric long double    floorl(long double x);
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric floating_point fmod (arithmetic x, arithmetic y);
870b57cec5SDimitry Andric float          fmodf(float x, float y);
880b57cec5SDimitry Andric long double    fmodl(long double x, long double y);
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric floating_point frexp (arithmetic value, int* exp);
910b57cec5SDimitry Andric float          frexpf(float value, int* exp);
920b57cec5SDimitry Andric long double    frexpl(long double value, int* exp);
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric floating_point ldexp (arithmetic value, int exp);
950b57cec5SDimitry Andric float          ldexpf(float value, int exp);
960b57cec5SDimitry Andric long double    ldexpl(long double value, int exp);
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric floating_point log (arithmetic x);
990b57cec5SDimitry Andric float          logf(float x);
1000b57cec5SDimitry Andric long double    logl(long double x);
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric floating_point log10 (arithmetic x);
1030b57cec5SDimitry Andric float          log10f(float x);
1040b57cec5SDimitry Andric long double    log10l(long double x);
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric floating_point modf (floating_point value, floating_point* iptr);
1070b57cec5SDimitry Andric float          modff(float value, float* iptr);
1080b57cec5SDimitry Andric long double    modfl(long double value, long double* iptr);
1090b57cec5SDimitry Andric 
1100b57cec5SDimitry Andric floating_point pow (arithmetic x, arithmetic y);
1110b57cec5SDimitry Andric float          powf(float x, float y);
1120b57cec5SDimitry Andric long double    powl(long double x, long double y);
1130b57cec5SDimitry Andric 
1140b57cec5SDimitry Andric floating_point sin (arithmetic x);
1150b57cec5SDimitry Andric float          sinf(float x);
1160b57cec5SDimitry Andric long double    sinl(long double x);
1170b57cec5SDimitry Andric 
1180b57cec5SDimitry Andric floating_point sinh (arithmetic x);
1190b57cec5SDimitry Andric float          sinhf(float x);
1200b57cec5SDimitry Andric long double    sinhl(long double x);
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric floating_point sqrt (arithmetic x);
1230b57cec5SDimitry Andric float          sqrtf(float x);
1240b57cec5SDimitry Andric long double    sqrtl(long double x);
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric floating_point tan (arithmetic x);
1270b57cec5SDimitry Andric float          tanf(float x);
1280b57cec5SDimitry Andric long double    tanl(long double x);
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric floating_point tanh (arithmetic x);
1310b57cec5SDimitry Andric float          tanhf(float x);
1320b57cec5SDimitry Andric long double    tanhl(long double x);
1330b57cec5SDimitry Andric 
1340b57cec5SDimitry Andric //  C99
1350b57cec5SDimitry Andric 
1360b57cec5SDimitry Andric bool signbit(arithmetic x);
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric int fpclassify(arithmetic x);
1390b57cec5SDimitry Andric 
1400b57cec5SDimitry Andric bool isfinite(arithmetic x);
1410b57cec5SDimitry Andric bool isinf(arithmetic x);
1420b57cec5SDimitry Andric bool isnan(arithmetic x);
1430b57cec5SDimitry Andric bool isnormal(arithmetic x);
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric bool isgreater(arithmetic x, arithmetic y);
1460b57cec5SDimitry Andric bool isgreaterequal(arithmetic x, arithmetic y);
1470b57cec5SDimitry Andric bool isless(arithmetic x, arithmetic y);
1480b57cec5SDimitry Andric bool islessequal(arithmetic x, arithmetic y);
1490b57cec5SDimitry Andric bool islessgreater(arithmetic x, arithmetic y);
1500b57cec5SDimitry Andric bool isunordered(arithmetic x, arithmetic y);
1510b57cec5SDimitry Andric 
1520b57cec5SDimitry Andric floating_point acosh (arithmetic x);
1530b57cec5SDimitry Andric float          acoshf(float x);
1540b57cec5SDimitry Andric long double    acoshl(long double x);
1550b57cec5SDimitry Andric 
1560b57cec5SDimitry Andric floating_point asinh (arithmetic x);
1570b57cec5SDimitry Andric float          asinhf(float x);
1580b57cec5SDimitry Andric long double    asinhl(long double x);
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric floating_point atanh (arithmetic x);
1610b57cec5SDimitry Andric float          atanhf(float x);
1620b57cec5SDimitry Andric long double    atanhl(long double x);
1630b57cec5SDimitry Andric 
1640b57cec5SDimitry Andric floating_point cbrt (arithmetic x);
1650b57cec5SDimitry Andric float          cbrtf(float x);
1660b57cec5SDimitry Andric long double    cbrtl(long double x);
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric floating_point copysign (arithmetic x, arithmetic y);
1690b57cec5SDimitry Andric float          copysignf(float x, float y);
1700b57cec5SDimitry Andric long double    copysignl(long double x, long double y);
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric floating_point erf (arithmetic x);
1730b57cec5SDimitry Andric float          erff(float x);
1740b57cec5SDimitry Andric long double    erfl(long double x);
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric floating_point erfc (arithmetic x);
1770b57cec5SDimitry Andric float          erfcf(float x);
1780b57cec5SDimitry Andric long double    erfcl(long double x);
1790b57cec5SDimitry Andric 
1800b57cec5SDimitry Andric floating_point exp2 (arithmetic x);
1810b57cec5SDimitry Andric float          exp2f(float x);
1820b57cec5SDimitry Andric long double    exp2l(long double x);
1830b57cec5SDimitry Andric 
1840b57cec5SDimitry Andric floating_point expm1 (arithmetic x);
1850b57cec5SDimitry Andric float          expm1f(float x);
1860b57cec5SDimitry Andric long double    expm1l(long double x);
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric floating_point fdim (arithmetic x, arithmetic y);
1890b57cec5SDimitry Andric float          fdimf(float x, float y);
1900b57cec5SDimitry Andric long double    fdiml(long double x, long double y);
1910b57cec5SDimitry Andric 
1920b57cec5SDimitry Andric floating_point fma (arithmetic x, arithmetic y, arithmetic z);
1930b57cec5SDimitry Andric float          fmaf(float x, float y, float z);
1940b57cec5SDimitry Andric long double    fmal(long double x, long double y, long double z);
1950b57cec5SDimitry Andric 
1960b57cec5SDimitry Andric floating_point fmax (arithmetic x, arithmetic y);
1970b57cec5SDimitry Andric float          fmaxf(float x, float y);
1980b57cec5SDimitry Andric long double    fmaxl(long double x, long double y);
1990b57cec5SDimitry Andric 
2000b57cec5SDimitry Andric floating_point fmin (arithmetic x, arithmetic y);
2010b57cec5SDimitry Andric float          fminf(float x, float y);
2020b57cec5SDimitry Andric long double    fminl(long double x, long double y);
2030b57cec5SDimitry Andric 
2040b57cec5SDimitry Andric floating_point hypot (arithmetic x, arithmetic y);
2050b57cec5SDimitry Andric float          hypotf(float x, float y);
2060b57cec5SDimitry Andric long double    hypotl(long double x, long double y);
2070b57cec5SDimitry Andric 
2080b57cec5SDimitry Andric int ilogb (arithmetic x);
2090b57cec5SDimitry Andric int ilogbf(float x);
2100b57cec5SDimitry Andric int ilogbl(long double x);
2110b57cec5SDimitry Andric 
2120b57cec5SDimitry Andric floating_point lgamma (arithmetic x);
2130b57cec5SDimitry Andric float          lgammaf(float x);
2140b57cec5SDimitry Andric long double    lgammal(long double x);
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric long long llrint (arithmetic x);
2170b57cec5SDimitry Andric long long llrintf(float x);
2180b57cec5SDimitry Andric long long llrintl(long double x);
2190b57cec5SDimitry Andric 
2200b57cec5SDimitry Andric long long llround (arithmetic x);
2210b57cec5SDimitry Andric long long llroundf(float x);
2220b57cec5SDimitry Andric long long llroundl(long double x);
2230b57cec5SDimitry Andric 
2240b57cec5SDimitry Andric floating_point log1p (arithmetic x);
2250b57cec5SDimitry Andric float          log1pf(float x);
2260b57cec5SDimitry Andric long double    log1pl(long double x);
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric floating_point log2 (arithmetic x);
2290b57cec5SDimitry Andric float          log2f(float x);
2300b57cec5SDimitry Andric long double    log2l(long double x);
2310b57cec5SDimitry Andric 
2320b57cec5SDimitry Andric floating_point logb (arithmetic x);
2330b57cec5SDimitry Andric float          logbf(float x);
2340b57cec5SDimitry Andric long double    logbl(long double x);
2350b57cec5SDimitry Andric 
2360b57cec5SDimitry Andric long lrint (arithmetic x);
2370b57cec5SDimitry Andric long lrintf(float x);
2380b57cec5SDimitry Andric long lrintl(long double x);
2390b57cec5SDimitry Andric 
2400b57cec5SDimitry Andric long lround (arithmetic x);
2410b57cec5SDimitry Andric long lroundf(float x);
2420b57cec5SDimitry Andric long lroundl(long double x);
2430b57cec5SDimitry Andric 
2440b57cec5SDimitry Andric double      nan (const char* str);
2450b57cec5SDimitry Andric float       nanf(const char* str);
2460b57cec5SDimitry Andric long double nanl(const char* str);
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric floating_point nearbyint (arithmetic x);
2490b57cec5SDimitry Andric float          nearbyintf(float x);
2500b57cec5SDimitry Andric long double    nearbyintl(long double x);
2510b57cec5SDimitry Andric 
2520b57cec5SDimitry Andric floating_point nextafter (arithmetic x, arithmetic y);
2530b57cec5SDimitry Andric float          nextafterf(float x, float y);
2540b57cec5SDimitry Andric long double    nextafterl(long double x, long double y);
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric floating_point nexttoward (arithmetic x, long double y);
2570b57cec5SDimitry Andric float          nexttowardf(float x, long double y);
2580b57cec5SDimitry Andric long double    nexttowardl(long double x, long double y);
2590b57cec5SDimitry Andric 
2600b57cec5SDimitry Andric floating_point remainder (arithmetic x, arithmetic y);
2610b57cec5SDimitry Andric float          remainderf(float x, float y);
2620b57cec5SDimitry Andric long double    remainderl(long double x, long double y);
2630b57cec5SDimitry Andric 
2640b57cec5SDimitry Andric floating_point remquo (arithmetic x, arithmetic y, int* pquo);
2650b57cec5SDimitry Andric float          remquof(float x, float y, int* pquo);
2660b57cec5SDimitry Andric long double    remquol(long double x, long double y, int* pquo);
2670b57cec5SDimitry Andric 
2680b57cec5SDimitry Andric floating_point rint (arithmetic x);
2690b57cec5SDimitry Andric float          rintf(float x);
2700b57cec5SDimitry Andric long double    rintl(long double x);
2710b57cec5SDimitry Andric 
2720b57cec5SDimitry Andric floating_point round (arithmetic x);
2730b57cec5SDimitry Andric float          roundf(float x);
2740b57cec5SDimitry Andric long double    roundl(long double x);
2750b57cec5SDimitry Andric 
2760b57cec5SDimitry Andric floating_point scalbln (arithmetic x, long ex);
2770b57cec5SDimitry Andric float          scalblnf(float x, long ex);
2780b57cec5SDimitry Andric long double    scalblnl(long double x, long ex);
2790b57cec5SDimitry Andric 
2800b57cec5SDimitry Andric floating_point scalbn (arithmetic x, int ex);
2810b57cec5SDimitry Andric float          scalbnf(float x, int ex);
2820b57cec5SDimitry Andric long double    scalbnl(long double x, int ex);
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric floating_point tgamma (arithmetic x);
2850b57cec5SDimitry Andric float          tgammaf(float x);
2860b57cec5SDimitry Andric long double    tgammal(long double x);
2870b57cec5SDimitry Andric 
2880b57cec5SDimitry Andric floating_point trunc (arithmetic x);
2890b57cec5SDimitry Andric float          truncf(float x);
2900b57cec5SDimitry Andric long double    truncl(long double x);
2910b57cec5SDimitry Andric 
2920b57cec5SDimitry Andric */
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric #include <__config>
2950b57cec5SDimitry Andric 
2960b57cec5SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2970b57cec5SDimitry Andric #  pragma GCC system_header
2980b57cec5SDimitry Andric #endif
2990b57cec5SDimitry Andric 
300*bdd1243dSDimitry Andric #  if __has_include_next(<math.h>)
3010b57cec5SDimitry Andric #    include_next <math.h>
302*bdd1243dSDimitry Andric #  endif
3030b57cec5SDimitry Andric 
3040b57cec5SDimitry Andric #ifdef __cplusplus
3050b57cec5SDimitry Andric 
3060b57cec5SDimitry Andric // We support including .h headers inside 'extern "C"' contexts, so switch
3070b57cec5SDimitry Andric // back to C++ linkage before including these C++ headers.
3080b57cec5SDimitry Andric extern "C++" {
3090b57cec5SDimitry Andric 
310*bdd1243dSDimitry Andric #include <__type_traits/enable_if.h>
311*bdd1243dSDimitry Andric #include <__type_traits/is_floating_point.h>
312*bdd1243dSDimitry Andric #include <__type_traits/is_integral.h>
313*bdd1243dSDimitry Andric #include <__type_traits/is_same.h>
314972a253aSDimitry Andric #include <__type_traits/promote.h>
31504eeddc0SDimitry Andric #include <limits>
3165ffd83dbSDimitry Andric #include <stdlib.h>
317*bdd1243dSDimitry Andric 
318*bdd1243dSDimitry Andric 
319*bdd1243dSDimitry Andric #    ifdef fpclassify
320*bdd1243dSDimitry Andric #      undef fpclassify
321*bdd1243dSDimitry Andric #    endif
322*bdd1243dSDimitry Andric 
323*bdd1243dSDimitry Andric #    ifdef signbit
324*bdd1243dSDimitry Andric #      undef signbit
325*bdd1243dSDimitry Andric #    endif
326*bdd1243dSDimitry Andric 
327*bdd1243dSDimitry Andric #    ifdef isfinite
328*bdd1243dSDimitry Andric #      undef isfinite
329*bdd1243dSDimitry Andric #    endif
330*bdd1243dSDimitry Andric 
331*bdd1243dSDimitry Andric #    ifdef isinf
332*bdd1243dSDimitry Andric #      undef isinf
333*bdd1243dSDimitry Andric #    endif
334*bdd1243dSDimitry Andric 
335*bdd1243dSDimitry Andric #    ifdef isnan
336*bdd1243dSDimitry Andric #      undef isnan
337*bdd1243dSDimitry Andric #    endif
338*bdd1243dSDimitry Andric 
339*bdd1243dSDimitry Andric #    ifdef isnormal
340*bdd1243dSDimitry Andric #      undef isnormal
341*bdd1243dSDimitry Andric #    endif
342*bdd1243dSDimitry Andric 
343*bdd1243dSDimitry Andric #    ifdef isgreater
344*bdd1243dSDimitry Andric #      undef isgreater
345*bdd1243dSDimitry Andric #    endif
346*bdd1243dSDimitry Andric 
347*bdd1243dSDimitry Andric #    ifdef isgreaterequal
348*bdd1243dSDimitry Andric #      undef isgreaterequal
349*bdd1243dSDimitry Andric #    endif
350*bdd1243dSDimitry Andric 
351*bdd1243dSDimitry Andric #    ifdef isless
352*bdd1243dSDimitry Andric #      undef isless
353*bdd1243dSDimitry Andric #    endif
354*bdd1243dSDimitry Andric 
355*bdd1243dSDimitry Andric #    ifdef islessequal
356*bdd1243dSDimitry Andric #      undef islessequal
357*bdd1243dSDimitry Andric #    endif
358*bdd1243dSDimitry Andric 
359*bdd1243dSDimitry Andric #    ifdef islessgreater
360*bdd1243dSDimitry Andric #      undef islessgreater
361*bdd1243dSDimitry Andric #    endif
362*bdd1243dSDimitry Andric 
363*bdd1243dSDimitry Andric #    ifdef isunordered
364*bdd1243dSDimitry Andric #      undef isunordered
365*bdd1243dSDimitry Andric #    endif
3660b57cec5SDimitry Andric 
3670b57cec5SDimitry Andric // signbit
3680b57cec5SDimitry Andric 
369*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0>
370*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {
371*bdd1243dSDimitry Andric   return __builtin_signbit(__x);
3720b57cec5SDimitry Andric }
3730b57cec5SDimitry Andric 
374*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value && std::is_signed<_A1>::value, int> = 0>
375*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {
376*bdd1243dSDimitry Andric   return __x < 0;
3770b57cec5SDimitry Andric }
3780b57cec5SDimitry Andric 
379*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value && !std::is_signed<_A1>::value, int> = 0>
380*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1) _NOEXCEPT {
381*bdd1243dSDimitry Andric   return false;
3820b57cec5SDimitry Andric }
3830b57cec5SDimitry Andric 
3840b57cec5SDimitry Andric // fpclassify
3850b57cec5SDimitry Andric 
386*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0>
387*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT {
388*bdd1243dSDimitry Andric   return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
3890b57cec5SDimitry Andric }
3900b57cec5SDimitry Andric 
391*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0>
392*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT {
393*bdd1243dSDimitry Andric   return __x == 0 ? FP_ZERO : FP_NORMAL;
3940b57cec5SDimitry Andric }
3950b57cec5SDimitry Andric 
396*bdd1243dSDimitry Andric // The MSVC runtime already provides these functions as templates
397*bdd1243dSDimitry Andric #ifndef _LIBCPP_MSVCRT
3980b57cec5SDimitry Andric 
3990b57cec5SDimitry Andric // isfinite
4000b57cec5SDimitry Andric 
401*bdd1243dSDimitry Andric template <class _A1,
402*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, int> = 0>
403*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1 __x) _NOEXCEPT {
404*bdd1243dSDimitry Andric   return __builtin_isfinite((typename std::__promote<_A1>::type)__x);
4050b57cec5SDimitry Andric }
4060b57cec5SDimitry Andric 
407*bdd1243dSDimitry Andric template <class _A1,
408*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, int> = 0>
409*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1) _NOEXCEPT {
410*bdd1243dSDimitry Andric   return true;
4110b57cec5SDimitry Andric }
4120b57cec5SDimitry Andric 
4130b57cec5SDimitry Andric // isinf
4140b57cec5SDimitry Andric 
415*bdd1243dSDimitry Andric template <class _A1,
416*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::numeric_limits<_A1>::has_infinity, int> = 0>
417*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1 __x) _NOEXCEPT {
418*bdd1243dSDimitry Andric   return __builtin_isinf((typename std::__promote<_A1>::type)__x);
4190b57cec5SDimitry Andric }
4200b57cec5SDimitry Andric 
4210b57cec5SDimitry Andric template <class _A1>
422*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI
423*bdd1243dSDimitry Andric     typename std::enable_if< std::is_arithmetic<_A1>::value && !std::numeric_limits<_A1>::has_infinity, bool>::type
424*bdd1243dSDimitry Andric     isinf(_A1) _NOEXCEPT {
425*bdd1243dSDimitry Andric   return false;
426*bdd1243dSDimitry Andric }
4270b57cec5SDimitry Andric 
4280b57cec5SDimitry Andric #      ifdef _LIBCPP_PREFERRED_OVERLOAD
429*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT {
430*bdd1243dSDimitry Andric   return __builtin_isinf(__x);
431*bdd1243dSDimitry Andric }
4320b57cec5SDimitry Andric 
433*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isinf(double __x) _NOEXCEPT {
434*bdd1243dSDimitry Andric   return __builtin_isinf(__x);
435*bdd1243dSDimitry Andric }
4360b57cec5SDimitry Andric 
437*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(long double __x) _NOEXCEPT {
438*bdd1243dSDimitry Andric   return __builtin_isinf(__x);
439*bdd1243dSDimitry Andric }
4400b57cec5SDimitry Andric #      endif
4410b57cec5SDimitry Andric 
4420b57cec5SDimitry Andric // isnan
4430b57cec5SDimitry Andric 
444*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0>
445*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1 __x) _NOEXCEPT {
446*bdd1243dSDimitry Andric   return __builtin_isnan(__x);
4470b57cec5SDimitry Andric }
4480b57cec5SDimitry Andric 
449*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0>
450*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) _NOEXCEPT {
451*bdd1243dSDimitry Andric   return false;
4520b57cec5SDimitry Andric }
4530b57cec5SDimitry Andric 
4540b57cec5SDimitry Andric #      ifdef _LIBCPP_PREFERRED_OVERLOAD
455*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT {
456*bdd1243dSDimitry Andric   return __builtin_isnan(__x);
457*bdd1243dSDimitry Andric }
4580b57cec5SDimitry Andric 
459*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isnan(double __x) _NOEXCEPT {
460*bdd1243dSDimitry Andric   return __builtin_isnan(__x);
461*bdd1243dSDimitry Andric }
4620b57cec5SDimitry Andric 
463*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEXCEPT {
464*bdd1243dSDimitry Andric   return __builtin_isnan(__x);
465*bdd1243dSDimitry Andric }
4660b57cec5SDimitry Andric #      endif
4670b57cec5SDimitry Andric 
4680b57cec5SDimitry Andric // isnormal
4690b57cec5SDimitry Andric 
470*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_floating_point<_A1>::value, int> = 0>
471*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {
472*bdd1243dSDimitry Andric   return __builtin_isnormal(__x);
4730b57cec5SDimitry Andric }
4740b57cec5SDimitry Andric 
475*bdd1243dSDimitry Andric template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0>
476*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {
477*bdd1243dSDimitry Andric   return __x != 0;
4780b57cec5SDimitry Andric }
4790b57cec5SDimitry Andric 
4800b57cec5SDimitry Andric // isgreater
4810b57cec5SDimitry Andric 
482*bdd1243dSDimitry Andric template <class _A1,
483*bdd1243dSDimitry Andric           class _A2,
484*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
485*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) _NOEXCEPT {
4860b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
487*bdd1243dSDimitry Andric   return __builtin_isgreater((type)__x, (type)__y);
4880b57cec5SDimitry Andric }
4890b57cec5SDimitry Andric 
4900b57cec5SDimitry Andric // isgreaterequal
4910b57cec5SDimitry Andric 
492*bdd1243dSDimitry Andric template <class _A1,
493*bdd1243dSDimitry Andric           class _A2,
494*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
495*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT {
4960b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
497*bdd1243dSDimitry Andric   return __builtin_isgreaterequal((type)__x, (type)__y);
4980b57cec5SDimitry Andric }
4990b57cec5SDimitry Andric 
5000b57cec5SDimitry Andric // isless
5010b57cec5SDimitry Andric 
502*bdd1243dSDimitry Andric template <class _A1,
503*bdd1243dSDimitry Andric           class _A2,
504*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
505*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) _NOEXCEPT {
5060b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
507*bdd1243dSDimitry Andric   return __builtin_isless((type)__x, (type)__y);
5080b57cec5SDimitry Andric }
5090b57cec5SDimitry Andric 
5100b57cec5SDimitry Andric // islessequal
5110b57cec5SDimitry Andric 
512*bdd1243dSDimitry Andric template <class _A1,
513*bdd1243dSDimitry Andric           class _A2,
514*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
515*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) _NOEXCEPT {
5160b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
517*bdd1243dSDimitry Andric   return __builtin_islessequal((type)__x, (type)__y);
5180b57cec5SDimitry Andric }
5190b57cec5SDimitry Andric 
5200b57cec5SDimitry Andric // islessgreater
5210b57cec5SDimitry Andric 
522*bdd1243dSDimitry Andric template <class _A1,
523*bdd1243dSDimitry Andric           class _A2,
524*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
525*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) _NOEXCEPT {
5260b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
527*bdd1243dSDimitry Andric   return __builtin_islessgreater((type)__x, (type)__y);
5280b57cec5SDimitry Andric }
5290b57cec5SDimitry Andric 
5300b57cec5SDimitry Andric // isunordered
5310b57cec5SDimitry Andric 
532*bdd1243dSDimitry Andric template <class _A1,
533*bdd1243dSDimitry Andric           class _A2,
534*bdd1243dSDimitry Andric           std::__enable_if_t<std::is_arithmetic<_A1>::value && std::is_arithmetic<_A2>::value, int> = 0>
535*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) _NOEXCEPT {
5360b57cec5SDimitry Andric   typedef typename std::__promote<_A1, _A2>::type type;
537*bdd1243dSDimitry Andric   return __builtin_isunordered((type)__x, (type)__y);
5380b57cec5SDimitry Andric }
5390b57cec5SDimitry Andric 
540*bdd1243dSDimitry Andric #endif // _LIBCPP_MSVCRT
5410b57cec5SDimitry Andric 
5420b57cec5SDimitry Andric // abs
5435ffd83dbSDimitry Andric //
5445ffd83dbSDimitry Andric // handled in stdlib.h
5450b57cec5SDimitry Andric 
5460b57cec5SDimitry Andric // div
5475ffd83dbSDimitry Andric //
5485ffd83dbSDimitry Andric // handled in stdlib.h
5490b57cec5SDimitry Andric 
550*bdd1243dSDimitry Andric // We have to provide double overloads for <math.h> to work on platforms that don't provide the full set of math
551*bdd1243dSDimitry Andric // functions. To make the overload set work with multiple functions that take the same arguments, we make our overloads
552*bdd1243dSDimitry Andric // templates. Functions are preferred over function templates during overload resolution, which means that our overload
553*bdd1243dSDimitry Andric // will only be selected when the C library doesn't provide one.
554*bdd1243dSDimitry Andric 
5550b57cec5SDimitry Andric // acos
5560b57cec5SDimitry Andric 
55781ad6265SDimitry Andric #    if !defined(__sun__)
558*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       acos(float __x) _NOEXCEPT       {return __builtin_acosf(__x);}
559*bdd1243dSDimitry Andric 
560*bdd1243dSDimitry Andric template <class = int>
561*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double acos(double __x) _NOEXCEPT {
562*bdd1243dSDimitry Andric   return __builtin_acos(__x);
563*bdd1243dSDimitry Andric }
564*bdd1243dSDimitry Andric 
565*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double acos(long double __x) _NOEXCEPT {return __builtin_acosl(__x);}
5660b57cec5SDimitry Andric #    endif
5670b57cec5SDimitry Andric 
5680b57cec5SDimitry Andric template <class _A1>
569*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
5700b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
571*bdd1243dSDimitry Andric acos(_A1 __x) _NOEXCEPT {return __builtin_acos((double)__x);}
5720b57cec5SDimitry Andric 
5730b57cec5SDimitry Andric // asin
5740b57cec5SDimitry Andric 
57581ad6265SDimitry Andric #    if !defined(__sun__)
576*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       asin(float __x) _NOEXCEPT       {return __builtin_asinf(__x);}
577*bdd1243dSDimitry Andric 
578*bdd1243dSDimitry Andric template <class = int>
579*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double asin(double __x) _NOEXCEPT {
580*bdd1243dSDimitry Andric   return __builtin_asin(__x);
581*bdd1243dSDimitry Andric }
582*bdd1243dSDimitry Andric 
583*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double asin(long double __x) _NOEXCEPT {return __builtin_asinl(__x);}
5840b57cec5SDimitry Andric #    endif
5850b57cec5SDimitry Andric 
5860b57cec5SDimitry Andric template <class _A1>
587*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
5880b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
589*bdd1243dSDimitry Andric asin(_A1 __x) _NOEXCEPT {return __builtin_asin((double)__x);}
5900b57cec5SDimitry Andric 
5910b57cec5SDimitry Andric // atan
5920b57cec5SDimitry Andric 
59381ad6265SDimitry Andric #    if !defined(__sun__)
594*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       atan(float __x) _NOEXCEPT       {return __builtin_atanf(__x);}
595*bdd1243dSDimitry Andric 
596*bdd1243dSDimitry Andric template <class = int>
597*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan(double __x) _NOEXCEPT {
598*bdd1243dSDimitry Andric   return __builtin_atan(__x);
599*bdd1243dSDimitry Andric }
600*bdd1243dSDimitry Andric 
601*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan(long double __x) _NOEXCEPT {return __builtin_atanl(__x);}
6020b57cec5SDimitry Andric #    endif
6030b57cec5SDimitry Andric 
6040b57cec5SDimitry Andric template <class _A1>
605*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
6060b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
607*bdd1243dSDimitry Andric atan(_A1 __x) _NOEXCEPT {return __builtin_atan((double)__x);}
6080b57cec5SDimitry Andric 
6090b57cec5SDimitry Andric // atan2
6100b57cec5SDimitry Andric 
61181ad6265SDimitry Andric #    if !defined(__sun__)
612*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       atan2(float __y, float __x) _NOEXCEPT             {return __builtin_atan2f(__y, __x);}
613*bdd1243dSDimitry Andric 
614*bdd1243dSDimitry Andric template <class = int>
615*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan2(double __x, double __y) _NOEXCEPT {
616*bdd1243dSDimitry Andric   return __builtin_atan2(__x, __y);
617*bdd1243dSDimitry Andric }
618*bdd1243dSDimitry Andric 
619*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan2(long double __y, long double __x) _NOEXCEPT {return __builtin_atan2l(__y, __x);}
6200b57cec5SDimitry Andric #    endif
6210b57cec5SDimitry Andric 
6220b57cec5SDimitry Andric template <class _A1, class _A2>
623*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
624349cc55cSDimitry Andric typename std::__enable_if_t
6250b57cec5SDimitry Andric <
6260b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
6270b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
6280b57cec5SDimitry Andric     std::__promote<_A1, _A2>
6290b57cec5SDimitry Andric >::type
630*bdd1243dSDimitry Andric atan2(_A1 __y, _A2 __x) _NOEXCEPT
6310b57cec5SDimitry Andric {
6320b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
6330b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
6340b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
635*bdd1243dSDimitry Andric     return ::atan2((__result_type)__y, (__result_type)__x);
6360b57cec5SDimitry Andric }
6370b57cec5SDimitry Andric 
6380b57cec5SDimitry Andric // ceil
6390b57cec5SDimitry Andric 
64081ad6265SDimitry Andric #    if !defined(__sun__)
641*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       ceil(float __x) _NOEXCEPT       {return __builtin_ceilf(__x);}
642*bdd1243dSDimitry Andric 
643*bdd1243dSDimitry Andric template <class = int>
644*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double ceil(double __x) _NOEXCEPT {
645*bdd1243dSDimitry Andric   return __builtin_ceil(__x);
646*bdd1243dSDimitry Andric }
647*bdd1243dSDimitry Andric 
648*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double ceil(long double __x) _NOEXCEPT {return __builtin_ceill(__x);}
6490b57cec5SDimitry Andric #    endif
6500b57cec5SDimitry Andric 
6510b57cec5SDimitry Andric template <class _A1>
652*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
6530b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
654*bdd1243dSDimitry Andric ceil(_A1 __x) _NOEXCEPT {return __builtin_ceil((double)__x);}
6550b57cec5SDimitry Andric 
6560b57cec5SDimitry Andric // cos
6570b57cec5SDimitry Andric 
65881ad6265SDimitry Andric #    if !defined(__sun__)
659*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       cos(float __x) _NOEXCEPT       {return __builtin_cosf(__x);}
660*bdd1243dSDimitry Andric 
661*bdd1243dSDimitry Andric template <class = int>
662*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double cos(double __x) _NOEXCEPT {
663*bdd1243dSDimitry Andric   return __builtin_cos(__x);
664*bdd1243dSDimitry Andric }
665*bdd1243dSDimitry Andric 
666*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double cos(long double __x) _NOEXCEPT {return __builtin_cosl(__x);}
6670b57cec5SDimitry Andric #    endif
6680b57cec5SDimitry Andric 
6690b57cec5SDimitry Andric template <class _A1>
670*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
6710b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
672*bdd1243dSDimitry Andric cos(_A1 __x) _NOEXCEPT {return __builtin_cos((double)__x);}
6730b57cec5SDimitry Andric 
6740b57cec5SDimitry Andric // cosh
6750b57cec5SDimitry Andric 
67681ad6265SDimitry Andric #    if !defined(__sun__)
677*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       cosh(float __x) _NOEXCEPT       {return __builtin_coshf(__x);}
678*bdd1243dSDimitry Andric 
679*bdd1243dSDimitry Andric template <class = int>
680*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double cosh(double __x) _NOEXCEPT {
681*bdd1243dSDimitry Andric   return __builtin_cosh(__x);
682*bdd1243dSDimitry Andric }
683*bdd1243dSDimitry Andric 
684*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double cosh(long double __x) _NOEXCEPT {return __builtin_coshl(__x);}
6850b57cec5SDimitry Andric #    endif
6860b57cec5SDimitry Andric 
6870b57cec5SDimitry Andric template <class _A1>
688*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
6890b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
690*bdd1243dSDimitry Andric cosh(_A1 __x) _NOEXCEPT {return __builtin_cosh((double)__x);}
6910b57cec5SDimitry Andric 
6920b57cec5SDimitry Andric // exp
6930b57cec5SDimitry Andric 
69481ad6265SDimitry Andric #    if !defined(__sun__)
695*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       exp(float __x) _NOEXCEPT       {return __builtin_expf(__x);}
696*bdd1243dSDimitry Andric 
697*bdd1243dSDimitry Andric template <class = int>
698*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double exp(double __x) _NOEXCEPT {
699*bdd1243dSDimitry Andric   return __builtin_exp(__x);
700*bdd1243dSDimitry Andric }
701*bdd1243dSDimitry Andric 
702*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double exp(long double __x) _NOEXCEPT {return __builtin_expl(__x);}
7030b57cec5SDimitry Andric #    endif
7040b57cec5SDimitry Andric 
7050b57cec5SDimitry Andric template <class _A1>
706*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
7070b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
708*bdd1243dSDimitry Andric exp(_A1 __x) _NOEXCEPT {return __builtin_exp((double)__x);}
7090b57cec5SDimitry Andric 
7100b57cec5SDimitry Andric // fabs
7110b57cec5SDimitry Andric 
71281ad6265SDimitry Andric #    if !defined(__sun__)
713*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       fabs(float __x) _NOEXCEPT       {return __builtin_fabsf(__x);}
714*bdd1243dSDimitry Andric 
715*bdd1243dSDimitry Andric template <class = int>
716*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fabs(double __x) _NOEXCEPT {
717*bdd1243dSDimitry Andric   return __builtin_fabs(__x);
718*bdd1243dSDimitry Andric }
719*bdd1243dSDimitry Andric 
720*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fabs(long double __x) _NOEXCEPT {return __builtin_fabsl(__x);}
7210b57cec5SDimitry Andric #    endif
7220b57cec5SDimitry Andric 
7230b57cec5SDimitry Andric template <class _A1>
724*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
7250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
726*bdd1243dSDimitry Andric fabs(_A1 __x) _NOEXCEPT {return __builtin_fabs((double)__x);}
7270b57cec5SDimitry Andric 
7280b57cec5SDimitry Andric // floor
7290b57cec5SDimitry Andric 
73081ad6265SDimitry Andric #    if !defined(__sun__)
731*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       floor(float __x) _NOEXCEPT       {return __builtin_floorf(__x);}
732*bdd1243dSDimitry Andric 
733*bdd1243dSDimitry Andric template <class = int>
734*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double floor(double __x) _NOEXCEPT {
735*bdd1243dSDimitry Andric   return __builtin_floor(__x);
736*bdd1243dSDimitry Andric }
737*bdd1243dSDimitry Andric 
738*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double floor(long double __x) _NOEXCEPT {return __builtin_floorl(__x);}
7390b57cec5SDimitry Andric #    endif
7400b57cec5SDimitry Andric 
7410b57cec5SDimitry Andric template <class _A1>
742*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
7430b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
744*bdd1243dSDimitry Andric floor(_A1 __x) _NOEXCEPT {return __builtin_floor((double)__x);}
7450b57cec5SDimitry Andric 
7460b57cec5SDimitry Andric // fmod
7470b57cec5SDimitry Andric 
74881ad6265SDimitry Andric #    if !defined(__sun__)
749*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       fmod(float __x, float __y) _NOEXCEPT             {return __builtin_fmodf(__x, __y);}
750*bdd1243dSDimitry Andric 
751*bdd1243dSDimitry Andric template <class = int>
752*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fmod(double __x, double __y) _NOEXCEPT {
753*bdd1243dSDimitry Andric   return __builtin_fmod(__x, __y);
754*bdd1243dSDimitry Andric }
755*bdd1243dSDimitry Andric 
756*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fmod(long double __x, long double __y) _NOEXCEPT {return __builtin_fmodl(__x, __y);}
7570b57cec5SDimitry Andric #    endif
7580b57cec5SDimitry Andric 
7590b57cec5SDimitry Andric template <class _A1, class _A2>
760*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
761349cc55cSDimitry Andric typename std::__enable_if_t
7620b57cec5SDimitry Andric <
7630b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
7640b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
7650b57cec5SDimitry Andric     std::__promote<_A1, _A2>
7660b57cec5SDimitry Andric >::type
767*bdd1243dSDimitry Andric fmod(_A1 __x, _A2 __y) _NOEXCEPT
7680b57cec5SDimitry Andric {
7690b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
7700b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
7710b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
772*bdd1243dSDimitry Andric     return ::fmod((__result_type)__x, (__result_type)__y);
7730b57cec5SDimitry Andric }
7740b57cec5SDimitry Andric 
7750b57cec5SDimitry Andric // frexp
7760b57cec5SDimitry Andric 
77781ad6265SDimitry Andric #    if !defined(__sun__)
778*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       frexp(float __x, int* __e) _NOEXCEPT       {return __builtin_frexpf(__x, __e);}
779*bdd1243dSDimitry Andric 
780*bdd1243dSDimitry Andric template <class = int>
781*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double frexp(double __x, int* __e) _NOEXCEPT {
782*bdd1243dSDimitry Andric   return __builtin_frexp(__x, __e);
783*bdd1243dSDimitry Andric }
784*bdd1243dSDimitry Andric 
785*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double frexp(long double __x, int* __e) _NOEXCEPT {return __builtin_frexpl(__x, __e);}
7860b57cec5SDimitry Andric #    endif
7870b57cec5SDimitry Andric 
7880b57cec5SDimitry Andric template <class _A1>
789*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
7900b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
791*bdd1243dSDimitry Andric frexp(_A1 __x, int* __e) _NOEXCEPT {return __builtin_frexp((double)__x, __e);}
7920b57cec5SDimitry Andric 
7930b57cec5SDimitry Andric // ldexp
7940b57cec5SDimitry Andric 
79581ad6265SDimitry Andric #    if !defined(__sun__)
796*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       ldexp(float __x, int __e) _NOEXCEPT       {return __builtin_ldexpf(__x, __e);}
797*bdd1243dSDimitry Andric 
798*bdd1243dSDimitry Andric template <class = int>
799*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double ldexp(double __x, int __e) _NOEXCEPT {
800*bdd1243dSDimitry Andric   return __builtin_ldexp(__x, __e);
801*bdd1243dSDimitry Andric }
802*bdd1243dSDimitry Andric 
803*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double ldexp(long double __x, int __e) _NOEXCEPT {return __builtin_ldexpl(__x, __e);}
8040b57cec5SDimitry Andric #    endif
8050b57cec5SDimitry Andric 
8060b57cec5SDimitry Andric template <class _A1>
807*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
8080b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
809*bdd1243dSDimitry Andric ldexp(_A1 __x, int __e) _NOEXCEPT {return __builtin_ldexp((double)__x, __e);}
8100b57cec5SDimitry Andric 
8110b57cec5SDimitry Andric // log
8120b57cec5SDimitry Andric 
81381ad6265SDimitry Andric #    if !defined(__sun__)
814*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       log(float __x) _NOEXCEPT       {return __builtin_logf(__x);}
815*bdd1243dSDimitry Andric 
816*bdd1243dSDimitry Andric template <class = int>
817*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log(double __x) _NOEXCEPT {
818*bdd1243dSDimitry Andric   return __builtin_log(__x);
819*bdd1243dSDimitry Andric }
820*bdd1243dSDimitry Andric 
821*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log(long double __x) _NOEXCEPT {return __builtin_logl(__x);}
8220b57cec5SDimitry Andric #    endif
8230b57cec5SDimitry Andric 
8240b57cec5SDimitry Andric template <class _A1>
825*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
8260b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
827*bdd1243dSDimitry Andric log(_A1 __x) _NOEXCEPT {return __builtin_log((double)__x);}
8280b57cec5SDimitry Andric 
8290b57cec5SDimitry Andric // log10
8300b57cec5SDimitry Andric 
83181ad6265SDimitry Andric #    if !defined(__sun__)
832*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       log10(float __x) _NOEXCEPT       {return __builtin_log10f(__x);}
833*bdd1243dSDimitry Andric 
834*bdd1243dSDimitry Andric 
835*bdd1243dSDimitry Andric template <class = int>
836*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log10(double __x) _NOEXCEPT {
837*bdd1243dSDimitry Andric   return __builtin_log10(__x);
838*bdd1243dSDimitry Andric }
839*bdd1243dSDimitry Andric 
840*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log10(long double __x) _NOEXCEPT {return __builtin_log10l(__x);}
8410b57cec5SDimitry Andric #    endif
8420b57cec5SDimitry Andric 
8430b57cec5SDimitry Andric template <class _A1>
844*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
8450b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
846*bdd1243dSDimitry Andric log10(_A1 __x) _NOEXCEPT {return __builtin_log10((double)__x);}
8470b57cec5SDimitry Andric 
8480b57cec5SDimitry Andric // modf
8490b57cec5SDimitry Andric 
85081ad6265SDimitry Andric #    if !defined(__sun__)
851*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       modf(float __x, float* __y) _NOEXCEPT             {return __builtin_modff(__x, __y);}
852*bdd1243dSDimitry Andric 
853*bdd1243dSDimitry Andric template <class = int>
854*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double modf(double __x, double* __y) _NOEXCEPT {
855*bdd1243dSDimitry Andric   return __builtin_modf(__x, __y);
856*bdd1243dSDimitry Andric }
857*bdd1243dSDimitry Andric 
858*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double modf(long double __x, long double* __y) _NOEXCEPT {return __builtin_modfl(__x, __y);}
8590b57cec5SDimitry Andric #    endif
8600b57cec5SDimitry Andric 
8610b57cec5SDimitry Andric // pow
8620b57cec5SDimitry Andric 
86381ad6265SDimitry Andric #    if !defined(__sun__)
864*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       pow(float __x, float __y) _NOEXCEPT             {return __builtin_powf(__x, __y);}
865*bdd1243dSDimitry Andric 
866*bdd1243dSDimitry Andric template <class = int>
867*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double pow(double __x, double __y) _NOEXCEPT {
868*bdd1243dSDimitry Andric   return __builtin_pow(__x, __y);
869*bdd1243dSDimitry Andric }
870*bdd1243dSDimitry Andric 
871*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double pow(long double __x, long double __y) _NOEXCEPT {return __builtin_powl(__x, __y);}
8720b57cec5SDimitry Andric #    endif
8730b57cec5SDimitry Andric 
8740b57cec5SDimitry Andric template <class _A1, class _A2>
875*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
876349cc55cSDimitry Andric typename std::__enable_if_t
8770b57cec5SDimitry Andric <
8780b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
8790b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
8800b57cec5SDimitry Andric     std::__promote<_A1, _A2>
8810b57cec5SDimitry Andric >::type
882*bdd1243dSDimitry Andric pow(_A1 __x, _A2 __y) _NOEXCEPT
8830b57cec5SDimitry Andric {
8840b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
8850b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
8860b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
887*bdd1243dSDimitry Andric     return ::pow((__result_type)__x, (__result_type)__y);
8880b57cec5SDimitry Andric }
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric // sin
8910b57cec5SDimitry Andric 
89281ad6265SDimitry Andric #    if !defined(__sun__)
893*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       sin(float __x) _NOEXCEPT       {return __builtin_sinf(__x);}
894*bdd1243dSDimitry Andric 
895*bdd1243dSDimitry Andric template <class = int>
896*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sin(double __x) _NOEXCEPT {
897*bdd1243dSDimitry Andric   return __builtin_sin(__x);
898*bdd1243dSDimitry Andric }
899*bdd1243dSDimitry Andric 
900*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sin(long double __x) _NOEXCEPT {return __builtin_sinl(__x);}
9010b57cec5SDimitry Andric #endif
9020b57cec5SDimitry Andric 
9030b57cec5SDimitry Andric template <class _A1>
904*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9050b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
906*bdd1243dSDimitry Andric sin(_A1 __x) _NOEXCEPT {return __builtin_sin((double)__x);}
9070b57cec5SDimitry Andric 
9080b57cec5SDimitry Andric // sinh
9090b57cec5SDimitry Andric 
91081ad6265SDimitry Andric #    if !defined(__sun__)
911*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       sinh(float __x) _NOEXCEPT       {return __builtin_sinhf(__x);}
912*bdd1243dSDimitry Andric 
913*bdd1243dSDimitry Andric template <class = int>
914*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sinh(double __x) _NOEXCEPT {
915*bdd1243dSDimitry Andric   return __builtin_sinh(__x);
916*bdd1243dSDimitry Andric }
917*bdd1243dSDimitry Andric 
918*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sinh(long double __x) _NOEXCEPT {return __builtin_sinhl(__x);}
9190b57cec5SDimitry Andric #    endif
9200b57cec5SDimitry Andric 
9210b57cec5SDimitry Andric template <class _A1>
922*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9230b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
924*bdd1243dSDimitry Andric sinh(_A1 __x) _NOEXCEPT {return __builtin_sinh((double)__x);}
9250b57cec5SDimitry Andric 
9260b57cec5SDimitry Andric // sqrt
9270b57cec5SDimitry Andric 
92881ad6265SDimitry Andric #    if !defined(__sun__)
929*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       sqrt(float __x) _NOEXCEPT       {return __builtin_sqrtf(__x);}
930*bdd1243dSDimitry Andric 
931*bdd1243dSDimitry Andric template <class = int>
932*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double sqrt(double __x) _NOEXCEPT {
933*bdd1243dSDimitry Andric   return __builtin_sqrt(__x);
934*bdd1243dSDimitry Andric }
935*bdd1243dSDimitry Andric 
936*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double sqrt(long double __x) _NOEXCEPT {return __builtin_sqrtl(__x);}
9370b57cec5SDimitry Andric #    endif
9380b57cec5SDimitry Andric 
9390b57cec5SDimitry Andric template <class _A1>
940*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9410b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
942*bdd1243dSDimitry Andric sqrt(_A1 __x) _NOEXCEPT {return __builtin_sqrt((double)__x);}
9430b57cec5SDimitry Andric 
9440b57cec5SDimitry Andric // tan
9450b57cec5SDimitry Andric 
94681ad6265SDimitry Andric #    if !defined(__sun__)
947*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       tan(float __x) _NOEXCEPT       {return __builtin_tanf(__x);}
948*bdd1243dSDimitry Andric 
949*bdd1243dSDimitry Andric template <class = int>
950*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tan(double __x) _NOEXCEPT {
951*bdd1243dSDimitry Andric   return __builtin_tan(__x);
952*bdd1243dSDimitry Andric }
953*bdd1243dSDimitry Andric 
954*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tan(long double __x) _NOEXCEPT {return __builtin_tanl(__x);}
9550b57cec5SDimitry Andric #    endif
9560b57cec5SDimitry Andric 
9570b57cec5SDimitry Andric template <class _A1>
958*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9590b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
960*bdd1243dSDimitry Andric tan(_A1 __x) _NOEXCEPT {return __builtin_tan((double)__x);}
9610b57cec5SDimitry Andric 
9620b57cec5SDimitry Andric // tanh
9630b57cec5SDimitry Andric 
96481ad6265SDimitry Andric #    if !defined(__sun__)
965*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       tanh(float __x) _NOEXCEPT       {return __builtin_tanhf(__x);}
966*bdd1243dSDimitry Andric 
967*bdd1243dSDimitry Andric template <class = int>
968*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tanh(double __x) _NOEXCEPT {
969*bdd1243dSDimitry Andric   return __builtin_tanh(__x);
970*bdd1243dSDimitry Andric }
971*bdd1243dSDimitry Andric 
972*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tanh(long double __x) _NOEXCEPT {return __builtin_tanhl(__x);}
9730b57cec5SDimitry Andric #    endif
9740b57cec5SDimitry Andric 
9750b57cec5SDimitry Andric template <class _A1>
976*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9770b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
978*bdd1243dSDimitry Andric tanh(_A1 __x) _NOEXCEPT {return __builtin_tanh((double)__x);}
9790b57cec5SDimitry Andric 
9800b57cec5SDimitry Andric // acosh
9810b57cec5SDimitry Andric 
982*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       acosh(float __x) _NOEXCEPT       {return __builtin_acoshf(__x);}
983*bdd1243dSDimitry Andric 
984*bdd1243dSDimitry Andric template <class = int>
985*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double acosh(double __x) _NOEXCEPT {
986*bdd1243dSDimitry Andric   return __builtin_acosh(__x);
987*bdd1243dSDimitry Andric }
988*bdd1243dSDimitry Andric 
989*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double acosh(long double __x) _NOEXCEPT {return __builtin_acoshl(__x);}
9900b57cec5SDimitry Andric 
9910b57cec5SDimitry Andric template <class _A1>
992*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
9930b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
994*bdd1243dSDimitry Andric acosh(_A1 __x) _NOEXCEPT {return __builtin_acosh((double)__x);}
9950b57cec5SDimitry Andric 
9960b57cec5SDimitry Andric // asinh
9970b57cec5SDimitry Andric 
998*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       asinh(float __x) _NOEXCEPT       {return __builtin_asinhf(__x);}
999*bdd1243dSDimitry Andric 
1000*bdd1243dSDimitry Andric template <class = int>
1001*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double asinh(double __x) _NOEXCEPT {
1002*bdd1243dSDimitry Andric   return __builtin_asinh(__x);
1003*bdd1243dSDimitry Andric }
1004*bdd1243dSDimitry Andric 
1005*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double asinh(long double __x) _NOEXCEPT {return __builtin_asinhl(__x);}
10060b57cec5SDimitry Andric 
10070b57cec5SDimitry Andric template <class _A1>
1008*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
10090b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1010*bdd1243dSDimitry Andric asinh(_A1 __x) _NOEXCEPT {return __builtin_asinh((double)__x);}
10110b57cec5SDimitry Andric 
10120b57cec5SDimitry Andric // atanh
10130b57cec5SDimitry Andric 
1014*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       atanh(float __x) _NOEXCEPT       {return __builtin_atanhf(__x);}
1015*bdd1243dSDimitry Andric 
1016*bdd1243dSDimitry Andric template <class = int>
1017*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atanh(double __x) _NOEXCEPT {
1018*bdd1243dSDimitry Andric   return __builtin_atanh(__x);
1019*bdd1243dSDimitry Andric }
1020*bdd1243dSDimitry Andric 
1021*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atanh(long double __x) _NOEXCEPT {return __builtin_atanhl(__x);}
10220b57cec5SDimitry Andric 
10230b57cec5SDimitry Andric template <class _A1>
1024*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
10250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1026*bdd1243dSDimitry Andric atanh(_A1 __x) _NOEXCEPT {return __builtin_atanh((double)__x);}
10270b57cec5SDimitry Andric 
10280b57cec5SDimitry Andric // cbrt
10290b57cec5SDimitry Andric 
1030*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       cbrt(float __x) _NOEXCEPT       {return __builtin_cbrtf(__x);}
1031*bdd1243dSDimitry Andric 
1032*bdd1243dSDimitry Andric template <class = int>
1033*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double cbrt(double __x) _NOEXCEPT {
1034*bdd1243dSDimitry Andric   return __builtin_cbrt(__x);
1035*bdd1243dSDimitry Andric }
1036*bdd1243dSDimitry Andric 
1037*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double cbrt(long double __x) _NOEXCEPT {return __builtin_cbrtl(__x);}
10380b57cec5SDimitry Andric 
10390b57cec5SDimitry Andric template <class _A1>
1040*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
10410b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1042*bdd1243dSDimitry Andric cbrt(_A1 __x) _NOEXCEPT {return __builtin_cbrt((double)__x);}
10430b57cec5SDimitry Andric 
10440b57cec5SDimitry Andric // copysign
10450b57cec5SDimitry Andric 
1046*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float copysign(float __x, float __y) _NOEXCEPT {
1047*bdd1243dSDimitry Andric   return ::__builtin_copysignf(__x, __y);
10480b57cec5SDimitry Andric }
1049fe6060f1SDimitry Andric 
1050*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double copysign(long double __x, long double __y) _NOEXCEPT {
1051*bdd1243dSDimitry Andric   return ::__builtin_copysignl(__x, __y);
1052fe6060f1SDimitry Andric }
1053fe6060f1SDimitry Andric 
1054fe6060f1SDimitry Andric template <class _A1, class _A2>
1055*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
1056349cc55cSDimitry Andric typename std::__enable_if_t
1057fe6060f1SDimitry Andric <
1058fe6060f1SDimitry Andric     std::is_arithmetic<_A1>::value &&
1059fe6060f1SDimitry Andric     std::is_arithmetic<_A2>::value,
1060fe6060f1SDimitry Andric     std::__promote<_A1, _A2>
1061fe6060f1SDimitry Andric >::type
1062*bdd1243dSDimitry Andric     copysign(_A1 __x, _A2 __y) _NOEXCEPT {
1063*bdd1243dSDimitry Andric   return ::__builtin_copysign(__x, __y);
10640b57cec5SDimitry Andric }
10650b57cec5SDimitry Andric 
10660b57cec5SDimitry Andric // erf
10670b57cec5SDimitry Andric 
1068*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       erf(float __x) _NOEXCEPT       {return __builtin_erff(__x);}
1069*bdd1243dSDimitry Andric 
1070*bdd1243dSDimitry Andric template <class = int>
1071*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double erf(double __x) _NOEXCEPT {
1072*bdd1243dSDimitry Andric   return __builtin_erf(__x);
1073*bdd1243dSDimitry Andric }
1074*bdd1243dSDimitry Andric 
1075*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double erf(long double __x) _NOEXCEPT {return __builtin_erfl(__x);}
10760b57cec5SDimitry Andric 
10770b57cec5SDimitry Andric template <class _A1>
1078*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
10790b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1080*bdd1243dSDimitry Andric erf(_A1 __x) _NOEXCEPT {return __builtin_erf((double)__x);}
10810b57cec5SDimitry Andric 
10820b57cec5SDimitry Andric // erfc
10830b57cec5SDimitry Andric 
1084*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       erfc(float __x) _NOEXCEPT       {return __builtin_erfcf(__x);}
1085*bdd1243dSDimitry Andric 
1086*bdd1243dSDimitry Andric template <class = int>
1087*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double erfc(double __x) _NOEXCEPT {
1088*bdd1243dSDimitry Andric   return __builtin_erfc(__x);
1089*bdd1243dSDimitry Andric }
1090*bdd1243dSDimitry Andric 
1091*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double erfc(long double __x) _NOEXCEPT {return __builtin_erfcl(__x);}
10920b57cec5SDimitry Andric 
10930b57cec5SDimitry Andric template <class _A1>
1094*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
10950b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1096*bdd1243dSDimitry Andric erfc(_A1 __x) _NOEXCEPT {return __builtin_erfc((double)__x);}
10970b57cec5SDimitry Andric 
10980b57cec5SDimitry Andric // exp2
10990b57cec5SDimitry Andric 
1100*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       exp2(float __x) _NOEXCEPT       {return __builtin_exp2f(__x);}
1101*bdd1243dSDimitry Andric 
1102*bdd1243dSDimitry Andric template <class = int>
1103*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double exp2(double __x) _NOEXCEPT {
1104*bdd1243dSDimitry Andric   return __builtin_exp2(__x);
1105*bdd1243dSDimitry Andric }
1106*bdd1243dSDimitry Andric 
1107*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double exp2(long double __x) _NOEXCEPT {return __builtin_exp2l(__x);}
11080b57cec5SDimitry Andric 
11090b57cec5SDimitry Andric template <class _A1>
1110*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
11110b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1112*bdd1243dSDimitry Andric exp2(_A1 __x) _NOEXCEPT {return __builtin_exp2((double)__x);}
11130b57cec5SDimitry Andric 
11140b57cec5SDimitry Andric // expm1
11150b57cec5SDimitry Andric 
1116*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       expm1(float __x) _NOEXCEPT       {return __builtin_expm1f(__x);}
1117*bdd1243dSDimitry Andric 
1118*bdd1243dSDimitry Andric template <class = int>
1119*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double expm1(double __x) _NOEXCEPT {
1120*bdd1243dSDimitry Andric   return __builtin_expm1(__x);
1121*bdd1243dSDimitry Andric }
1122*bdd1243dSDimitry Andric 
1123*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double expm1(long double __x) _NOEXCEPT {return __builtin_expm1l(__x);}
11240b57cec5SDimitry Andric 
11250b57cec5SDimitry Andric template <class _A1>
1126*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
11270b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1128*bdd1243dSDimitry Andric expm1(_A1 __x) _NOEXCEPT {return __builtin_expm1((double)__x);}
11290b57cec5SDimitry Andric 
11300b57cec5SDimitry Andric // fdim
11310b57cec5SDimitry Andric 
1132*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       fdim(float __x, float __y) _NOEXCEPT             {return __builtin_fdimf(__x, __y);}
1133*bdd1243dSDimitry Andric 
1134*bdd1243dSDimitry Andric template <class = int>
1135*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fdim(double __x, double __y) _NOEXCEPT {
1136*bdd1243dSDimitry Andric   return __builtin_fdim(__x, __y);
1137*bdd1243dSDimitry Andric }
1138*bdd1243dSDimitry Andric 
1139*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fdim(long double __x, long double __y) _NOEXCEPT {return __builtin_fdiml(__x, __y);}
11400b57cec5SDimitry Andric 
11410b57cec5SDimitry Andric template <class _A1, class _A2>
1142*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1143349cc55cSDimitry Andric typename std::__enable_if_t
11440b57cec5SDimitry Andric <
11450b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
11460b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
11470b57cec5SDimitry Andric     std::__promote<_A1, _A2>
11480b57cec5SDimitry Andric >::type
1149*bdd1243dSDimitry Andric fdim(_A1 __x, _A2 __y) _NOEXCEPT
11500b57cec5SDimitry Andric {
11510b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
11520b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
11530b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1154*bdd1243dSDimitry Andric     return ::fdim((__result_type)__x, (__result_type)__y);
11550b57cec5SDimitry Andric }
11560b57cec5SDimitry Andric 
11570b57cec5SDimitry Andric // fma
11580b57cec5SDimitry Andric 
1159*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       fma(float __x, float __y, float __z) _NOEXCEPT
1160fe6060f1SDimitry Andric {
1161*bdd1243dSDimitry Andric     return __builtin_fmaf(__x, __y, __z);
1162fe6060f1SDimitry Andric }
1163*bdd1243dSDimitry Andric 
1164*bdd1243dSDimitry Andric 
1165*bdd1243dSDimitry Andric template <class = int>
1166*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double fma(double __x, double __y, double __z) _NOEXCEPT {
1167*bdd1243dSDimitry Andric   return __builtin_fma(__x, __y, __z);
1168*bdd1243dSDimitry Andric }
1169*bdd1243dSDimitry Andric 
1170*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double fma(long double __x, long double __y, long double __z) _NOEXCEPT
1171fe6060f1SDimitry Andric {
1172*bdd1243dSDimitry Andric     return __builtin_fmal(__x, __y, __z);
1173fe6060f1SDimitry Andric }
11740b57cec5SDimitry Andric 
11750b57cec5SDimitry Andric template <class _A1, class _A2, class _A3>
1176*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1177349cc55cSDimitry Andric typename std::__enable_if_t
11780b57cec5SDimitry Andric <
11790b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
11800b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value &&
11810b57cec5SDimitry Andric     std::is_arithmetic<_A3>::value,
11820b57cec5SDimitry Andric     std::__promote<_A1, _A2, _A3>
11830b57cec5SDimitry Andric >::type
1184*bdd1243dSDimitry Andric fma(_A1 __x, _A2 __y, _A3 __z) _NOEXCEPT
11850b57cec5SDimitry Andric {
11860b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2, _A3>::type __result_type;
11870b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
11880b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value &&
11890b57cec5SDimitry Andric                      std::_IsSame<_A3, __result_type>::value)), "");
1190*bdd1243dSDimitry Andric     return __builtin_fma((__result_type)__x, (__result_type)__y, (__result_type)__z);
11910b57cec5SDimitry Andric }
11920b57cec5SDimitry Andric 
11930b57cec5SDimitry Andric // fmax
11940b57cec5SDimitry Andric 
1195*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       fmax(float __x, float __y) _NOEXCEPT             {return __builtin_fmaxf(__x, __y);}
1196*bdd1243dSDimitry Andric 
1197*bdd1243dSDimitry Andric template <class = int>
1198*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fmax(double __x, double __y) _NOEXCEPT {
1199*bdd1243dSDimitry Andric   return __builtin_fmax(__x, __y);
1200*bdd1243dSDimitry Andric }
1201*bdd1243dSDimitry Andric 
1202*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fmax(long double __x, long double __y) _NOEXCEPT {return __builtin_fmaxl(__x, __y);}
12030b57cec5SDimitry Andric 
12040b57cec5SDimitry Andric template <class _A1, class _A2>
1205*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
1206349cc55cSDimitry Andric typename std::__enable_if_t
12070b57cec5SDimitry Andric <
12080b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
12090b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
12100b57cec5SDimitry Andric     std::__promote<_A1, _A2>
12110b57cec5SDimitry Andric >::type
1212*bdd1243dSDimitry Andric fmax(_A1 __x, _A2 __y) _NOEXCEPT
12130b57cec5SDimitry Andric {
12140b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
12150b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
12160b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1217*bdd1243dSDimitry Andric     return ::fmax((__result_type)__x, (__result_type)__y);
12180b57cec5SDimitry Andric }
12190b57cec5SDimitry Andric 
12200b57cec5SDimitry Andric // fmin
12210b57cec5SDimitry Andric 
1222*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       fmin(float __x, float __y) _NOEXCEPT             {return __builtin_fminf(__x, __y);}
1223*bdd1243dSDimitry Andric 
1224*bdd1243dSDimitry Andric template <class = int>
1225*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double fmin(double __x, double __y) _NOEXCEPT {
1226*bdd1243dSDimitry Andric   return __builtin_fmin(__x, __y);
1227*bdd1243dSDimitry Andric }
1228*bdd1243dSDimitry Andric 
1229*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double fmin(long double __x, long double __y) _NOEXCEPT {return __builtin_fminl(__x, __y);}
12300b57cec5SDimitry Andric 
12310b57cec5SDimitry Andric template <class _A1, class _A2>
1232*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
1233349cc55cSDimitry Andric typename std::__enable_if_t
12340b57cec5SDimitry Andric <
12350b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
12360b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
12370b57cec5SDimitry Andric     std::__promote<_A1, _A2>
12380b57cec5SDimitry Andric >::type
1239*bdd1243dSDimitry Andric fmin(_A1 __x, _A2 __y) _NOEXCEPT
12400b57cec5SDimitry Andric {
12410b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
12420b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
12430b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1244*bdd1243dSDimitry Andric     return ::fmin((__result_type)__x, (__result_type)__y);
12450b57cec5SDimitry Andric }
12460b57cec5SDimitry Andric 
12470b57cec5SDimitry Andric // hypot
12480b57cec5SDimitry Andric 
1249*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       hypot(float __x, float __y) _NOEXCEPT             {return __builtin_hypotf(__x, __y);}
1250*bdd1243dSDimitry Andric 
1251*bdd1243dSDimitry Andric template <class = int>
1252*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double hypot(double __x, double __y) _NOEXCEPT {
1253*bdd1243dSDimitry Andric   return __builtin_hypot(__x, __y);
1254*bdd1243dSDimitry Andric }
1255*bdd1243dSDimitry Andric 
1256*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double hypot(long double __x, long double __y) _NOEXCEPT {return __builtin_hypotl(__x, __y);}
12570b57cec5SDimitry Andric 
12580b57cec5SDimitry Andric template <class _A1, class _A2>
1259*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1260349cc55cSDimitry Andric typename std::__enable_if_t
12610b57cec5SDimitry Andric <
12620b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
12630b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
12640b57cec5SDimitry Andric     std::__promote<_A1, _A2>
12650b57cec5SDimitry Andric >::type
1266*bdd1243dSDimitry Andric hypot(_A1 __x, _A2 __y) _NOEXCEPT
12670b57cec5SDimitry Andric {
12680b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
12690b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
12700b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1271*bdd1243dSDimitry Andric     return ::hypot((__result_type)__x, (__result_type)__y);
12720b57cec5SDimitry Andric }
12730b57cec5SDimitry Andric 
12740b57cec5SDimitry Andric // ilogb
12750b57cec5SDimitry Andric 
1276*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI int ilogb(float __x) _NOEXCEPT       {return __builtin_ilogbf(__x);}
1277*bdd1243dSDimitry Andric 
1278*bdd1243dSDimitry Andric template <class = int>
1279*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double ilogb(double __x) _NOEXCEPT {
1280*bdd1243dSDimitry Andric   return __builtin_ilogb(__x);
1281*bdd1243dSDimitry Andric }
1282*bdd1243dSDimitry Andric 
1283*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI int ilogb(long double __x) _NOEXCEPT {return __builtin_ilogbl(__x);}
12840b57cec5SDimitry Andric 
12850b57cec5SDimitry Andric template <class _A1>
1286*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
12870b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, int>::type
1288*bdd1243dSDimitry Andric ilogb(_A1 __x) _NOEXCEPT {return __builtin_ilogb((double)__x);}
12890b57cec5SDimitry Andric 
12900b57cec5SDimitry Andric // lgamma
12910b57cec5SDimitry Andric 
1292*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       lgamma(float __x) _NOEXCEPT       {return __builtin_lgammaf(__x);}
1293*bdd1243dSDimitry Andric 
1294*bdd1243dSDimitry Andric template <class = int>
1295*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double lgamma(double __x) _NOEXCEPT {
1296*bdd1243dSDimitry Andric   return __builtin_lgamma(__x);
1297*bdd1243dSDimitry Andric }
1298*bdd1243dSDimitry Andric 
1299*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double lgamma(long double __x) _NOEXCEPT {return __builtin_lgammal(__x);}
13000b57cec5SDimitry Andric 
13010b57cec5SDimitry Andric template <class _A1>
1302*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
13030b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1304*bdd1243dSDimitry Andric lgamma(_A1 __x) _NOEXCEPT {return __builtin_lgamma((double)__x);}
13050b57cec5SDimitry Andric 
13060b57cec5SDimitry Andric // llrint
13070b57cec5SDimitry Andric 
1308*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llrint(float __x) _NOEXCEPT
1309fe6060f1SDimitry Andric {
1310*bdd1243dSDimitry Andric     return __builtin_llrintf(__x);
1311fe6060f1SDimitry Andric }
1312*bdd1243dSDimitry Andric 
1313*bdd1243dSDimitry Andric template <class = int>
1314*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long long llrint(double __x) _NOEXCEPT {
1315*bdd1243dSDimitry Andric   return __builtin_llrint(__x);
1316*bdd1243dSDimitry Andric }
1317*bdd1243dSDimitry Andric 
1318*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llrint(long double __x) _NOEXCEPT
1319fe6060f1SDimitry Andric {
1320*bdd1243dSDimitry Andric     return __builtin_llrintl(__x);
1321fe6060f1SDimitry Andric }
13220b57cec5SDimitry Andric 
13230b57cec5SDimitry Andric template <class _A1>
1324*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
13250b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long long>::type
1326*bdd1243dSDimitry Andric llrint(_A1 __x) _NOEXCEPT
1327fe6060f1SDimitry Andric {
1328*bdd1243dSDimitry Andric     return __builtin_llrint((double)__x);
1329fe6060f1SDimitry Andric }
13300b57cec5SDimitry Andric 
13310b57cec5SDimitry Andric // llround
13320b57cec5SDimitry Andric 
1333*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llround(float __x) _NOEXCEPT
1334fe6060f1SDimitry Andric {
1335*bdd1243dSDimitry Andric     return __builtin_llroundf(__x);
1336fe6060f1SDimitry Andric }
1337*bdd1243dSDimitry Andric 
1338*bdd1243dSDimitry Andric template <class = int>
1339*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long long llround(double __x) _NOEXCEPT {
1340*bdd1243dSDimitry Andric   return __builtin_llround(__x);
1341*bdd1243dSDimitry Andric }
1342*bdd1243dSDimitry Andric 
1343*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long long llround(long double __x) _NOEXCEPT
1344fe6060f1SDimitry Andric {
1345*bdd1243dSDimitry Andric     return __builtin_llroundl(__x);
1346fe6060f1SDimitry Andric }
13470b57cec5SDimitry Andric 
13480b57cec5SDimitry Andric template <class _A1>
1349*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
13500b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long long>::type
1351*bdd1243dSDimitry Andric llround(_A1 __x) _NOEXCEPT
1352fe6060f1SDimitry Andric {
1353*bdd1243dSDimitry Andric     return __builtin_llround((double)__x);
1354fe6060f1SDimitry Andric }
13550b57cec5SDimitry Andric 
13560b57cec5SDimitry Andric // log1p
13570b57cec5SDimitry Andric 
1358*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       log1p(float __x) _NOEXCEPT       {return __builtin_log1pf(__x);}
1359*bdd1243dSDimitry Andric 
1360*bdd1243dSDimitry Andric template <class = int>
1361*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log1p(double __x) _NOEXCEPT {
1362*bdd1243dSDimitry Andric   return __builtin_log1p(__x);
1363*bdd1243dSDimitry Andric }
1364*bdd1243dSDimitry Andric 
1365*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log1p(long double __x) _NOEXCEPT {return __builtin_log1pl(__x);}
13660b57cec5SDimitry Andric 
13670b57cec5SDimitry Andric template <class _A1>
1368*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
13690b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1370*bdd1243dSDimitry Andric log1p(_A1 __x) _NOEXCEPT {return __builtin_log1p((double)__x);}
13710b57cec5SDimitry Andric 
13720b57cec5SDimitry Andric // log2
13730b57cec5SDimitry Andric 
1374*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       log2(float __x) _NOEXCEPT       {return __builtin_log2f(__x);}
1375*bdd1243dSDimitry Andric 
1376*bdd1243dSDimitry Andric template <class = int>
1377*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double log2(double __x) _NOEXCEPT {
1378*bdd1243dSDimitry Andric   return __builtin_log2(__x);
1379*bdd1243dSDimitry Andric }
1380*bdd1243dSDimitry Andric 
1381*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double log2(long double __x) _NOEXCEPT {return __builtin_log2l(__x);}
13820b57cec5SDimitry Andric 
13830b57cec5SDimitry Andric template <class _A1>
1384*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
13850b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1386*bdd1243dSDimitry Andric log2(_A1 __x) _NOEXCEPT {return __builtin_log2((double)__x);}
13870b57cec5SDimitry Andric 
13880b57cec5SDimitry Andric // logb
13890b57cec5SDimitry Andric 
1390*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       logb(float __x) _NOEXCEPT       {return __builtin_logbf(__x);}
1391*bdd1243dSDimitry Andric 
1392*bdd1243dSDimitry Andric template <class = int>
1393*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double logb(double __x) _NOEXCEPT {
1394*bdd1243dSDimitry Andric   return __builtin_logb(__x);
1395*bdd1243dSDimitry Andric }
1396*bdd1243dSDimitry Andric 
1397*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double logb(long double __x) _NOEXCEPT {return __builtin_logbl(__x);}
13980b57cec5SDimitry Andric 
13990b57cec5SDimitry Andric template <class _A1>
1400*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
14010b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1402*bdd1243dSDimitry Andric logb(_A1 __x) _NOEXCEPT {return __builtin_logb((double)__x);}
14030b57cec5SDimitry Andric 
14040b57cec5SDimitry Andric // lrint
14050b57cec5SDimitry Andric 
1406*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lrint(float __x) _NOEXCEPT
1407fe6060f1SDimitry Andric {
1408*bdd1243dSDimitry Andric     return __builtin_lrintf(__x);
1409fe6060f1SDimitry Andric }
1410*bdd1243dSDimitry Andric 
1411*bdd1243dSDimitry Andric template <class = int>
1412*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long lrint(double __x) _NOEXCEPT {
1413*bdd1243dSDimitry Andric   return __builtin_lrint(__x);
1414*bdd1243dSDimitry Andric }
1415*bdd1243dSDimitry Andric 
1416*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lrint(long double __x) _NOEXCEPT
1417fe6060f1SDimitry Andric {
1418*bdd1243dSDimitry Andric     return __builtin_lrintl(__x);
1419fe6060f1SDimitry Andric }
14200b57cec5SDimitry Andric 
14210b57cec5SDimitry Andric template <class _A1>
1422*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
14230b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long>::type
1424*bdd1243dSDimitry Andric lrint(_A1 __x) _NOEXCEPT
1425fe6060f1SDimitry Andric {
1426*bdd1243dSDimitry Andric     return __builtin_lrint((double)__x);
1427fe6060f1SDimitry Andric }
14280b57cec5SDimitry Andric 
14290b57cec5SDimitry Andric // lround
14300b57cec5SDimitry Andric 
1431*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lround(float __x) _NOEXCEPT
1432fe6060f1SDimitry Andric {
1433*bdd1243dSDimitry Andric     return __builtin_lroundf(__x);
1434fe6060f1SDimitry Andric }
1435*bdd1243dSDimitry Andric 
1436*bdd1243dSDimitry Andric template <class = int>
1437*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI long lround(double __x) _NOEXCEPT {
1438*bdd1243dSDimitry Andric   return __builtin_lround(__x);
1439*bdd1243dSDimitry Andric }
1440*bdd1243dSDimitry Andric 
1441*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long lround(long double __x) _NOEXCEPT
1442fe6060f1SDimitry Andric {
1443*bdd1243dSDimitry Andric     return __builtin_lroundl(__x);
1444fe6060f1SDimitry Andric }
14450b57cec5SDimitry Andric 
14460b57cec5SDimitry Andric template <class _A1>
1447*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
14480b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, long>::type
1449*bdd1243dSDimitry Andric lround(_A1 __x) _NOEXCEPT
1450fe6060f1SDimitry Andric {
1451*bdd1243dSDimitry Andric     return __builtin_lround((double)__x);
1452fe6060f1SDimitry Andric }
14530b57cec5SDimitry Andric 
14540b57cec5SDimitry Andric // nan
14550b57cec5SDimitry Andric 
14560b57cec5SDimitry Andric // nearbyint
14570b57cec5SDimitry Andric 
1458*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       nearbyint(float __x) _NOEXCEPT       {return __builtin_nearbyintf(__x);}
1459*bdd1243dSDimitry Andric 
1460*bdd1243dSDimitry Andric template <class = int>
1461*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double nearbyint(double __x) _NOEXCEPT {
1462*bdd1243dSDimitry Andric   return __builtin_nearbyint(__x);
1463*bdd1243dSDimitry Andric }
1464*bdd1243dSDimitry Andric 
1465*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double nearbyint(long double __x) _NOEXCEPT {return __builtin_nearbyintl(__x);}
14660b57cec5SDimitry Andric 
14670b57cec5SDimitry Andric template <class _A1>
1468*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
14690b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1470*bdd1243dSDimitry Andric nearbyint(_A1 __x) _NOEXCEPT {return __builtin_nearbyint((double)__x);}
14710b57cec5SDimitry Andric 
14720b57cec5SDimitry Andric // nextafter
14730b57cec5SDimitry Andric 
1474*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       nextafter(float __x, float __y) _NOEXCEPT             {return __builtin_nextafterf(__x, __y);}
1475*bdd1243dSDimitry Andric 
1476*bdd1243dSDimitry Andric template <class = int>
1477*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double nextafter(double __x, double __y) _NOEXCEPT {
1478*bdd1243dSDimitry Andric   return __builtin_nextafter(__x, __y);
1479*bdd1243dSDimitry Andric }
1480*bdd1243dSDimitry Andric 
1481*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double nextafter(long double __x, long double __y) _NOEXCEPT {return __builtin_nextafterl(__x, __y);}
14820b57cec5SDimitry Andric 
14830b57cec5SDimitry Andric template <class _A1, class _A2>
1484*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1485349cc55cSDimitry Andric typename std::__enable_if_t
14860b57cec5SDimitry Andric <
14870b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
14880b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
14890b57cec5SDimitry Andric     std::__promote<_A1, _A2>
14900b57cec5SDimitry Andric >::type
1491*bdd1243dSDimitry Andric nextafter(_A1 __x, _A2 __y) _NOEXCEPT
14920b57cec5SDimitry Andric {
14930b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
14940b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
14950b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1496*bdd1243dSDimitry Andric     return ::nextafter((__result_type)__x, (__result_type)__y);
14970b57cec5SDimitry Andric }
14980b57cec5SDimitry Andric 
14990b57cec5SDimitry Andric // nexttoward
15000b57cec5SDimitry Andric 
1501*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       nexttoward(float __x, long double __y) _NOEXCEPT       {return __builtin_nexttowardf(__x, __y);}
1502*bdd1243dSDimitry Andric 
1503*bdd1243dSDimitry Andric template <class = int>
1504*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double nexttoward(double __x, long double __y) _NOEXCEPT {
1505*bdd1243dSDimitry Andric   return __builtin_nexttoward(__x, __y);
1506*bdd1243dSDimitry Andric }
1507*bdd1243dSDimitry Andric 
1508*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double nexttoward(long double __x, long double __y) _NOEXCEPT {return __builtin_nexttowardl(__x, __y);}
15090b57cec5SDimitry Andric 
15100b57cec5SDimitry Andric template <class _A1>
1511*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
15120b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1513*bdd1243dSDimitry Andric nexttoward(_A1 __x, long double __y) _NOEXCEPT {return __builtin_nexttoward((double)__x, __y);}
15140b57cec5SDimitry Andric 
15150b57cec5SDimitry Andric // remainder
15160b57cec5SDimitry Andric 
1517*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       remainder(float __x, float __y) _NOEXCEPT             {return __builtin_remainderf(__x, __y);}
1518*bdd1243dSDimitry Andric 
1519*bdd1243dSDimitry Andric template <class = int>
1520*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double remainder(double __x, double __y) _NOEXCEPT {
1521*bdd1243dSDimitry Andric   return __builtin_remainder(__x, __y);
1522*bdd1243dSDimitry Andric }
1523*bdd1243dSDimitry Andric 
1524*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double remainder(long double __x, long double __y) _NOEXCEPT {return __builtin_remainderl(__x, __y);}
15250b57cec5SDimitry Andric 
15260b57cec5SDimitry Andric template <class _A1, class _A2>
1527*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1528349cc55cSDimitry Andric typename std::__enable_if_t
15290b57cec5SDimitry Andric <
15300b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
15310b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
15320b57cec5SDimitry Andric     std::__promote<_A1, _A2>
15330b57cec5SDimitry Andric >::type
1534*bdd1243dSDimitry Andric remainder(_A1 __x, _A2 __y) _NOEXCEPT
15350b57cec5SDimitry Andric {
15360b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
15370b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
15380b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1539*bdd1243dSDimitry Andric     return ::remainder((__result_type)__x, (__result_type)__y);
15400b57cec5SDimitry Andric }
15410b57cec5SDimitry Andric 
15420b57cec5SDimitry Andric // remquo
15430b57cec5SDimitry Andric 
1544*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       remquo(float __x, float __y, int* __z) _NOEXCEPT             {return __builtin_remquof(__x, __y, __z);}
1545*bdd1243dSDimitry Andric 
1546*bdd1243dSDimitry Andric template <class = int>
1547*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double remquo(double __x, double __y, int* __z) _NOEXCEPT {
1548*bdd1243dSDimitry Andric   return __builtin_remquo(__x, __y, __z);
1549*bdd1243dSDimitry Andric }
1550*bdd1243dSDimitry Andric 
1551*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double remquo(long double __x, long double __y, int* __z) _NOEXCEPT {return __builtin_remquol(__x, __y, __z);}
15520b57cec5SDimitry Andric 
15530b57cec5SDimitry Andric template <class _A1, class _A2>
1554*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
1555349cc55cSDimitry Andric typename std::__enable_if_t
15560b57cec5SDimitry Andric <
15570b57cec5SDimitry Andric     std::is_arithmetic<_A1>::value &&
15580b57cec5SDimitry Andric     std::is_arithmetic<_A2>::value,
15590b57cec5SDimitry Andric     std::__promote<_A1, _A2>
15600b57cec5SDimitry Andric >::type
1561*bdd1243dSDimitry Andric remquo(_A1 __x, _A2 __y, int* __z) _NOEXCEPT
15620b57cec5SDimitry Andric {
15630b57cec5SDimitry Andric     typedef typename std::__promote<_A1, _A2>::type __result_type;
15640b57cec5SDimitry Andric     static_assert((!(std::_IsSame<_A1, __result_type>::value &&
15650b57cec5SDimitry Andric                      std::_IsSame<_A2, __result_type>::value)), "");
1566*bdd1243dSDimitry Andric     return ::remquo((__result_type)__x, (__result_type)__y, __z);
15670b57cec5SDimitry Andric }
15680b57cec5SDimitry Andric 
15690b57cec5SDimitry Andric // rint
15700b57cec5SDimitry Andric 
1571*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       rint(float __x) _NOEXCEPT
1572fe6060f1SDimitry Andric {
1573*bdd1243dSDimitry Andric     return __builtin_rintf(__x);
1574fe6060f1SDimitry Andric }
1575*bdd1243dSDimitry Andric 
1576*bdd1243dSDimitry Andric template <class = int>
1577*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double rint(double __x) _NOEXCEPT {
1578*bdd1243dSDimitry Andric   return __builtin_rint(__x);
1579*bdd1243dSDimitry Andric }
1580*bdd1243dSDimitry Andric 
1581*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double rint(long double __x) _NOEXCEPT
1582fe6060f1SDimitry Andric {
1583*bdd1243dSDimitry Andric     return __builtin_rintl(__x);
1584fe6060f1SDimitry Andric }
15850b57cec5SDimitry Andric 
15860b57cec5SDimitry Andric template <class _A1>
1587*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
15880b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1589*bdd1243dSDimitry Andric rint(_A1 __x) _NOEXCEPT
1590fe6060f1SDimitry Andric {
1591*bdd1243dSDimitry Andric     return __builtin_rint((double)__x);
1592fe6060f1SDimitry Andric }
15930b57cec5SDimitry Andric 
15940b57cec5SDimitry Andric // round
15950b57cec5SDimitry Andric 
1596*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       round(float __x) _NOEXCEPT
1597fe6060f1SDimitry Andric {
1598*bdd1243dSDimitry Andric     return __builtin_round(__x);
1599fe6060f1SDimitry Andric }
1600*bdd1243dSDimitry Andric 
1601*bdd1243dSDimitry Andric template <class = int>
1602*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double round(double __x) _NOEXCEPT {
1603*bdd1243dSDimitry Andric   return __builtin_round(__x);
1604*bdd1243dSDimitry Andric }
1605*bdd1243dSDimitry Andric 
1606*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double round(long double __x) _NOEXCEPT
1607fe6060f1SDimitry Andric {
1608*bdd1243dSDimitry Andric     return __builtin_roundl(__x);
1609fe6060f1SDimitry Andric }
16100b57cec5SDimitry Andric 
16110b57cec5SDimitry Andric template <class _A1>
1612*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
16130b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1614*bdd1243dSDimitry Andric round(_A1 __x) _NOEXCEPT
1615fe6060f1SDimitry Andric {
1616*bdd1243dSDimitry Andric     return __builtin_round((double)__x);
1617fe6060f1SDimitry Andric }
16180b57cec5SDimitry Andric 
16190b57cec5SDimitry Andric // scalbln
16200b57cec5SDimitry Andric 
1621*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       scalbln(float __x, long __y) _NOEXCEPT       {return __builtin_scalblnf(__x, __y);}
1622*bdd1243dSDimitry Andric 
1623*bdd1243dSDimitry Andric template <class = int>
1624*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double scalbln(double __x, long __y) _NOEXCEPT {
1625*bdd1243dSDimitry Andric   return __builtin_scalbln(__x, __y);
1626*bdd1243dSDimitry Andric }
1627*bdd1243dSDimitry Andric 
1628*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double scalbln(long double __x, long __y) _NOEXCEPT {return __builtin_scalblnl(__x, __y);}
16290b57cec5SDimitry Andric 
16300b57cec5SDimitry Andric template <class _A1>
1631*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
16320b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1633*bdd1243dSDimitry Andric scalbln(_A1 __x, long __y) _NOEXCEPT {return __builtin_scalbln((double)__x, __y);}
16340b57cec5SDimitry Andric 
16350b57cec5SDimitry Andric // scalbn
16360b57cec5SDimitry Andric 
1637*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       scalbn(float __x, int __y) _NOEXCEPT       {return __builtin_scalbnf(__x, __y);}
1638*bdd1243dSDimitry Andric 
1639*bdd1243dSDimitry Andric template <class = int>
1640*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double scalbn(double __x, int __y) _NOEXCEPT {
1641*bdd1243dSDimitry Andric   return __builtin_scalbn(__x, __y);
1642*bdd1243dSDimitry Andric }
1643*bdd1243dSDimitry Andric 
1644*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double scalbn(long double __x, int __y) _NOEXCEPT {return __builtin_scalbnl(__x, __y);}
16450b57cec5SDimitry Andric 
16460b57cec5SDimitry Andric template <class _A1>
1647*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
16480b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1649*bdd1243dSDimitry Andric scalbn(_A1 __x, int __y) _NOEXCEPT {return __builtin_scalbn((double)__x, __y);}
16500b57cec5SDimitry Andric 
16510b57cec5SDimitry Andric // tgamma
16520b57cec5SDimitry Andric 
1653*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float       tgamma(float __x) _NOEXCEPT       {return __builtin_tgammaf(__x);}
1654*bdd1243dSDimitry Andric 
1655*bdd1243dSDimitry Andric template <class = int>
1656*bdd1243dSDimitry Andric _LIBCPP_HIDE_FROM_ABI double tgamma(double __x) _NOEXCEPT {
1657*bdd1243dSDimitry Andric   return __builtin_tgamma(__x);
1658*bdd1243dSDimitry Andric }
1659*bdd1243dSDimitry Andric 
1660*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double tgamma(long double __x) _NOEXCEPT {return __builtin_tgammal(__x);}
16610b57cec5SDimitry Andric 
16620b57cec5SDimitry Andric template <class _A1>
1663*bdd1243dSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI
16640b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1665*bdd1243dSDimitry Andric tgamma(_A1 __x) _NOEXCEPT {return __builtin_tgamma((double)__x);}
16660b57cec5SDimitry Andric 
16670b57cec5SDimitry Andric // trunc
16680b57cec5SDimitry Andric 
1669*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI float       trunc(float __x) _NOEXCEPT
1670fe6060f1SDimitry Andric {
1671*bdd1243dSDimitry Andric     return __builtin_trunc(__x);
1672fe6060f1SDimitry Andric }
1673*bdd1243dSDimitry Andric 
1674*bdd1243dSDimitry Andric template <class = int>
1675*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI double trunc(double __x) _NOEXCEPT {
1676*bdd1243dSDimitry Andric   return __builtin_trunc(__x);
1677*bdd1243dSDimitry Andric }
1678*bdd1243dSDimitry Andric 
1679*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI long double trunc(long double __x) _NOEXCEPT
1680fe6060f1SDimitry Andric {
1681*bdd1243dSDimitry Andric     return __builtin_truncl(__x);
1682fe6060f1SDimitry Andric }
16830b57cec5SDimitry Andric 
16840b57cec5SDimitry Andric template <class _A1>
1685*bdd1243dSDimitry Andric _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI
16860b57cec5SDimitry Andric typename std::enable_if<std::is_integral<_A1>::value, double>::type
1687*bdd1243dSDimitry Andric trunc(_A1 __x) _NOEXCEPT
1688fe6060f1SDimitry Andric {
1689*bdd1243dSDimitry Andric     return __builtin_trunc((double)__x);
1690fe6060f1SDimitry Andric }
16910b57cec5SDimitry Andric 
16920b57cec5SDimitry Andric } // extern "C++"
16930b57cec5SDimitry Andric 
16940b57cec5SDimitry Andric #endif // __cplusplus
16950b57cec5SDimitry Andric 
16960b57cec5SDimitry Andric #else // _LIBCPP_MATH_H
16970b57cec5SDimitry Andric 
16980b57cec5SDimitry Andric // This include lives outside the header guard in order to support an MSVC
16990b57cec5SDimitry Andric // extension which allows users to do:
17000b57cec5SDimitry Andric //
17010b57cec5SDimitry Andric // #define _USE_MATH_DEFINES
17020b57cec5SDimitry Andric // #include <math.h>
17030b57cec5SDimitry Andric //
17040b57cec5SDimitry Andric // and receive the definitions of mathematical constants, even if <math.h>
17050b57cec5SDimitry Andric // has previously been included.
17060b57cec5SDimitry Andric #if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES)
17070b57cec5SDimitry Andric #include_next <math.h>
17080b57cec5SDimitry Andric #endif
17090b57cec5SDimitry Andric 
17100b57cec5SDimitry Andric #endif // _LIBCPP_MATH_H
1711