1 /* vi: set sw=4 ts=4: */
3 * Wrapper functions implementing all the long double math functions
4 * defined by SuSv3 by actually calling the double version of
5 * each function and then casting the result back to a long double
6 * to return to the user.
8 * Copyright (C) 2005 by Erik Andersen <andersen@uclibc.org>
10 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
14 /* Prevent math.h from defining colliding inlines */
15 #undef __USE_EXTERN_INLINES
19 #define STRINGIZE(s) #s
21 #define WRAPPER1(func) \
22 long double func##l(long double x) \
24 return (long double) func((double) x); \
27 #define int_WRAPPER1(func) \
28 int func##l(long double x) \
30 return func((double) x); \
33 #if defined __i386__ && defined __OPTIMIZE__
36 /* gcc 4.3.1 generates really ugly code with redundant pair of store/load:
40 * fldl 0x8(%esp) <-- ??
45 * I can hope newer gcc will eliminate that. However, I don't think
46 * it will be smart enough to reuse argument stack space and use
47 * jump instead of call. Let's do it by hand.
48 * The asm below loads long double x into st(0), then stores it back
49 * to the same location as a double. At this point, stack looks exactly
50 * as "double func(double)" expects it to be.
51 * The return value is returned in st(0) per ABI in both cases (returning
52 * a long double or returning a double). So we can simply jump to func.
53 * Using __GI_func in jump to make optimized intra-library jump.
54 * gcc will still generate a useless "ret" after asm. Oh well...
56 # define WRAPPER1(func) \
57 long double func##l(long double x) \
63 " jmp " STRINGIZE(__GI_##func) "\n" \
69 # define int_WRAPPER1(func) \
70 int func##l(long double x) \
76 " jmp " STRINGIZE(__GI_##func) "\n" \
85 /* Implement the following, as defined by SuSv3 */
87 long double acoshl(long double);
88 long double acosl(long double);
89 long double asinhl(long double);
90 long double asinl(long double);
91 long double atan2l(long double, long double);
92 long double atanhl(long double);
93 long double atanl(long double);
94 long double cargl(long double complex);
95 long double cbrtl(long double);
96 long double ceill(long double);
97 long double copysignl(long double, long double);
98 long double coshl(long double);
99 long double cosl(long double);
100 long double erfcl(long double);
101 long double erfl(long double);
102 long double exp2l(long double);
103 long double expl(long double);
104 long double expm1l(long double);
105 long double fabsl(long double);
106 long double fdiml(long double, long double);
107 long double floorl(long double);
108 long double fmal(long double, long double, long double);
109 long double fmaxl(long double, long double);
110 long double fminl(long double, long double);
111 long double fmodl(long double, long double);
112 long double frexpl(long double value, int *);
113 long double hypotl(long double, long double);
114 int ilogbl(long double);
115 long double ldexpl(long double, int);
116 long double lgammal(long double);
117 long long llrintl(long double);
118 long long llroundl(long double);
119 long double log10l(long double);
120 long double log1pl(long double);
121 long double log2l(long double);
122 long double logbl(long double);
123 long double logl(long double);
124 long lrintl(long double);
125 long lroundl(long double);
126 long double modfl(long double, long double *);
127 long double nearbyintl(long double);
128 long double nextafterl(long double, long double);
129 long double nexttowardl(long double, long double);
130 long double powl(long double, long double);
131 long double remainderl(long double, long double);
132 long double remquol(long double, long double, int *);
133 long double rintl(long double);
134 long double roundl(long double);
135 long double scalblnl(long double, long);
136 long double scalbnl(long double, int);
137 long double sinhl(long double);
138 long double sinl(long double);
139 long double sqrtl(long double);
140 long double tanhl(long double);
141 long double tanl(long double);
142 long double tgammal(long double);
143 long double truncl(long double);
163 long double atan2l (long double x, long double y)
165 return (long double) atan2( (double)x, (double)y );
178 long double cargl (long double complex x)
180 return (long double) carg( (double complex)x );
193 long double copysignl (long double x, long double y)
195 return (long double) copysign( (double)x, (double)y );
232 long double fdiml (long double x, long double y)
234 return (long double) fdim( (double)x, (double)y );
243 long double fmal (long double x, long double y, long double z)
245 return (long double) fma( (double)x, (double)y, (double)z );
250 long double fmaxl (long double x, long double y)
252 return (long double) fmax( (double)x, (double)y );
257 long double fminl (long double x, long double y)
259 return (long double) fmin( (double)x, (double)y );
264 long double fmodl (long double x, long double y)
266 return (long double) fmod( (double)x, (double)y );
271 long double frexpl (long double x, int *exp)
273 return (long double) frexp( (double)x, exp );
278 long double hypotl (long double x, long double y)
280 return (long double) hypot( (double)x, (double)y );
289 long double ldexpl (long double x, int exp)
291 return (long double) ldexp( (double)x, exp );
300 long long llrintl (long double x)
302 return llrint( (double)x );
307 long long llroundl (long double x)
309 return llround( (double)x );
334 long lrintl (long double x)
336 return lrint( (double)x );
341 long lroundl (long double x)
343 return lround( (double)x );
348 long double modfl (long double x, long double *iptr)
351 result = modf ( x, &y );
352 *iptr = (long double)y;
353 return (long double) result;
362 long double nextafterl (long double x, long double y)
364 return (long double) nextafter( (double)x, (double)y );
369 long double nexttowardl (long double x, long double y)
371 return (long double) nexttoward( (double)x, (double)y );
376 long double powl (long double x, long double y)
378 return (long double) pow( (double)x, (double)y );
383 long double remainderl (long double x, long double y)
385 return (long double) remainder( (double)x, (double)y );
390 long double remquol (long double x, long double y, int *quo)
392 return (long double) remquo( (double)x, (double)y, quo );
405 long double scalblnl (long double x, long exp)
407 return (long double) scalbln( (double)x, exp );
412 long double scalbnl (long double x, int exp)
414 return (long double) scalbn( (double)x, exp );
446 #ifdef __DO_C99_MATH__
449 int_WRAPPER1(__fpclassify);
453 int_WRAPPER1(__finite)
457 int_WRAPPER1(__signbit)
461 int_WRAPPER1(__isnan)
462 libm_hidden_def(__isnanl)
466 int_WRAPPER1(__isinf)
467 libm_hidden_def(__isinfl)