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