(root)/
glibc-2.38/
sysdeps/
ieee754/
float128/
float128_private.h
       1  /* _Float128 overrides for building ldbl-128 as _Float128.
       2     Copyright (C) 2017-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  /* This must be included before the function renames below.  */
      20  #include <gmp.h>
      21  #include <math.h>
      22  #undef HUGE_VALL
      23  #define HUGE_VALL HUGE_VAL_F128
      24  #include <math/mul_splitl.h>
      25  
      26  /* This must be included before the renames of types and macros from
      27     it.  */
      28  #include <ieee754.h>
      29  
      30  /* Renames derived from math_private.h.  */
      31  #include <math_private.h>
      32  #include <fenv_private.h>
      33  #include <ieee754_float128.h>
      34  #define ieee854_long_double_shape_type ieee854_float128_shape_type
      35  #define ieee854_long_double ieee854_float128
      36  
      37  #undef GET_LDOUBLE_LSW64
      38  #undef GET_LDOUBLE_MSW64
      39  #undef GET_LDOUBLE_WORDS64
      40  #undef SET_LDOUBLE_LSW64
      41  #undef SET_LDOUBLE_MSW64
      42  #undef SET_LDOUBLE_WORDS64
      43  #define GET_LDOUBLE_LSW64(x,y) GET_FLOAT128_LSW64 (x, y)
      44  #define GET_LDOUBLE_MSW64(x,y) GET_FLOAT128_MSW64 (x, y)
      45  #define GET_LDOUBLE_WORDS64(x,y,z) GET_FLOAT128_WORDS64 (x, y, z)
      46  #define SET_LDOUBLE_LSW64(x,y) SET_FLOAT128_LSW64 (x, y)
      47  #define SET_LDOUBLE_MSW64(x,y) SET_FLOAT128_MSW64 (x, y)
      48  #define SET_LDOUBLE_WORDS64(x,y,z) SET_FLOAT128_WORDS64 (x, y, z)
      49  
      50  #undef IEEE854_LONG_DOUBLE_BIAS
      51  #define IEEE854_LONG_DOUBLE_BIAS IEEE854_FLOAT128_BIAS
      52  
      53  #ifdef SET_RESTORE_ROUNDF128
      54  # undef SET_RESTORE_ROUNDL
      55  # define SET_RESTORE_ROUNDL(RM) SET_RESTORE_ROUNDF128 (RM)
      56  #endif
      57  
      58  #ifdef libc_feholdexcept_setroundf128
      59  # undef libc_feholdexcept_setroundl
      60  # define libc_feholdexcept_setroundl(ENV, RM)	\
      61    libc_feholdexcept_setroundf128 (ENV, RM)
      62  #endif
      63  
      64  #ifdef libc_feupdateenv_testf128
      65  # undef libc_feupdateenv_testl
      66  # define libc_feupdateenv_testl(ENV, EX) libc_feupdateenv_testf128 (ENV, EX)
      67  #endif
      68  
      69  /* misc macros from the header below.  */
      70  #include <fix-fp-int-convert-overflow.h>
      71  #undef FIX_LDBL_LONG_CONVERT_OVERFLOW
      72  #undef FIX_LDBL_LLONG_CONVERT_OVERFLOW
      73  #define FIX_LDBL_LONG_CONVERT_OVERFLOW FIX_FLT128_LONG_CONVERT_OVERFLOW
      74  #define FIX_LDBL_LLONG_CONVERT_OVERFLOW FIX_FLT128_LLONG_CONVERT_OVERFLOW
      75  
      76  
      77  /* float.h constants.  */
      78  #include <float.h>
      79  #undef LDBL_DIG
      80  #undef LDBL_EPSILON
      81  #undef LDBL_MANT_DIG
      82  #undef LDBL_MAX
      83  #undef LDBL_MAX_10_EXP
      84  #undef LDBL_MAX_EXP
      85  #undef LDBL_MIN
      86  #undef LDBL_MIN_10_EXP
      87  #undef LDBL_MIN_EXP
      88  #undef LDBL_TRUE_MIN
      89  #define LDBL_DIG FLT128_DIG
      90  #define LDBL_EPSILON FLT128_EPSILON
      91  #define LDBL_MANT_DIG FLT128_MANT_DIG
      92  #define LDBL_MAX FLT128_MAX
      93  #define LDBL_MAX_10_EXP FLT128_MAX_10_EXP
      94  #define LDBL_MAX_EXP FLT128_MAX_EXP
      95  #define LDBL_MIN FLT128_MIN
      96  #define LDBL_MIN_10_EXP FLT128_MIN_10_EXP
      97  #define LDBL_MIN_EXP FLT128_MIN_EXP
      98  #define LDBL_TRUE_MIN FLT128_TRUE_MIN
      99  
     100  
     101  /* math.h GNU constants.  */
     102  #undef M_El
     103  #undef M_LOG2El
     104  #undef M_LOG10El
     105  #undef M_LN2l
     106  #undef M_LN10l
     107  #undef M_PIl
     108  #undef M_PI_2l
     109  #undef M_PI_4l
     110  #undef M_1_PIl
     111  #undef M_2_PIl
     112  #undef M_2_SQRTPIl
     113  #undef M_SQRT2l
     114  #undef M_SQRT1_2l
     115  #define M_El M_Ef128
     116  #define M_LOG2El M_LOG2Ef128
     117  #define M_LOG10El M_LOG10Ef128
     118  #define M_LN2l M_LN2f128
     119  #define M_LN10l M_LN10f128
     120  #define M_PIl M_PIf128
     121  #define M_PI_2l M_PI_2f128
     122  #define M_PI_4l M_PI_4f128
     123  #define M_1_PIl M_1_PIf128
     124  #define M_2_PIl M_2_PIf128
     125  #define M_2_SQRTPIl M_2_SQRTPIf128
     126  #define M_SQRT2l M_SQRT2f128
     127  #define M_SQRT1_2l M_SQRT1_2f128
     128  
     129  
     130  #include <libm-alias-ldouble.h>
     131  #include <libm-alias-float128.h>
     132  #undef libm_alias_ldouble_r
     133  #define libm_alias_ldouble_r(from, to, r) libm_alias_float128_r (from, to, r)
     134  
     135  
     136  #include <math/math-narrow.h>
     137  #undef libm_alias_float_ldouble
     138  #define libm_alias_float_ldouble(func) libm_alias_float32_float128 (func)
     139  #undef libm_alias_double_ldouble
     140  #define libm_alias_double_ldouble(func) libm_alias_float64_float128 (func)
     141  #undef libm_alias_ldouble_narrow
     142  #define libm_alias_ldouble_narrow(from, to)	\
     143    libm_alias_float128_narrow (from, to)
     144  
     145  #include <math-use-builtins.h>
     146  #undef USE_NEARBYINTL_BUILTIN
     147  #define USE_NEARBYINTL_BUILTIN USE_NEARBYINTF128_BUILTIN
     148  #undef USE_RINTL_BUILTIN
     149  #define USE_RINTL_BUILTIN USE_RINTF128_BUILTIN
     150  #undef USE_FLOORL_BUILTIN
     151  #define USE_FLOORL_BUILTIN USE_FLOORF128_BUILTIN
     152  #undef USE_CEILL_BUILTIN
     153  #define USE_CEILL_BUILTIN USE_CEILF128_BUILTIN
     154  #undef USE_TRUNCL_BUILTIN
     155  #define USE_TRUNCL_BUILTIN USE_TRUNCF128_BUILTIN
     156  #undef USE_ROUNDL_BUILTIN
     157  #define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN
     158  #undef USE_ROUNDEVENL_BUILTIN
     159  #define USE_ROUNDEVENL_BUILTIN USE_ROUNDEVENF128_BUILTIN
     160  #undef USE_COPYSIGNL_BUILTIN
     161  #define USE_COPYSIGNL_BUILTIN USE_COPYSIGNF128_BUILTIN
     162  #undef USE_FMAL_BUILTIN
     163  #define USE_FMAL_BUILTIN USE_FMAF128_BUILTIN
     164  #undef USE_LRINTL_BUILTIN
     165  #define USE_LRINTL_BUILTIN USE_LRINTF128_BUILTIN
     166  #undef USE_LLRINTL_BUILTIN
     167  #define USE_LLRINTL_BUILTIN USE_LLRINTF128_BUILTIN
     168  #undef USE_LOGBL_BUILTIN
     169  #define USE_LOGBL_BUILTIN USE_LOGBF128_BUILTIN
     170  
     171  /* IEEE function renames.  */
     172  #define __ieee754_acoshl __ieee754_acoshf128
     173  #define __ieee754_acosl __ieee754_acosf128
     174  #define __ieee754_asinhl __ieee754_asinhf128
     175  #define __ieee754_asinl __ieee754_asinf128
     176  #define __ieee754_atan2l __ieee754_atan2f128
     177  #define __ieee754_atanhl __ieee754_atanhf128
     178  #define __ieee754_coshl __ieee754_coshf128
     179  #define __ieee754_cosl __ieee754_cosf128
     180  #define __ieee754_exp10l __ieee754_exp10f128
     181  #define __ieee754_exp2l __ieee754_exp2f128
     182  #define __ieee754_expl __ieee754_expf128
     183  #define __ieee754_fmodl __ieee754_fmodf128
     184  #define __ieee754_gammal_r __ieee754_gammaf128_r
     185  #define __ieee754_hypotl __ieee754_hypotf128
     186  #define __ieee754_ilogbl __ieee754_ilogbf128
     187  #define __ieee754_j0l __ieee754_j0f128
     188  #define __ieee754_j1l __ieee754_j1f128
     189  #define __ieee754_jnl __ieee754_jnf128
     190  #define __ieee754_lgammal_r __ieee754_lgammaf128_r
     191  #define __ieee754_log10l __ieee754_log10f128
     192  #define __ieee754_log2l __ieee754_log2f128
     193  #define __ieee754_logl __ieee754_logf128
     194  #define __ieee754_powl __ieee754_powf128
     195  #define __ieee754_rem_pio2l __ieee754_rem_pio2f128
     196  #define __ieee754_remainderl __ieee754_remainderf128
     197  #define __ieee754_sinhl __ieee754_sinhf128
     198  #define __ieee754_sqrtl __ieee754_sqrtf128
     199  #define __ieee754_y0l __ieee754_y0f128
     200  #define __ieee754_y1l __ieee754_y1f128
     201  #define __ieee754_ynl __ieee754_ynf128
     202  
     203  
     204  /* finite math entry points.  */
     205  #define __acoshl_finite __acoshf128_finite
     206  #define __acosl_finite __acosf128_finite
     207  #define __asinl_finite __asinf128_finite
     208  #define __atan2l_finite __atan2f128_finite
     209  #define __atanhl_finite __atanhf128_finite
     210  #define __coshl_finite __coshf128_finite
     211  #define __cosl_finite __cosf128_finite
     212  #define __exp10l_finite __exp10f128_finite
     213  #define __exp2l_finite __exp2f128_finite
     214  #define __expl_finite __expf128_finite
     215  #define __fmodl_finite __fmodf128_finite
     216  #define __hypotl_finite __hypotf128_finite
     217  #define __ilogbl_finite __ilogbf128_finite
     218  #define __j0l_finite __j0f128_finite
     219  #define __j1l_finite __j1f128_finite
     220  #define __jnl_finite __jnf128_finite
     221  #define __lgammal_r_finite __lgammaf128_r_finite
     222  #define __log10l_finite __log10f128_finite
     223  #define __log2l_finite __log2f128_finite
     224  #define __logl_finite __logf128_finite
     225  #define __powl_finite __powf128_finite
     226  #define __remainderl_finite __remainderf128_finite
     227  #define __sinhl_finite __sinhf128_finite
     228  #define __y0l_finite __y0f128_finite
     229  #define __y1l_finite __y1f128_finite
     230  #define __ynl_finite __ynf128_finite
     231  
     232  
     233  /* internal function names.  */
     234  #define __asinhl __asinhf128
     235  #define __atanl __atanf128
     236  #define __cbrtl __cbrtf128
     237  #define __ceill __ceilf128
     238  #define __copysignl __copysignf128
     239  #define __cosl __cosf128
     240  #define __erfcl __erfcf128
     241  #define __erfl __erff128
     242  #define __expl __expf128
     243  #define __expm1l __expm1f128
     244  #define __fabsl __fabsf128
     245  #define __fdiml __fdimf128
     246  #define __finitel __finitef128
     247  #define __floorl __floorf128
     248  #define __fmal __fmaf128
     249  #define __fmaxl __fmaxf128
     250  #define __fminl __fminf128
     251  #define __fpclassifyl __fpclassifyf128
     252  #define __frexpl __frexpf128
     253  #define __gammal_r_finite __gammaf128_r_finite
     254  #define __getpayloadl __getpayloadf128
     255  #define __isinfl __isinff128
     256  #define __isnanl __isnanf128
     257  #define __issignalingl __issignalingf128
     258  #define __ldexpl __ldexpf128
     259  #define __llrintl __llrintf128
     260  #define __llroundl __llroundf128
     261  #define __log1pl __log1pf128
     262  #define __logbl __logbf128
     263  #define __logl __logf128
     264  #define __lrintl __lrintf128
     265  #define __lroundl __lroundf128
     266  #define __modfl __modff128
     267  #define __nearbyintl __nearbyintf128
     268  #define __nextafterl __nextafterf128
     269  #define __nextdownl __nextdownf128
     270  #define __nextupl __nextupf128
     271  #define __remquol __remquof128
     272  #define __rintl __rintf128
     273  #define __roundevenl __roundevenf128
     274  #define __roundl __roundf128
     275  #define __scalblnl __scalblnf128
     276  #define __scalbnl __scalbnf128
     277  #define __signbitl __signbitf128
     278  #define __sincosl __sincosf128
     279  #define __sinl __sinf128
     280  #define __sqrtl __sqrtf128
     281  #define __tanhl __tanhf128
     282  #define __tanl __tanf128
     283  #define __totalorderl __totalorderf128
     284  #define __totalorder_compatl __totalorder_compatf128
     285  #define __totalordermagl __totalordermagf128
     286  #define __totalordermag_compatl __totalordermag_compatf128
     287  #define __truncl __truncf128
     288  #define __x2y2m1l __x2y2m1f128
     289  
     290  #define __faddl __f32addf128
     291  #define __daddl __f64addf128
     292  #define __fdivl __f32divf128
     293  #define __ddivl __f64divf128
     294  #define __ffmal __f32fmaf128
     295  #define __dfmal __f64fmaf128
     296  #define __fmull __f32mulf128
     297  #define __dmull __f64mulf128
     298  #define __fsqrtl __f32sqrtf128
     299  #define __dsqrtl __f64sqrtf128
     300  #define __fsubl __f32subf128
     301  #define __dsubl __f64subf128
     302  
     303  /* Used on __finite compat alias.  */
     304  #define __acosl __acosf128
     305  #define __acoshl __acoshf128
     306  #define __asinl __asinf128
     307  #define __atan2l __atan2f128
     308  #define __atanhl __atanhf128
     309  #define __coshl __coshf128
     310  #define __exp10l __exp10f128
     311  #define __expl __expf128
     312  #define __fmodl __fmodf128
     313  #define __gammal_r __gammaf128_r
     314  #define __hypotl __hypotf128
     315  #define __j0l __j0f128
     316  #define __j1l __j1f128
     317  #define __jnl __jnf128
     318  #define __lgammal_r __lgammaf128_r
     319  #define __log10l __log10f128
     320  #define __log2l __log2f128
     321  #define __logl __logf128
     322  #define __powl __powf128
     323  #define __remainderl __remainderf128
     324  #define __sinhl __sinhf128
     325  #define __y0l __y0f128
     326  #define __y1l __y1f128
     327  #define __ynl __ynf128
     328  
     329  /* __nexttowardf128 is not _Float128 API. */
     330  #define __nexttowardl __nexttowardf128_do_not_use
     331  #define nexttowardl nexttowardf128_do_not_use
     332  
     333  
     334  /* public entry points.  */
     335  #define asinhl asinhf128
     336  #define atanl atanf128
     337  #define cbrtl cbrtf128
     338  #define ceill ceilf128
     339  #define copysignl copysignf128
     340  #define cosl cosf128
     341  #define erfcl erfcf128
     342  #define erfl erff128
     343  #define expl expf128
     344  #define expm1l expm1f128
     345  #define fabsl fabsf128
     346  #define fdiml fdimf128
     347  #define finitel finitef128_do_not_use
     348  #define floorl floorf128
     349  #define fmal fmaf128
     350  #define fmaxl fmaxf128
     351  #define fminl fminf128
     352  #define frexpl frexpf128
     353  #define getpayloadl getpayloadf128
     354  #define isinfl isinff128_do_not_use
     355  #define isnanl isnanf128_do_not_use
     356  #define ldexpl ldexpf128
     357  #define llrintl llrintf128
     358  #define llroundl llroundf128
     359  #define log1pl log1pf128
     360  #define logbl logbf128
     361  #define logl logf128
     362  #define lrintl lrintf128
     363  #define lroundl lroundf128
     364  #define modfl modff128
     365  #define nanl nanf128
     366  #define nearbyintl nearbyintf128
     367  #define nextafterl nextafterf128
     368  #define nextdownl nextdownf128
     369  #define nextupl nextupf128
     370  #define remquol remquof128
     371  #define rintl rintf128
     372  #define roundevenl roundevenf128
     373  #define roundl roundf128
     374  #define scalbnl scalbnf128
     375  #define sincosl sincosf128
     376  #define sinl sinf128
     377  #define sqrtl sqrtf128
     378  #define tanhl tanhf128
     379  #define tanl tanf128
     380  #define totalorderl totalorderf128
     381  #define totalordermagl totalordermagf128
     382  #define truncl truncf128
     383  
     384  
     385  /* misc internal renames.  */
     386  #define __builtin_fmal __builtin_fmaf128
     387  #define __expl_table __expf128_table
     388  #define __gamma_productl __gamma_productf128
     389  #define __kernel_cosl __kernel_cosf128
     390  #define __kernel_rem_pio2l __kernel_rem_pio2f128
     391  #define __kernel_sincosl __kernel_sincosf128
     392  #define __kernel_sinl __kernel_sinf128
     393  #define __kernel_tanl __kernel_tanf128
     394  #define __lgamma_negl __lgamma_negf128
     395  #define __lgamma_productl __lgamma_productf128
     396  #define __mpn_extract_long_double __mpn_extract_float128
     397  #define __sincosl_table __sincosf128_table
     398  #define mul_splitl mul_splitf128
     399  
     400  /* Builtin renames.  */
     401  #define __builtin_copysignl __builtin_copysignf128
     402  #define __builtin_signbitl __builtin_signbit
     403  #define __builtin_nearbyintl __builtin_nearbyintf128
     404  #define __builtin_rintl __builtin_rintf128
     405  #define __builtin_floorl __builtin_floorf128
     406  #define __builtin_ceill __builtin_ceilf128
     407  #define __builtin_truncl __builtin_truncf128
     408  #define __builtin_roundl __builtin_roundf128
     409  #define __builtin_roundevenl __builtin_roundevenf128
     410  #define __builtin_lrintl __builtin_lrintf128
     411  #define __builtin_llrintl __builtin_llrintf128
     412  #define __builtin_copysignl __builtin_copysignf128
     413  #define __builtin_fabsl __builtin_fabsf128
     414  
     415  /* Get the constant suffix from bits/floatn-compat.h.  */
     416  #define L(x) __f128 (x)
     417  
     418  static inline void
     419  mul_splitf128 (_Float128 *hi, _Float128 *lo, _Float128 x, _Float128 y)
     420  {
     421  #ifdef __FP_FAST_FMAF128
     422    /* Fast built-in fused multiply-add.  */
     423    *hi = x * y;
     424    *lo = __builtin_fmal (x, y, -*hi);
     425  #else
     426    /* Apply Dekker's algorithm.  */
     427    *hi = x * y;
     428  # define C ((1LL << (FLT128_MANT_DIG + 1) / 2) + 1)
     429    _Float128 x1 = x * C;
     430    _Float128 y1 = y * C;
     431  # undef C
     432    x1 = (x - x1) + x1;
     433    y1 = (y - y1) + y1;
     434    _Float128 x2 = x - x1;
     435    _Float128 y2 = y - y1;
     436    *lo = (((x1 * y1 - *hi) + x1 * y2) + x2 * y1) + x2 * y2;
     437  #endif
     438  }