(root)/
glibc-2.38/
sysdeps/
generic/
math-type-macros.h
       1  /* Helper macros for type generic function implementations within libm.
       2     Copyright (C) 2016-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  #ifndef _MATH_TYPE_MACROS
      20  #define _MATH_TYPE_MACROS
      21  
      22  /* Each type imports a header which is expected to
      23     define:
      24  
      25     M_LIT(x)   - Paste the type specific suffix onto the constant x.
      26     M_MLIT(x)  - Paste the type specific suffix used by the macro
      27  		constants in math.h, i.e M_PI or M_PIl.
      28     M_PFX      - The prefixed used by float.h macros like FLT_MANT_DIG.
      29     M_SUF(x)   - Paste the the type specific suffix used by functions
      30  		i.e expf expl exp.
      31     FLOAT      - Resolves to the C typename of M_TYPE.
      32     CFLOAT     - Resolves to the complex typename of M_TYPE.
      33     M_STRTO_NAN - Resolves to the internal libc function which
      34  		converts a string into the appropriate FLOAT nan
      35  		value.
      36  
      37    declare_mgen_alias(from,to)
      38        This exposes the appropriate symbol(s) for a
      39        function f of type FLOAT.
      40  
      41    declare_mgen_alias_r(from,to)
      42        This exposes the appropriate symbol(s) for a
      43        function f_r of type FLOAT.
      44  
      45    declare_mgen_alias_narrow(from,to)
      46        This exposes the appropriate symbol(s) for narrowing aliases of a
      47        function f of type FLOAT.
      48  
      49    SET_NAN_PAYLOAD(flt, mant)
      50        Set the NaN payload bits of the variable FLT of type FLOAT to
      51        the mantissa MANT.  */
      52  
      53  #ifndef M_PFX
      54  # error "M_PFX must be defined."
      55  #endif
      56  #ifndef M_LIT
      57  # error "M_LIT must be defined."
      58  #endif
      59  #ifndef M_MLIT
      60  # error "M_MLIT must be defined."
      61  #endif
      62  #ifndef M_SUF
      63  # error "M_SUF must be defined."
      64  #endif
      65  #ifndef FLOAT
      66  # error "FLOAT must be defined."
      67  #endif
      68  #ifndef CFLOAT
      69  # error "CFLOAT must be defined."
      70  #endif
      71  #ifndef declare_mgen_alias
      72  # error "declare_mgen_alias must be defined."
      73  #endif
      74  #ifndef declare_mgen_alias_r
      75  # error "declare_mgen_alias_r must be defined."
      76  #endif
      77  #ifndef declare_mgen_alias_narrow
      78  # error "declare_mgen_alias_narrow must be defined."
      79  #endif
      80  #ifndef SET_NAN_PAYLOAD
      81  # error "SET_NAN_PAYLOAD must be defined."
      82  #endif
      83  
      84  #ifndef declare_mgen_finite_alias_x
      85  #define declare_mgen_finite_alias_x(from, to)   \
      86    libm_alias_finite (from, to)
      87  #endif
      88  
      89  #ifndef declare_mgen_finite_alias_s
      90  # define declare_mgen_finite_alias_s(from,to)	\
      91    declare_mgen_finite_alias_x (from, to)
      92  #endif
      93  
      94  #ifndef declare_mgen_finite_alias
      95  # define declare_mgen_finite_alias(from, to)	\
      96    declare_mgen_finite_alias_s (M_SUF (from), M_SUF (to))
      97  #endif
      98  
      99  #define __M_CONCAT(a,b) a ## b
     100  #define __M_CONCATX(a,b) __M_CONCAT(a,b)
     101  
     102  #define M_NAN M_SUF (__builtin_nan) ("")
     103  #define M_MIN_EXP __M_CONCATX (M_PFX, _MIN_EXP)
     104  #define M_MAX_EXP __M_CONCATX (M_PFX, _MAX_EXP)
     105  #define M_MIN __M_CONCATX (M_PFX, _MIN)
     106  #define M_MAX __M_CONCATX (M_PFX, _MAX)
     107  #define M_MANT_DIG __M_CONCATX (M_PFX, _MANT_DIG)
     108  #define M_HUGE_VAL (M_SUF (__builtin_huge_val) ())
     109  
     110  /* Helper macros for commonly used functions.  */
     111  #define M_COPYSIGN M_SUF (copysign)
     112  #define M_FABS M_SUF (fabs)
     113  #define M_SINCOS M_SUF (__sincos)
     114  #define M_SCALBN M_SUF (__scalbn)
     115  #define M_LOG1P M_SUF (__log1p)
     116  
     117  #define M_ATAN2 M_SUF (__ieee754_atan2)
     118  #define M_COSH M_SUF (__ieee754_cosh)
     119  #define M_EXP M_SUF (__ieee754_exp)
     120  #define M_HYPOT M_SUF (__ieee754_hypot)
     121  #define M_LOG M_SUF (__ieee754_log)
     122  #define M_SINH M_SUF (__ieee754_sinh)
     123  #define M_SQRT M_SUF (sqrt)
     124  
     125  /* Needed to evaluate M_MANT_DIG below.  */
     126  #include <float.h>
     127  #include <libm-alias-finite.h>
     128  
     129  /* Use a special epsilon value for IBM long double
     130     to avoid spurious overflows/underflows.  */
     131  #if M_MANT_DIG != 106
     132  # define M_EPSILON __M_CONCATX (M_PFX, _EPSILON)
     133  #else
     134  # define M_EPSILON M_LIT (0x1p-106)
     135  #endif
     136  
     137  /* Enable overloading of function name to assist reuse.  */
     138  #ifndef M_DECL_FUNC
     139  # define M_DECL_FUNC(f) M_SUF (f)
     140  #endif
     141  
     142  #endif /* _MATH_TYPE_MACROS */