1#ifndef _MATH_H
2
3#ifdef _ISOMAC
4# undef NO_LONG_DOUBLE
5#endif
6
7#include <math/math.h>
8
9#ifndef _ISOMAC
10/* Now define the internal interfaces. */
11extern int __signgam;
12
13# if IS_IN (libc) || IS_IN (libm)
14hidden_proto (__finite)
15hidden_proto (__isinf)
16hidden_proto (__isnan)
17hidden_proto (__finitef)
18hidden_proto (__isinff)
19hidden_proto (__isnanf)
20
21# ifndef __NO_LONG_DOUBLE_MATH
22hidden_proto (__finitel)
23hidden_proto (__isinfl)
24hidden_proto (__isnanl)
25# endif
26
27# if __HAVE_DISTINCT_FLOAT128
28hidden_proto (__finitef128)
29hidden_proto (__isinff128)
30hidden_proto (__isnanf128)
31hidden_proto (__signbitf128)
32# endif
33# endif
34
35libm_hidden_proto (__fpclassify)
36libm_hidden_proto (__fpclassifyf)
37libm_hidden_proto (__issignaling)
38libm_hidden_proto (__issignalingf)
39libm_hidden_proto (__exp)
40libm_hidden_proto (__expf)
41libm_hidden_proto (__roundeven)
42
43# ifndef __NO_LONG_DOUBLE_MATH
44libm_hidden_proto (__fpclassifyl)
45libm_hidden_proto (__issignalingl)
46libm_hidden_proto (__expl)
47libm_hidden_proto (__expm1l)
48# endif
49
50# if __HAVE_DISTINCT_FLOAT128
51libm_hidden_proto (__fpclassifyf128)
52libm_hidden_proto (__issignalingf128)
53libm_hidden_proto (__expf128)
54libm_hidden_proto (__expm1f128)
55# endif
56
57# if __HAVE_DISTINCT_FLOAT128
58
59/* __builtin_isinf_sign is broken in GCC < 7 for float128. */
60# if ! __GNUC_PREREQ (7, 0)
61# include <ieee754_float128.h>
62extern inline int
63__isinff128 (_Float128 x)
64{
65 int64_t hx, lx;
66 GET_FLOAT128_WORDS64 (hx, lx, x);
67 lx |= (hx & 0x7fffffffffffffffLL) ^ 0x7fff000000000000LL;
68 lx |= -lx;
69 return ~(lx >> 63) & (hx >> 62);
70}
71# endif
72
73extern inline _Float128
74fabsf128 (_Float128 x)
75{
76 return __builtin_fabsf128 (x);
77}
78# endif
79
80# if !(defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0)
81# ifndef NO_MATH_REDIRECT
82/* Declare some functions for use within GLIBC. Compilers typically
83 inline those functions as a single instruction. Use an asm to
84 avoid use of PLTs if it doesn't. */
85# define MATH_REDIRECT(FUNC, PREFIX, ARGS) \
86 float (FUNC ## f) (ARGS (float)) asm (PREFIX #FUNC "f"); \
87 double (FUNC) (ARGS (double)) asm (PREFIX #FUNC ); \
88 MATH_REDIRECT_LDBL (FUNC, PREFIX, ARGS) \
89 MATH_REDIRECT_F128 (FUNC, PREFIX, ARGS)
90# ifdef __NO_LONG_DOUBLE_MATH
91# define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS)
92# else
93# define MATH_REDIRECT_LDBL(FUNC, PREFIX, ARGS) \
94 long double (FUNC ## l) (ARGS (long double)) asm (PREFIX #FUNC "l");
95# endif
96# if __HAVE_DISTINCT_FLOAT128
97# define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS) \
98 _Float128 (FUNC ## f128) (ARGS (_Float128)) asm (PREFIX #FUNC "f128");
99# else
100# define MATH_REDIRECT_F128(FUNC, PREFIX, ARGS)
101# endif
102# define MATH_REDIRECT_UNARY_ARGS(TYPE) TYPE
103# define MATH_REDIRECT_BINARY_ARGS(TYPE) TYPE, TYPE
104MATH_REDIRECT (sqrt, "__ieee754_", MATH_REDIRECT_UNARY_ARGS)
105MATH_REDIRECT (ceil, "__", MATH_REDIRECT_UNARY_ARGS)
106MATH_REDIRECT (floor, "__", MATH_REDIRECT_UNARY_ARGS)
107MATH_REDIRECT (rint, "__", MATH_REDIRECT_UNARY_ARGS)
108MATH_REDIRECT (trunc, "__", MATH_REDIRECT_UNARY_ARGS)
109MATH_REDIRECT (round, "__", MATH_REDIRECT_UNARY_ARGS)
110MATH_REDIRECT (copysign, "__", MATH_REDIRECT_BINARY_ARGS)
111# endif
112# endif
113
114#endif
115#endif
116