zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

tgmath.h (30389B) - Raw


      1 /*===---- tgmath.h - Standard header for type generic math ----------------===*\
      2  *
      3  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4  * See https://llvm.org/LICENSE.txt for license information.
      5  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6  *
      7 \*===----------------------------------------------------------------------===*/
      8 
      9 #ifndef __CLANG_TGMATH_H
     10 #define __CLANG_TGMATH_H
     11 
     12 /* C99 7.22 Type-generic math <tgmath.h>. */
     13 #include <math.h>
     14 
     15 /*
     16  * Allow additional definitions and implementation-defined values on Apple
     17  * platforms. This is done after #include <math.h> to avoid depcycle conflicts
     18  * between libcxx and darwin in C++ modules builds.
     19  */
     20 #if defined(__APPLE__) && __STDC_HOSTED__ && __has_include_next(<tgmath.h>)
     21 #  include_next <tgmath.h>
     22 #else
     23 
     24 /* C++ handles type genericity with overloading in math.h. */
     25 #ifndef __cplusplus
     26 #include <complex.h>
     27 
     28 #define _TG_ATTRSp __attribute__((__overloadable__))
     29 #define _TG_ATTRS __attribute__((__overloadable__, __always_inline__))
     30 
     31 // promotion
     32 
     33 typedef void _Argument_type_is_not_arithmetic;
     34 static _Argument_type_is_not_arithmetic __tg_promote(...)
     35   __attribute__((__unavailable__,__overloadable__));
     36 static double               _TG_ATTRSp __tg_promote(int);
     37 static double               _TG_ATTRSp __tg_promote(unsigned int);
     38 static double               _TG_ATTRSp __tg_promote(long);
     39 static double               _TG_ATTRSp __tg_promote(unsigned long);
     40 static double               _TG_ATTRSp __tg_promote(long long);
     41 static double               _TG_ATTRSp __tg_promote(unsigned long long);
     42 static float                _TG_ATTRSp __tg_promote(float);
     43 static double               _TG_ATTRSp __tg_promote(double);
     44 static long double          _TG_ATTRSp __tg_promote(long double);
     45 static float _Complex       _TG_ATTRSp __tg_promote(float _Complex);
     46 static double _Complex      _TG_ATTRSp __tg_promote(double _Complex);
     47 static long double _Complex _TG_ATTRSp __tg_promote(long double _Complex);
     48 
     49 #define __tg_promote1(__x)           (__typeof__(__tg_promote(__x)))
     50 #define __tg_promote2(__x, __y)      (__typeof__(__tg_promote(__x) + \
     51                                                  __tg_promote(__y)))
     52 #define __tg_promote3(__x, __y, __z) (__typeof__(__tg_promote(__x) + \
     53                                                  __tg_promote(__y) + \
     54                                                  __tg_promote(__z)))
     55 
     56 // acos
     57 
     58 static float
     59     _TG_ATTRS
     60     __tg_acos(float __x) {return acosf(__x);}
     61 
     62 static double
     63     _TG_ATTRS
     64     __tg_acos(double __x) {return acos(__x);}
     65 
     66 static long double
     67     _TG_ATTRS
     68     __tg_acos(long double __x) {return acosl(__x);}
     69 
     70 static float _Complex
     71     _TG_ATTRS
     72     __tg_acos(float _Complex __x) {return cacosf(__x);}
     73 
     74 static double _Complex
     75     _TG_ATTRS
     76     __tg_acos(double _Complex __x) {return cacos(__x);}
     77 
     78 static long double _Complex
     79     _TG_ATTRS
     80     __tg_acos(long double _Complex __x) {return cacosl(__x);}
     81 
     82 #undef acos
     83 #define acos(__x) __tg_acos(__tg_promote1((__x))(__x))
     84 
     85 // asin
     86 
     87 static float
     88     _TG_ATTRS
     89     __tg_asin(float __x) {return asinf(__x);}
     90 
     91 static double
     92     _TG_ATTRS
     93     __tg_asin(double __x) {return asin(__x);}
     94 
     95 static long double
     96     _TG_ATTRS
     97     __tg_asin(long double __x) {return asinl(__x);}
     98 
     99 static float _Complex
    100     _TG_ATTRS
    101     __tg_asin(float _Complex __x) {return casinf(__x);}
    102 
    103 static double _Complex
    104     _TG_ATTRS
    105     __tg_asin(double _Complex __x) {return casin(__x);}
    106 
    107 static long double _Complex
    108     _TG_ATTRS
    109     __tg_asin(long double _Complex __x) {return casinl(__x);}
    110 
    111 #undef asin
    112 #define asin(__x) __tg_asin(__tg_promote1((__x))(__x))
    113 
    114 // atan
    115 
    116 static float
    117     _TG_ATTRS
    118     __tg_atan(float __x) {return atanf(__x);}
    119 
    120 static double
    121     _TG_ATTRS
    122     __tg_atan(double __x) {return atan(__x);}
    123 
    124 static long double
    125     _TG_ATTRS
    126     __tg_atan(long double __x) {return atanl(__x);}
    127 
    128 static float _Complex
    129     _TG_ATTRS
    130     __tg_atan(float _Complex __x) {return catanf(__x);}
    131 
    132 static double _Complex
    133     _TG_ATTRS
    134     __tg_atan(double _Complex __x) {return catan(__x);}
    135 
    136 static long double _Complex
    137     _TG_ATTRS
    138     __tg_atan(long double _Complex __x) {return catanl(__x);}
    139 
    140 #undef atan
    141 #define atan(__x) __tg_atan(__tg_promote1((__x))(__x))
    142 
    143 // acosh
    144 
    145 static float
    146     _TG_ATTRS
    147     __tg_acosh(float __x) {return acoshf(__x);}
    148 
    149 static double
    150     _TG_ATTRS
    151     __tg_acosh(double __x) {return acosh(__x);}
    152 
    153 static long double
    154     _TG_ATTRS
    155     __tg_acosh(long double __x) {return acoshl(__x);}
    156 
    157 static float _Complex
    158     _TG_ATTRS
    159     __tg_acosh(float _Complex __x) {return cacoshf(__x);}
    160 
    161 static double _Complex
    162     _TG_ATTRS
    163     __tg_acosh(double _Complex __x) {return cacosh(__x);}
    164 
    165 static long double _Complex
    166     _TG_ATTRS
    167     __tg_acosh(long double _Complex __x) {return cacoshl(__x);}
    168 
    169 #undef acosh
    170 #define acosh(__x) __tg_acosh(__tg_promote1((__x))(__x))
    171 
    172 // asinh
    173 
    174 static float
    175     _TG_ATTRS
    176     __tg_asinh(float __x) {return asinhf(__x);}
    177 
    178 static double
    179     _TG_ATTRS
    180     __tg_asinh(double __x) {return asinh(__x);}
    181 
    182 static long double
    183     _TG_ATTRS
    184     __tg_asinh(long double __x) {return asinhl(__x);}
    185 
    186 static float _Complex
    187     _TG_ATTRS
    188     __tg_asinh(float _Complex __x) {return casinhf(__x);}
    189 
    190 static double _Complex
    191     _TG_ATTRS
    192     __tg_asinh(double _Complex __x) {return casinh(__x);}
    193 
    194 static long double _Complex
    195     _TG_ATTRS
    196     __tg_asinh(long double _Complex __x) {return casinhl(__x);}
    197 
    198 #undef asinh
    199 #define asinh(__x) __tg_asinh(__tg_promote1((__x))(__x))
    200 
    201 // atanh
    202 
    203 static float
    204     _TG_ATTRS
    205     __tg_atanh(float __x) {return atanhf(__x);}
    206 
    207 static double
    208     _TG_ATTRS
    209     __tg_atanh(double __x) {return atanh(__x);}
    210 
    211 static long double
    212     _TG_ATTRS
    213     __tg_atanh(long double __x) {return atanhl(__x);}
    214 
    215 static float _Complex
    216     _TG_ATTRS
    217     __tg_atanh(float _Complex __x) {return catanhf(__x);}
    218 
    219 static double _Complex
    220     _TG_ATTRS
    221     __tg_atanh(double _Complex __x) {return catanh(__x);}
    222 
    223 static long double _Complex
    224     _TG_ATTRS
    225     __tg_atanh(long double _Complex __x) {return catanhl(__x);}
    226 
    227 #undef atanh
    228 #define atanh(__x) __tg_atanh(__tg_promote1((__x))(__x))
    229 
    230 // cos
    231 
    232 static float
    233     _TG_ATTRS
    234     __tg_cos(float __x) {return cosf(__x);}
    235 
    236 static double
    237     _TG_ATTRS
    238     __tg_cos(double __x) {return cos(__x);}
    239 
    240 static long double
    241     _TG_ATTRS
    242     __tg_cos(long double __x) {return cosl(__x);}
    243 
    244 static float _Complex
    245     _TG_ATTRS
    246     __tg_cos(float _Complex __x) {return ccosf(__x);}
    247 
    248 static double _Complex
    249     _TG_ATTRS
    250     __tg_cos(double _Complex __x) {return ccos(__x);}
    251 
    252 static long double _Complex
    253     _TG_ATTRS
    254     __tg_cos(long double _Complex __x) {return ccosl(__x);}
    255 
    256 #undef cos
    257 #define cos(__x) __tg_cos(__tg_promote1((__x))(__x))
    258 
    259 // sin
    260 
    261 static float
    262     _TG_ATTRS
    263     __tg_sin(float __x) {return sinf(__x);}
    264 
    265 static double
    266     _TG_ATTRS
    267     __tg_sin(double __x) {return sin(__x);}
    268 
    269 static long double
    270     _TG_ATTRS
    271     __tg_sin(long double __x) {return sinl(__x);}
    272 
    273 static float _Complex
    274     _TG_ATTRS
    275     __tg_sin(float _Complex __x) {return csinf(__x);}
    276 
    277 static double _Complex
    278     _TG_ATTRS
    279     __tg_sin(double _Complex __x) {return csin(__x);}
    280 
    281 static long double _Complex
    282     _TG_ATTRS
    283     __tg_sin(long double _Complex __x) {return csinl(__x);}
    284 
    285 #undef sin
    286 #define sin(__x) __tg_sin(__tg_promote1((__x))(__x))
    287 
    288 // tan
    289 
    290 static float
    291     _TG_ATTRS
    292     __tg_tan(float __x) {return tanf(__x);}
    293 
    294 static double
    295     _TG_ATTRS
    296     __tg_tan(double __x) {return tan(__x);}
    297 
    298 static long double
    299     _TG_ATTRS
    300     __tg_tan(long double __x) {return tanl(__x);}
    301 
    302 static float _Complex
    303     _TG_ATTRS
    304     __tg_tan(float _Complex __x) {return ctanf(__x);}
    305 
    306 static double _Complex
    307     _TG_ATTRS
    308     __tg_tan(double _Complex __x) {return ctan(__x);}
    309 
    310 static long double _Complex
    311     _TG_ATTRS
    312     __tg_tan(long double _Complex __x) {return ctanl(__x);}
    313 
    314 #undef tan
    315 #define tan(__x) __tg_tan(__tg_promote1((__x))(__x))
    316 
    317 // cosh
    318 
    319 static float
    320     _TG_ATTRS
    321     __tg_cosh(float __x) {return coshf(__x);}
    322 
    323 static double
    324     _TG_ATTRS
    325     __tg_cosh(double __x) {return cosh(__x);}
    326 
    327 static long double
    328     _TG_ATTRS
    329     __tg_cosh(long double __x) {return coshl(__x);}
    330 
    331 static float _Complex
    332     _TG_ATTRS
    333     __tg_cosh(float _Complex __x) {return ccoshf(__x);}
    334 
    335 static double _Complex
    336     _TG_ATTRS
    337     __tg_cosh(double _Complex __x) {return ccosh(__x);}
    338 
    339 static long double _Complex
    340     _TG_ATTRS
    341     __tg_cosh(long double _Complex __x) {return ccoshl(__x);}
    342 
    343 #undef cosh
    344 #define cosh(__x) __tg_cosh(__tg_promote1((__x))(__x))
    345 
    346 // sinh
    347 
    348 static float
    349     _TG_ATTRS
    350     __tg_sinh(float __x) {return sinhf(__x);}
    351 
    352 static double
    353     _TG_ATTRS
    354     __tg_sinh(double __x) {return sinh(__x);}
    355 
    356 static long double
    357     _TG_ATTRS
    358     __tg_sinh(long double __x) {return sinhl(__x);}
    359 
    360 static float _Complex
    361     _TG_ATTRS
    362     __tg_sinh(float _Complex __x) {return csinhf(__x);}
    363 
    364 static double _Complex
    365     _TG_ATTRS
    366     __tg_sinh(double _Complex __x) {return csinh(__x);}
    367 
    368 static long double _Complex
    369     _TG_ATTRS
    370     __tg_sinh(long double _Complex __x) {return csinhl(__x);}
    371 
    372 #undef sinh
    373 #define sinh(__x) __tg_sinh(__tg_promote1((__x))(__x))
    374 
    375 // tanh
    376 
    377 static float
    378     _TG_ATTRS
    379     __tg_tanh(float __x) {return tanhf(__x);}
    380 
    381 static double
    382     _TG_ATTRS
    383     __tg_tanh(double __x) {return tanh(__x);}
    384 
    385 static long double
    386     _TG_ATTRS
    387     __tg_tanh(long double __x) {return tanhl(__x);}
    388 
    389 static float _Complex
    390     _TG_ATTRS
    391     __tg_tanh(float _Complex __x) {return ctanhf(__x);}
    392 
    393 static double _Complex
    394     _TG_ATTRS
    395     __tg_tanh(double _Complex __x) {return ctanh(__x);}
    396 
    397 static long double _Complex
    398     _TG_ATTRS
    399     __tg_tanh(long double _Complex __x) {return ctanhl(__x);}
    400 
    401 #undef tanh
    402 #define tanh(__x) __tg_tanh(__tg_promote1((__x))(__x))
    403 
    404 // exp
    405 
    406 static float
    407     _TG_ATTRS
    408     __tg_exp(float __x) {return expf(__x);}
    409 
    410 static double
    411     _TG_ATTRS
    412     __tg_exp(double __x) {return exp(__x);}
    413 
    414 static long double
    415     _TG_ATTRS
    416     __tg_exp(long double __x) {return expl(__x);}
    417 
    418 static float _Complex
    419     _TG_ATTRS
    420     __tg_exp(float _Complex __x) {return cexpf(__x);}
    421 
    422 static double _Complex
    423     _TG_ATTRS
    424     __tg_exp(double _Complex __x) {return cexp(__x);}
    425 
    426 static long double _Complex
    427     _TG_ATTRS
    428     __tg_exp(long double _Complex __x) {return cexpl(__x);}
    429 
    430 #undef exp
    431 #define exp(__x) __tg_exp(__tg_promote1((__x))(__x))
    432 
    433 // log
    434 
    435 static float
    436     _TG_ATTRS
    437     __tg_log(float __x) {return logf(__x);}
    438 
    439 static double
    440     _TG_ATTRS
    441     __tg_log(double __x) {return log(__x);}
    442 
    443 static long double
    444     _TG_ATTRS
    445     __tg_log(long double __x) {return logl(__x);}
    446 
    447 static float _Complex
    448     _TG_ATTRS
    449     __tg_log(float _Complex __x) {return clogf(__x);}
    450 
    451 static double _Complex
    452     _TG_ATTRS
    453     __tg_log(double _Complex __x) {return clog(__x);}
    454 
    455 static long double _Complex
    456     _TG_ATTRS
    457     __tg_log(long double _Complex __x) {return clogl(__x);}
    458 
    459 #undef log
    460 #define log(__x) __tg_log(__tg_promote1((__x))(__x))
    461 
    462 // pow
    463 
    464 static float
    465     _TG_ATTRS
    466     __tg_pow(float __x, float __y) {return powf(__x, __y);}
    467 
    468 static double
    469     _TG_ATTRS
    470     __tg_pow(double __x, double __y) {return pow(__x, __y);}
    471 
    472 static long double
    473     _TG_ATTRS
    474     __tg_pow(long double __x, long double __y) {return powl(__x, __y);}
    475 
    476 static float _Complex
    477     _TG_ATTRS
    478     __tg_pow(float _Complex __x, float _Complex __y) {return cpowf(__x, __y);}
    479 
    480 static double _Complex
    481     _TG_ATTRS
    482     __tg_pow(double _Complex __x, double _Complex __y) {return cpow(__x, __y);}
    483 
    484 static long double _Complex
    485     _TG_ATTRS
    486     __tg_pow(long double _Complex __x, long double _Complex __y)
    487     {return cpowl(__x, __y);}
    488 
    489 #undef pow
    490 #define pow(__x, __y) __tg_pow(__tg_promote2((__x), (__y))(__x), \
    491                                __tg_promote2((__x), (__y))(__y))
    492 
    493 // sqrt
    494 
    495 static float
    496     _TG_ATTRS
    497     __tg_sqrt(float __x) {return sqrtf(__x);}
    498 
    499 static double
    500     _TG_ATTRS
    501     __tg_sqrt(double __x) {return sqrt(__x);}
    502 
    503 static long double
    504     _TG_ATTRS
    505     __tg_sqrt(long double __x) {return sqrtl(__x);}
    506 
    507 static float _Complex
    508     _TG_ATTRS
    509     __tg_sqrt(float _Complex __x) {return csqrtf(__x);}
    510 
    511 static double _Complex
    512     _TG_ATTRS
    513     __tg_sqrt(double _Complex __x) {return csqrt(__x);}
    514 
    515 static long double _Complex
    516     _TG_ATTRS
    517     __tg_sqrt(long double _Complex __x) {return csqrtl(__x);}
    518 
    519 #undef sqrt
    520 #define sqrt(__x) __tg_sqrt(__tg_promote1((__x))(__x))
    521 
    522 // fabs
    523 
    524 static float
    525     _TG_ATTRS
    526     __tg_fabs(float __x) {return fabsf(__x);}
    527 
    528 static double
    529     _TG_ATTRS
    530     __tg_fabs(double __x) {return fabs(__x);}
    531 
    532 static long double
    533     _TG_ATTRS
    534     __tg_fabs(long double __x) {return fabsl(__x);}
    535 
    536 static float
    537     _TG_ATTRS
    538     __tg_fabs(float _Complex __x) {return cabsf(__x);}
    539 
    540 static double
    541     _TG_ATTRS
    542     __tg_fabs(double _Complex __x) {return cabs(__x);}
    543 
    544 static long double
    545     _TG_ATTRS
    546     __tg_fabs(long double _Complex __x) {return cabsl(__x);}
    547 
    548 #undef fabs
    549 #define fabs(__x) __tg_fabs(__tg_promote1((__x))(__x))
    550 
    551 // atan2
    552 
    553 static float
    554     _TG_ATTRS
    555     __tg_atan2(float __x, float __y) {return atan2f(__x, __y);}
    556 
    557 static double
    558     _TG_ATTRS
    559     __tg_atan2(double __x, double __y) {return atan2(__x, __y);}
    560 
    561 static long double
    562     _TG_ATTRS
    563     __tg_atan2(long double __x, long double __y) {return atan2l(__x, __y);}
    564 
    565 #undef atan2
    566 #define atan2(__x, __y) __tg_atan2(__tg_promote2((__x), (__y))(__x), \
    567                                    __tg_promote2((__x), (__y))(__y))
    568 
    569 // cbrt
    570 
    571 static float
    572     _TG_ATTRS
    573     __tg_cbrt(float __x) {return cbrtf(__x);}
    574 
    575 static double
    576     _TG_ATTRS
    577     __tg_cbrt(double __x) {return cbrt(__x);}
    578 
    579 static long double
    580     _TG_ATTRS
    581     __tg_cbrt(long double __x) {return cbrtl(__x);}
    582 
    583 #undef cbrt
    584 #define cbrt(__x) __tg_cbrt(__tg_promote1((__x))(__x))
    585 
    586 // ceil
    587 
    588 static float
    589     _TG_ATTRS
    590     __tg_ceil(float __x) {return ceilf(__x);}
    591 
    592 static double
    593     _TG_ATTRS
    594     __tg_ceil(double __x) {return ceil(__x);}
    595 
    596 static long double
    597     _TG_ATTRS
    598     __tg_ceil(long double __x) {return ceill(__x);}
    599 
    600 #undef ceil
    601 #define ceil(__x) __tg_ceil(__tg_promote1((__x))(__x))
    602 
    603 // copysign
    604 
    605 static float
    606     _TG_ATTRS
    607     __tg_copysign(float __x, float __y) {return copysignf(__x, __y);}
    608 
    609 static double
    610     _TG_ATTRS
    611     __tg_copysign(double __x, double __y) {return copysign(__x, __y);}
    612 
    613 static long double
    614     _TG_ATTRS
    615     __tg_copysign(long double __x, long double __y) {return copysignl(__x, __y);}
    616 
    617 #undef copysign
    618 #define copysign(__x, __y) __tg_copysign(__tg_promote2((__x), (__y))(__x), \
    619                                          __tg_promote2((__x), (__y))(__y))
    620 
    621 // erf
    622 
    623 static float
    624     _TG_ATTRS
    625     __tg_erf(float __x) {return erff(__x);}
    626 
    627 static double
    628     _TG_ATTRS
    629     __tg_erf(double __x) {return erf(__x);}
    630 
    631 static long double
    632     _TG_ATTRS
    633     __tg_erf(long double __x) {return erfl(__x);}
    634 
    635 #undef erf
    636 #define erf(__x) __tg_erf(__tg_promote1((__x))(__x))
    637 
    638 // erfc
    639 
    640 static float
    641     _TG_ATTRS
    642     __tg_erfc(float __x) {return erfcf(__x);}
    643 
    644 static double
    645     _TG_ATTRS
    646     __tg_erfc(double __x) {return erfc(__x);}
    647 
    648 static long double
    649     _TG_ATTRS
    650     __tg_erfc(long double __x) {return erfcl(__x);}
    651 
    652 #undef erfc
    653 #define erfc(__x) __tg_erfc(__tg_promote1((__x))(__x))
    654 
    655 // exp2
    656 
    657 static float
    658     _TG_ATTRS
    659     __tg_exp2(float __x) {return exp2f(__x);}
    660 
    661 static double
    662     _TG_ATTRS
    663     __tg_exp2(double __x) {return exp2(__x);}
    664 
    665 static long double
    666     _TG_ATTRS
    667     __tg_exp2(long double __x) {return exp2l(__x);}
    668 
    669 #undef exp2
    670 #define exp2(__x) __tg_exp2(__tg_promote1((__x))(__x))
    671 
    672 // expm1
    673 
    674 static float
    675     _TG_ATTRS
    676     __tg_expm1(float __x) {return expm1f(__x);}
    677 
    678 static double
    679     _TG_ATTRS
    680     __tg_expm1(double __x) {return expm1(__x);}
    681 
    682 static long double
    683     _TG_ATTRS
    684     __tg_expm1(long double __x) {return expm1l(__x);}
    685 
    686 #undef expm1
    687 #define expm1(__x) __tg_expm1(__tg_promote1((__x))(__x))
    688 
    689 // fdim
    690 
    691 static float
    692     _TG_ATTRS
    693     __tg_fdim(float __x, float __y) {return fdimf(__x, __y);}
    694 
    695 static double
    696     _TG_ATTRS
    697     __tg_fdim(double __x, double __y) {return fdim(__x, __y);}
    698 
    699 static long double
    700     _TG_ATTRS
    701     __tg_fdim(long double __x, long double __y) {return fdiml(__x, __y);}
    702 
    703 #undef fdim
    704 #define fdim(__x, __y) __tg_fdim(__tg_promote2((__x), (__y))(__x), \
    705                                  __tg_promote2((__x), (__y))(__y))
    706 
    707 // floor
    708 
    709 static float
    710     _TG_ATTRS
    711     __tg_floor(float __x) {return floorf(__x);}
    712 
    713 static double
    714     _TG_ATTRS
    715     __tg_floor(double __x) {return floor(__x);}
    716 
    717 static long double
    718     _TG_ATTRS
    719     __tg_floor(long double __x) {return floorl(__x);}
    720 
    721 #undef floor
    722 #define floor(__x) __tg_floor(__tg_promote1((__x))(__x))
    723 
    724 // fma
    725 
    726 static float
    727     _TG_ATTRS
    728     __tg_fma(float __x, float __y, float __z)
    729     {return fmaf(__x, __y, __z);}
    730 
    731 static double
    732     _TG_ATTRS
    733     __tg_fma(double __x, double __y, double __z)
    734     {return fma(__x, __y, __z);}
    735 
    736 static long double
    737     _TG_ATTRS
    738     __tg_fma(long double __x,long double __y, long double __z)
    739     {return fmal(__x, __y, __z);}
    740 
    741 #undef fma
    742 #define fma(__x, __y, __z)                                \
    743         __tg_fma(__tg_promote3((__x), (__y), (__z))(__x), \
    744                  __tg_promote3((__x), (__y), (__z))(__y), \
    745                  __tg_promote3((__x), (__y), (__z))(__z))
    746 
    747 // fmax
    748 
    749 static float
    750     _TG_ATTRS
    751     __tg_fmax(float __x, float __y) {return fmaxf(__x, __y);}
    752 
    753 static double
    754     _TG_ATTRS
    755     __tg_fmax(double __x, double __y) {return fmax(__x, __y);}
    756 
    757 static long double
    758     _TG_ATTRS
    759     __tg_fmax(long double __x, long double __y) {return fmaxl(__x, __y);}
    760 
    761 #undef fmax
    762 #define fmax(__x, __y) __tg_fmax(__tg_promote2((__x), (__y))(__x), \
    763                                  __tg_promote2((__x), (__y))(__y))
    764 
    765 // fmin
    766 
    767 static float
    768     _TG_ATTRS
    769     __tg_fmin(float __x, float __y) {return fminf(__x, __y);}
    770 
    771 static double
    772     _TG_ATTRS
    773     __tg_fmin(double __x, double __y) {return fmin(__x, __y);}
    774 
    775 static long double
    776     _TG_ATTRS
    777     __tg_fmin(long double __x, long double __y) {return fminl(__x, __y);}
    778 
    779 #undef fmin
    780 #define fmin(__x, __y) __tg_fmin(__tg_promote2((__x), (__y))(__x), \
    781                                  __tg_promote2((__x), (__y))(__y))
    782 
    783 // fmod
    784 
    785 static float
    786     _TG_ATTRS
    787     __tg_fmod(float __x, float __y) {return fmodf(__x, __y);}
    788 
    789 static double
    790     _TG_ATTRS
    791     __tg_fmod(double __x, double __y) {return fmod(__x, __y);}
    792 
    793 static long double
    794     _TG_ATTRS
    795     __tg_fmod(long double __x, long double __y) {return fmodl(__x, __y);}
    796 
    797 #undef fmod
    798 #define fmod(__x, __y) __tg_fmod(__tg_promote2((__x), (__y))(__x), \
    799                                  __tg_promote2((__x), (__y))(__y))
    800 
    801 // frexp
    802 
    803 static float
    804     _TG_ATTRS
    805     __tg_frexp(float __x, int* __y) {return frexpf(__x, __y);}
    806 
    807 static double
    808     _TG_ATTRS
    809     __tg_frexp(double __x, int* __y) {return frexp(__x, __y);}
    810 
    811 static long double
    812     _TG_ATTRS
    813     __tg_frexp(long double __x, int* __y) {return frexpl(__x, __y);}
    814 
    815 #undef frexp
    816 #define frexp(__x, __y) __tg_frexp(__tg_promote1((__x))(__x), __y)
    817 
    818 // hypot
    819 
    820 static float
    821     _TG_ATTRS
    822     __tg_hypot(float __x, float __y) {return hypotf(__x, __y);}
    823 
    824 static double
    825     _TG_ATTRS
    826     __tg_hypot(double __x, double __y) {return hypot(__x, __y);}
    827 
    828 static long double
    829     _TG_ATTRS
    830     __tg_hypot(long double __x, long double __y) {return hypotl(__x, __y);}
    831 
    832 #undef hypot
    833 #define hypot(__x, __y) __tg_hypot(__tg_promote2((__x), (__y))(__x), \
    834                                    __tg_promote2((__x), (__y))(__y))
    835 
    836 // ilogb
    837 
    838 static int
    839     _TG_ATTRS
    840     __tg_ilogb(float __x) {return ilogbf(__x);}
    841 
    842 static int
    843     _TG_ATTRS
    844     __tg_ilogb(double __x) {return ilogb(__x);}
    845 
    846 static int
    847     _TG_ATTRS
    848     __tg_ilogb(long double __x) {return ilogbl(__x);}
    849 
    850 #undef ilogb
    851 #define ilogb(__x) __tg_ilogb(__tg_promote1((__x))(__x))
    852 
    853 // ldexp
    854 
    855 static float
    856     _TG_ATTRS
    857     __tg_ldexp(float __x, int __y) {return ldexpf(__x, __y);}
    858 
    859 static double
    860     _TG_ATTRS
    861     __tg_ldexp(double __x, int __y) {return ldexp(__x, __y);}
    862 
    863 static long double
    864     _TG_ATTRS
    865     __tg_ldexp(long double __x, int __y) {return ldexpl(__x, __y);}
    866 
    867 #undef ldexp
    868 #define ldexp(__x, __y) __tg_ldexp(__tg_promote1((__x))(__x), __y)
    869 
    870 // lgamma
    871 
    872 static float
    873     _TG_ATTRS
    874     __tg_lgamma(float __x) {return lgammaf(__x);}
    875 
    876 static double
    877     _TG_ATTRS
    878     __tg_lgamma(double __x) {return lgamma(__x);}
    879 
    880 static long double
    881     _TG_ATTRS
    882     __tg_lgamma(long double __x) {return lgammal(__x);}
    883 
    884 #undef lgamma
    885 #define lgamma(__x) __tg_lgamma(__tg_promote1((__x))(__x))
    886 
    887 // llrint
    888 
    889 static long long
    890     _TG_ATTRS
    891     __tg_llrint(float __x) {return llrintf(__x);}
    892 
    893 static long long
    894     _TG_ATTRS
    895     __tg_llrint(double __x) {return llrint(__x);}
    896 
    897 static long long
    898     _TG_ATTRS
    899     __tg_llrint(long double __x) {return llrintl(__x);}
    900 
    901 #undef llrint
    902 #define llrint(__x) __tg_llrint(__tg_promote1((__x))(__x))
    903 
    904 // llround
    905 
    906 static long long
    907     _TG_ATTRS
    908     __tg_llround(float __x) {return llroundf(__x);}
    909 
    910 static long long
    911     _TG_ATTRS
    912     __tg_llround(double __x) {return llround(__x);}
    913 
    914 static long long
    915     _TG_ATTRS
    916     __tg_llround(long double __x) {return llroundl(__x);}
    917 
    918 #undef llround
    919 #define llround(__x) __tg_llround(__tg_promote1((__x))(__x))
    920 
    921 // log10
    922 
    923 static float
    924     _TG_ATTRS
    925     __tg_log10(float __x) {return log10f(__x);}
    926 
    927 static double
    928     _TG_ATTRS
    929     __tg_log10(double __x) {return log10(__x);}
    930 
    931 static long double
    932     _TG_ATTRS
    933     __tg_log10(long double __x) {return log10l(__x);}
    934 
    935 #undef log10
    936 #define log10(__x) __tg_log10(__tg_promote1((__x))(__x))
    937 
    938 // log1p
    939 
    940 static float
    941     _TG_ATTRS
    942     __tg_log1p(float __x) {return log1pf(__x);}
    943 
    944 static double
    945     _TG_ATTRS
    946     __tg_log1p(double __x) {return log1p(__x);}
    947 
    948 static long double
    949     _TG_ATTRS
    950     __tg_log1p(long double __x) {return log1pl(__x);}
    951 
    952 #undef log1p
    953 #define log1p(__x) __tg_log1p(__tg_promote1((__x))(__x))
    954 
    955 // log2
    956 
    957 static float
    958     _TG_ATTRS
    959     __tg_log2(float __x) {return log2f(__x);}
    960 
    961 static double
    962     _TG_ATTRS
    963     __tg_log2(double __x) {return log2(__x);}
    964 
    965 static long double
    966     _TG_ATTRS
    967     __tg_log2(long double __x) {return log2l(__x);}
    968 
    969 #undef log2
    970 #define log2(__x) __tg_log2(__tg_promote1((__x))(__x))
    971 
    972 // logb
    973 
    974 static float
    975     _TG_ATTRS
    976     __tg_logb(float __x) {return logbf(__x);}
    977 
    978 static double
    979     _TG_ATTRS
    980     __tg_logb(double __x) {return logb(__x);}
    981 
    982 static long double
    983     _TG_ATTRS
    984     __tg_logb(long double __x) {return logbl(__x);}
    985 
    986 #undef logb
    987 #define logb(__x) __tg_logb(__tg_promote1((__x))(__x))
    988 
    989 // lrint
    990 
    991 static long
    992     _TG_ATTRS
    993     __tg_lrint(float __x) {return lrintf(__x);}
    994 
    995 static long
    996     _TG_ATTRS
    997     __tg_lrint(double __x) {return lrint(__x);}
    998 
    999 static long
   1000     _TG_ATTRS
   1001     __tg_lrint(long double __x) {return lrintl(__x);}
   1002 
   1003 #undef lrint
   1004 #define lrint(__x) __tg_lrint(__tg_promote1((__x))(__x))
   1005 
   1006 // lround
   1007 
   1008 static long
   1009     _TG_ATTRS
   1010     __tg_lround(float __x) {return lroundf(__x);}
   1011 
   1012 static long
   1013     _TG_ATTRS
   1014     __tg_lround(double __x) {return lround(__x);}
   1015 
   1016 static long
   1017     _TG_ATTRS
   1018     __tg_lround(long double __x) {return lroundl(__x);}
   1019 
   1020 #undef lround
   1021 #define lround(__x) __tg_lround(__tg_promote1((__x))(__x))
   1022 
   1023 // nearbyint
   1024 
   1025 static float
   1026     _TG_ATTRS
   1027     __tg_nearbyint(float __x) {return nearbyintf(__x);}
   1028 
   1029 static double
   1030     _TG_ATTRS
   1031     __tg_nearbyint(double __x) {return nearbyint(__x);}
   1032 
   1033 static long double
   1034     _TG_ATTRS
   1035     __tg_nearbyint(long double __x) {return nearbyintl(__x);}
   1036 
   1037 #undef nearbyint
   1038 #define nearbyint(__x) __tg_nearbyint(__tg_promote1((__x))(__x))
   1039 
   1040 // nextafter
   1041 
   1042 static float
   1043     _TG_ATTRS
   1044     __tg_nextafter(float __x, float __y) {return nextafterf(__x, __y);}
   1045 
   1046 static double
   1047     _TG_ATTRS
   1048     __tg_nextafter(double __x, double __y) {return nextafter(__x, __y);}
   1049 
   1050 static long double
   1051     _TG_ATTRS
   1052     __tg_nextafter(long double __x, long double __y) {return nextafterl(__x, __y);}
   1053 
   1054 #undef nextafter
   1055 #define nextafter(__x, __y) __tg_nextafter(__tg_promote2((__x), (__y))(__x), \
   1056                                            __tg_promote2((__x), (__y))(__y))
   1057 
   1058 // nexttoward
   1059 
   1060 static float
   1061     _TG_ATTRS
   1062     __tg_nexttoward(float __x, long double __y) {return nexttowardf(__x, __y);}
   1063 
   1064 static double
   1065     _TG_ATTRS
   1066     __tg_nexttoward(double __x, long double __y) {return nexttoward(__x, __y);}
   1067 
   1068 static long double
   1069     _TG_ATTRS
   1070     __tg_nexttoward(long double __x, long double __y) {return nexttowardl(__x, __y);}
   1071 
   1072 #undef nexttoward
   1073 #define nexttoward(__x, __y) __tg_nexttoward(__tg_promote1((__x))(__x), (__y))
   1074 
   1075 // remainder
   1076 
   1077 static float
   1078     _TG_ATTRS
   1079     __tg_remainder(float __x, float __y) {return remainderf(__x, __y);}
   1080 
   1081 static double
   1082     _TG_ATTRS
   1083     __tg_remainder(double __x, double __y) {return remainder(__x, __y);}
   1084 
   1085 static long double
   1086     _TG_ATTRS
   1087     __tg_remainder(long double __x, long double __y) {return remainderl(__x, __y);}
   1088 
   1089 #undef remainder
   1090 #define remainder(__x, __y) __tg_remainder(__tg_promote2((__x), (__y))(__x), \
   1091                                            __tg_promote2((__x), (__y))(__y))
   1092 
   1093 // remquo
   1094 
   1095 static float
   1096     _TG_ATTRS
   1097     __tg_remquo(float __x, float __y, int* __z)
   1098     {return remquof(__x, __y, __z);}
   1099 
   1100 static double
   1101     _TG_ATTRS
   1102     __tg_remquo(double __x, double __y, int* __z)
   1103     {return remquo(__x, __y, __z);}
   1104 
   1105 static long double
   1106     _TG_ATTRS
   1107     __tg_remquo(long double __x,long double __y, int* __z)
   1108     {return remquol(__x, __y, __z);}
   1109 
   1110 #undef remquo
   1111 #define remquo(__x, __y, __z)                         \
   1112         __tg_remquo(__tg_promote2((__x), (__y))(__x), \
   1113                     __tg_promote2((__x), (__y))(__y), \
   1114                     (__z))
   1115 
   1116 // rint
   1117 
   1118 static float
   1119     _TG_ATTRS
   1120     __tg_rint(float __x) {return rintf(__x);}
   1121 
   1122 static double
   1123     _TG_ATTRS
   1124     __tg_rint(double __x) {return rint(__x);}
   1125 
   1126 static long double
   1127     _TG_ATTRS
   1128     __tg_rint(long double __x) {return rintl(__x);}
   1129 
   1130 #undef rint
   1131 #define rint(__x) __tg_rint(__tg_promote1((__x))(__x))
   1132 
   1133 // round
   1134 
   1135 static float
   1136     _TG_ATTRS
   1137     __tg_round(float __x) {return roundf(__x);}
   1138 
   1139 static double
   1140     _TG_ATTRS
   1141     __tg_round(double __x) {return round(__x);}
   1142 
   1143 static long double
   1144     _TG_ATTRS
   1145     __tg_round(long double __x) {return roundl(__x);}
   1146 
   1147 #undef round
   1148 #define round(__x) __tg_round(__tg_promote1((__x))(__x))
   1149 
   1150 // scalbn
   1151 
   1152 static float
   1153     _TG_ATTRS
   1154     __tg_scalbn(float __x, int __y) {return scalbnf(__x, __y);}
   1155 
   1156 static double
   1157     _TG_ATTRS
   1158     __tg_scalbn(double __x, int __y) {return scalbn(__x, __y);}
   1159 
   1160 static long double
   1161     _TG_ATTRS
   1162     __tg_scalbn(long double __x, int __y) {return scalbnl(__x, __y);}
   1163 
   1164 #undef scalbn
   1165 #define scalbn(__x, __y) __tg_scalbn(__tg_promote1((__x))(__x), __y)
   1166 
   1167 // scalbln
   1168 
   1169 static float
   1170     _TG_ATTRS
   1171     __tg_scalbln(float __x, long __y) {return scalblnf(__x, __y);}
   1172 
   1173 static double
   1174     _TG_ATTRS
   1175     __tg_scalbln(double __x, long __y) {return scalbln(__x, __y);}
   1176 
   1177 static long double
   1178     _TG_ATTRS
   1179     __tg_scalbln(long double __x, long __y) {return scalblnl(__x, __y);}
   1180 
   1181 #undef scalbln
   1182 #define scalbln(__x, __y) __tg_scalbln(__tg_promote1((__x))(__x), __y)
   1183 
   1184 // tgamma
   1185 
   1186 static float
   1187     _TG_ATTRS
   1188     __tg_tgamma(float __x) {return tgammaf(__x);}
   1189 
   1190 static double
   1191     _TG_ATTRS
   1192     __tg_tgamma(double __x) {return tgamma(__x);}
   1193 
   1194 static long double
   1195     _TG_ATTRS
   1196     __tg_tgamma(long double __x) {return tgammal(__x);}
   1197 
   1198 #undef tgamma
   1199 #define tgamma(__x) __tg_tgamma(__tg_promote1((__x))(__x))
   1200 
   1201 // trunc
   1202 
   1203 static float
   1204     _TG_ATTRS
   1205     __tg_trunc(float __x) {return truncf(__x);}
   1206 
   1207 static double
   1208     _TG_ATTRS
   1209     __tg_trunc(double __x) {return trunc(__x);}
   1210 
   1211 static long double
   1212     _TG_ATTRS
   1213     __tg_trunc(long double __x) {return truncl(__x);}
   1214 
   1215 #undef trunc
   1216 #define trunc(__x) __tg_trunc(__tg_promote1((__x))(__x))
   1217 
   1218 // carg
   1219 
   1220 static float
   1221     _TG_ATTRS
   1222     __tg_carg(float __x) {return atan2f(0.F, __x);}
   1223 
   1224 static double
   1225     _TG_ATTRS
   1226     __tg_carg(double __x) {return atan2(0., __x);}
   1227 
   1228 static long double
   1229     _TG_ATTRS
   1230     __tg_carg(long double __x) {return atan2l(0.L, __x);}
   1231 
   1232 static float
   1233     _TG_ATTRS
   1234     __tg_carg(float _Complex __x) {return cargf(__x);}
   1235 
   1236 static double
   1237     _TG_ATTRS
   1238     __tg_carg(double _Complex __x) {return carg(__x);}
   1239 
   1240 static long double
   1241     _TG_ATTRS
   1242     __tg_carg(long double _Complex __x) {return cargl(__x);}
   1243 
   1244 #undef carg
   1245 #define carg(__x) __tg_carg(__tg_promote1((__x))(__x))
   1246 
   1247 // cimag
   1248 
   1249 static float
   1250     _TG_ATTRS
   1251     __tg_cimag(float __x) {return 0;}
   1252 
   1253 static double
   1254     _TG_ATTRS
   1255     __tg_cimag(double __x) {return 0;}
   1256 
   1257 static long double
   1258     _TG_ATTRS
   1259     __tg_cimag(long double __x) {return 0;}
   1260 
   1261 static float
   1262     _TG_ATTRS
   1263     __tg_cimag(float _Complex __x) {return cimagf(__x);}
   1264 
   1265 static double
   1266     _TG_ATTRS
   1267     __tg_cimag(double _Complex __x) {return cimag(__x);}
   1268 
   1269 static long double
   1270     _TG_ATTRS
   1271     __tg_cimag(long double _Complex __x) {return cimagl(__x);}
   1272 
   1273 #undef cimag
   1274 #define cimag(__x) __tg_cimag(__tg_promote1((__x))(__x))
   1275 
   1276 // conj
   1277 
   1278 static float _Complex
   1279     _TG_ATTRS
   1280     __tg_conj(float __x) {return __x;}
   1281 
   1282 static double _Complex
   1283     _TG_ATTRS
   1284     __tg_conj(double __x) {return __x;}
   1285 
   1286 static long double _Complex
   1287     _TG_ATTRS
   1288     __tg_conj(long double __x) {return __x;}
   1289 
   1290 static float _Complex
   1291     _TG_ATTRS
   1292     __tg_conj(float _Complex __x) {return conjf(__x);}
   1293 
   1294 static double _Complex
   1295     _TG_ATTRS
   1296     __tg_conj(double _Complex __x) {return conj(__x);}
   1297 
   1298 static long double _Complex
   1299     _TG_ATTRS
   1300     __tg_conj(long double _Complex __x) {return conjl(__x);}
   1301 
   1302 #undef conj
   1303 #define conj(__x) __tg_conj(__tg_promote1((__x))(__x))
   1304 
   1305 // cproj
   1306 
   1307 static float _Complex
   1308     _TG_ATTRS
   1309     __tg_cproj(float __x) {return cprojf(__x);}
   1310 
   1311 static double _Complex
   1312     _TG_ATTRS
   1313     __tg_cproj(double __x) {return cproj(__x);}
   1314 
   1315 static long double _Complex
   1316     _TG_ATTRS
   1317     __tg_cproj(long double __x) {return cprojl(__x);}
   1318 
   1319 static float _Complex
   1320     _TG_ATTRS
   1321     __tg_cproj(float _Complex __x) {return cprojf(__x);}
   1322 
   1323 static double _Complex
   1324     _TG_ATTRS
   1325     __tg_cproj(double _Complex __x) {return cproj(__x);}
   1326 
   1327 static long double _Complex
   1328     _TG_ATTRS
   1329     __tg_cproj(long double _Complex __x) {return cprojl(__x);}
   1330 
   1331 #undef cproj
   1332 #define cproj(__x) __tg_cproj(__tg_promote1((__x))(__x))
   1333 
   1334 // creal
   1335 
   1336 static float
   1337     _TG_ATTRS
   1338     __tg_creal(float __x) {return __x;}
   1339 
   1340 static double
   1341     _TG_ATTRS
   1342     __tg_creal(double __x) {return __x;}
   1343 
   1344 static long double
   1345     _TG_ATTRS
   1346     __tg_creal(long double __x) {return __x;}
   1347 
   1348 static float
   1349     _TG_ATTRS
   1350     __tg_creal(float _Complex __x) {return crealf(__x);}
   1351 
   1352 static double
   1353     _TG_ATTRS
   1354     __tg_creal(double _Complex __x) {return creal(__x);}
   1355 
   1356 static long double
   1357     _TG_ATTRS
   1358     __tg_creal(long double _Complex __x) {return creall(__x);}
   1359 
   1360 #undef creal
   1361 #define creal(__x) __tg_creal(__tg_promote1((__x))(__x))
   1362 
   1363 #undef _TG_ATTRSp
   1364 #undef _TG_ATTRS
   1365 
   1366 #endif /* __cplusplus */
   1367 #endif /* __has_include_next */
   1368 #endif /* __CLANG_TGMATH_H */