math.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #ifndef _MATH_H
  2. #ifdef _ISOMAC
  3. # undef NO_LONG_DOUBLE
  4. #endif
  5. #include <math/math.h>
  6. #ifndef _ISOMAC
  7. /* Now define the internal interfaces. */
  8. extern int __signgam;
  9. # undef __MATHDECLX
  10. # define __MATHDECLX(type, function,suffix, args, attrib) \
  11. __MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
  12. __MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__ (attrib)
  13. # if IS_IN (libc) || IS_IN (libm)
  14. hidden_proto (__finite)
  15. hidden_proto (__isinf)
  16. hidden_proto (__isnan)
  17. hidden_proto (__finitef)
  18. hidden_proto (__isinff)
  19. hidden_proto (__isnanf)
  20. # if !defined __NO_LONG_DOUBLE_MATH \
  21. && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
  22. hidden_proto (__finitel)
  23. hidden_proto (__isinfl)
  24. hidden_proto (__isnanl)
  25. # endif
  26. # if __HAVE_DISTINCT_FLOAT128
  27. hidden_proto (__finitef128)
  28. hidden_proto (__isinff128)
  29. hidden_proto (__isnanf128)
  30. # endif
  31. # endif
  32. libm_hidden_proto (__fpclassify)
  33. libm_hidden_proto (__fpclassifyf)
  34. libm_hidden_proto (__issignaling)
  35. libm_hidden_proto (__issignalingf)
  36. libm_hidden_proto (__exp)
  37. libm_hidden_proto (__expf)
  38. # if !defined __NO_LONG_DOUBLE_MATH \
  39. && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0
  40. libm_hidden_proto (__fpclassifyl)
  41. libm_hidden_proto (__issignalingl)
  42. libm_hidden_proto (__expl)
  43. libm_hidden_proto (__expm1l)
  44. # endif
  45. # if __HAVE_DISTINCT_FLOAT128
  46. libm_hidden_proto (__fpclassifyf128)
  47. libm_hidden_proto (__issignalingf128)
  48. libm_hidden_proto (__expf128)
  49. libm_hidden_proto (__expm1f128)
  50. # endif
  51. #include <stdint.h>
  52. #include <nan-high-order-bit.h>
  53. /* A union which permits us to convert between a float and a 32 bit
  54. int. */
  55. typedef union
  56. {
  57. float value;
  58. uint32_t word;
  59. } ieee_float_shape_type;
  60. /* Get a 32 bit int from a float. */
  61. #ifndef GET_FLOAT_WORD
  62. # define GET_FLOAT_WORD(i,d) \
  63. do { \
  64. ieee_float_shape_type gf_u; \
  65. gf_u.value = (d); \
  66. (i) = gf_u.word; \
  67. } while (0)
  68. #endif
  69. /* Set a float from a 32 bit int. */
  70. #ifndef SET_FLOAT_WORD
  71. # define SET_FLOAT_WORD(d,i) \
  72. do { \
  73. ieee_float_shape_type sf_u; \
  74. sf_u.word = (i); \
  75. (d) = sf_u.value; \
  76. } while (0)
  77. #endif
  78. extern inline int
  79. __issignalingf (float x)
  80. {
  81. uint32_t xi;
  82. GET_FLOAT_WORD (xi, x);
  83. #if HIGH_ORDER_BIT_IS_SET_FOR_SNAN
  84. /* We only have to care about the high-order bit of x's significand, because
  85. having it set (sNaN) already makes the significand different from that
  86. used to designate infinity. */
  87. return (xi & 0x7fc00000) == 0x7fc00000;
  88. #else
  89. /* To keep the following comparison simple, toggle the quiet/signaling bit,
  90. so that it is set for sNaNs. This is inverse to IEEE 754-2008 (as well as
  91. common practice for IEEE 754-1985). */
  92. xi ^= 0x00400000;
  93. /* We have to compare for greater (instead of greater or equal), because x's
  94. significand being all-zero designates infinity not NaN. */
  95. return (xi & 0x7fffffff) > 0x7fc00000;
  96. #endif
  97. }
  98. # if __HAVE_DISTINCT_FLOAT128
  99. # ifdef __USE_EXTERN_INLINES
  100. /* __builtin_isinf_sign is broken in GCC < 7 for float128. */
  101. # if ! __GNUC_PREREQ (7, 0)
  102. # include <ieee754_float128.h>
  103. extern inline int
  104. __isinff128 (_Float128 x)
  105. {
  106. int64_t hx, lx;
  107. GET_FLOAT128_WORDS64 (hx, lx, x);
  108. lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7fff000000000000LL;
  109. lx |= -lx;
  110. return ~(lx >> 63) & (hx >> 62);
  111. }
  112. # endif
  113. extern inline _Float128
  114. fabsf128 (_Float128 x)
  115. {
  116. return __builtin_fabsf128 (x);
  117. }
  118. # else
  119. libm_hidden_proto (fabsf128)
  120. # endif
  121. # endif
  122. /* NB: Internal tests don't have access to internal symbols. */
  123. # if !IS_IN (testsuite_internal) \
  124. && !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
  125. /* NO_MATH_REDIRECT must be defined in the source implementing function,
  126. FUNC, if FUNC is implemented as an alias of __FUNC or vice versa to
  127. avoid redirecting FUNC to __FUNC. */
  128. # include <math-use-builtins.h>
  129. /* NB: Do not redirect math builtin functions when they are inlined. */
  130. # ifndef NO_MATH_REDIRECT
  131. /* Declare some functions for use within GLIBC. Compilers typically
  132. inline those functions as a single instruction. Use an asm to
  133. avoid use of PLTs if it doesn't. */
  134. # define MATH_REDIRECT(FUNC, PREFIX, ARGS) \
  135. float (NO_ ## FUNC ## f ## _BUILTIN) (ARGS (float)) \
  136. asm (PREFIX #FUNC "f"); \
  137. double (NO_ ## FUNC ## _BUILTIN) (ARGS (double)) \
  138. asm (PREFIX #FUNC ); \
  139. MATH_REDIRECT_LDBL (FUNC, PREFIX, ARGS) \
  140. MATH_REDIRECT_F128 (FUNC, PREFIX, ARGS)
  141. # if defined __NO_LONG_DOUBLE_MATH \
  142. || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
  143. # define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS)
  144. # else
  145. # define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS) \
  146. long double (NO_ ## FUNC ## l ## _BUILTIN) (ARGS (long double)) \
  147. asm (PREFIX #FUNC "l");
  148. # endif
  149. # if __HAVE_DISTINCT_FLOAT128
  150. # define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS) \
  151. _Float128 (NO_ ## FUNC ## f128 ## _BUILTIN) (ARGS (_Float128)) \
  152. asm (PREFIX #FUNC "f128");
  153. # else
  154. # define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS)
  155. # endif
  156. # define MATH_REDIRECT_UNARY_ARGS(TYPE) TYPE
  157. # define MATH_REDIRECT_BINARY_ARGS(TYPE) TYPE, TYPE
  158. # define MATH_REDIRECT_TERNARY_ARGS(TYPE) TYPE, TYPE, TYPE
  159. MATH_REDIRECT (sqrt, "__", MATH_REDIRECT_UNARY_ARGS)
  160. MATH_REDIRECT (ceil, "__", MATH_REDIRECT_UNARY_ARGS)
  161. MATH_REDIRECT (floor, "__", MATH_REDIRECT_UNARY_ARGS)
  162. MATH_REDIRECT (roundeven, "__", MATH_REDIRECT_UNARY_ARGS)
  163. MATH_REDIRECT (rint, "__", MATH_REDIRECT_UNARY_ARGS)
  164. MATH_REDIRECT (trunc, "__", MATH_REDIRECT_UNARY_ARGS)
  165. MATH_REDIRECT (round, "__", MATH_REDIRECT_UNARY_ARGS)
  166. MATH_REDIRECT (copysign, "__", MATH_REDIRECT_BINARY_ARGS)
  167. MATH_REDIRECT (fma, "__", MATH_REDIRECT_TERNARY_ARGS)
  168. # endif
  169. # endif
  170. #endif
  171. #endif