{ \
return (long double) func((double) x); \
}
+#define WRAPPER2(func) \
+long double func##l(long double x, long double y) \
+{ \
+ return (long double) func((double) x, (double) y); \
+}
#define int_WRAPPER1(func) \
int func##l(long double x) \
{ \
return func((double) x); \
}
-#if defined __i386__ && defined __OPTIMIZE__
-# undef WRAPPER1
-# undef int_WRAPPER1
-# undef long_WRAPPER1
-# undef long_long_WRAPPER1
-/* gcc 4.3.1 generates really ugly code with redundant pair of store/load:
- * sub $0x10,%esp
- * fldt 0x14(%esp)
- * fstpl 0x8(%esp)
- * fldl 0x8(%esp) <-- ??
- * fstpl (%esp) <-- ??
- * call function
- * add $0x10,%esp
- * ret
- * I can hope newer gcc will eliminate that. However, I don't think
- * it will be smart enough to reuse argument stack space and use
- * jump instead of call. Let's do it by hand.
- * The asm below loads long double x into st(0), then stores it back
- * to the same location, but as a double. At this point, stack looks
- * exactly as "double func(double)" expects it to be.
- * The return value is returned in st(0) per ABI in both cases (returning
- * a long double or returning a double). So we can simply jump to func.
- * Using __GI_func in jump to make optimized intra-library jump.
- * gcc will still generate a useless "ret" after asm. Oh well...
- */
-# define WRAPPER1(func) \
-long double func##l(long double x) \
-{ \
- long double st_top; \
- __asm ( \
- " fldt %1\n" \
- " fstpl %1\n" \
- " jmp " __stringify(__GI_##func) "\n" \
- : "=t" (st_top) \
- : "m" (x) \
- ); \
- return st_top; \
-}
-# define int_WRAPPER1(func) \
-int func##l(long double x) \
-{ \
- int ret; \
- __asm ( \
- " fldt %1\n" \
- " fstpl %1\n" \
- " jmp " __stringify(__GI_##func) "\n" \
- : "=a" (ret) \
- : "m" (x) \
- ); \
- return ret; \
-}
-# define long_WRAPPER1(func) \
-long func##l(long double x) \
-{ \
- long ret; \
- __asm ( \
- " fldt %1\n" \
- " fstpl %1\n" \
- " jmp " __stringify(__GI_##func) "\n" \
- : "=a" (ret) \
- : "m" (x) \
- ); \
- return ret; \
-}
-# define long_long_WRAPPER1(func) \
-long long func##l(long double x) \
-{ \
- long long ret; \
- __asm ( \
- " fldt %1\n" \
- " fstpl %1\n" \
- " jmp " __stringify(__GI_##func) "\n" \
- : "=A" (ret) \
- : "m" (x) \
- ); \
- return ret; \
-}
-#endif /* __i386__ && __OPTIMIZE__ */
-
+#ifndef __DO_XSI_MATH__
+# undef L_j0l /* long double j0l(long double x); */
+# undef L_j1l /* long double j1l(long double x); */
+# undef L_jnl /* long double jnl(int n, long double x); */
+# undef L_y0l /* long double y0l(long double x); */
+# undef L_y1l /* long double y1l(long double x); */
+# undef L_ynl /* long double ynl(int n, long double x); */
+#endif
/* Implement the following, as defined by SuSv3 */
#if 0
#endif
#ifdef L_atan2l
-long double atan2l (long double x, long double y)
-{
- return (long double) atan2( (double)x, (double)y );
-}
+WRAPPER2(atan2)
#endif
#ifdef L_atanhl
#endif
#ifdef L_copysignl
-long double copysignl (long double x, long double y)
-{
- return (long double) copysign( (double)x, (double)y );
-}
+WRAPPER2(copysign)
#endif
#ifdef L_coshl
#ifdef L_cosl
WRAPPER1(cos)
+libm_hidden_def(cosl)
#endif
#ifdef L_erfcl
#ifdef L_expl
WRAPPER1(exp)
+libm_hidden_def(expl)
#endif
#ifdef L_expm1l
#endif
#ifdef L_fdiml
-long double fdiml (long double x, long double y)
-{
- return (long double) fdim( (double)x, (double)y );
-}
+WRAPPER2(fdim)
#endif
#ifdef L_floorl
#endif
#ifdef L_fmaxl
-long double fmaxl (long double x, long double y)
-{
- return (long double) fmax( (double)x, (double)y );
-}
+WRAPPER2(fmax)
#endif
#ifdef L_fminl
-long double fminl (long double x, long double y)
-{
- return (long double) fmin( (double)x, (double)y );
-}
+WRAPPER2(fmin)
#endif
#ifdef L_fmodl
-long double fmodl (long double x, long double y)
-{
- return (long double) fmod( (double)x, (double)y );
-}
+WRAPPER2(fmod)
#endif
#ifdef L_frexpl
-long double frexpl (long double x, int *exp)
+long double frexpl (long double x, int *ex)
{
- return (long double) frexp( (double)x, exp );
+ return (long double) frexp( (double)x, ex );
}
#endif
#ifdef L_gammal
-/* WRAPPER1(gamma) won't work, tries to call __GI_xxx,
- * and gamma() hasn't got one. */
-long double gammal(long double x)
-{
- return (long double) gamma((double) x);
-}
+WRAPPER1(gamma)
#endif
#ifdef L_hypotl
-long double hypotl (long double x, long double y)
-{
- return (long double) hypot( (double)x, (double)y );
-}
+WRAPPER2(hypot)
+libm_hidden_def(hypotl)
#endif
#ifdef L_ilogbl
int_WRAPPER1(ilogb)
#endif
+#ifdef L_j0l
+ WRAPPER1(j0)
+#endif
+
+#ifdef L_j1l
+ WRAPPER1(j1)
+#endif
+
+#ifdef L_jnl
+long double jnl(int n, long double x)
+{
+ return (long double) jn(n, (double)x);
+}
+#endif
+
#ifdef L_ldexpl
-long double ldexpl (long double x, int exp)
+long double ldexpl (long double x, int ex)
{
- return (long double) ldexp( (double)x, exp );
+ return (long double) ldexp( (double)x, ex );
}
#endif
#endif
#ifdef L_log2l
-/* WRAPPER1(log2) won't work */
-long double log2l(long double x)
-{
- return (long double) log2((double)x);
-}
+WRAPPER1(log2)
#endif
#ifdef L_logbl
#endif
#ifdef L_nextafterl
-long double nextafterl (long double x, long double y)
-{
- return (long double) nextafter( (double)x, (double)y );
-}
+WRAPPER2(nextafter)
+libm_hidden_def(nextafterl)
#endif
-/* Disabled in Makefile.in */
-#if 0 /* def L_nexttowardl */
-long double nexttowardl (long double x, long double y)
+#ifdef L_nexttowardl
+# if 0 /* TODO */
+strong_alias(nextafterl, nexttowardl)
+# else
+long double nexttowardl(long double x, long double y)
{
- return (long double) nexttoward( (double)x, (double)y );
+ return nextafterl(x, y);
}
-libm_hidden_def(nexttowardl)
+#endif
#endif
#ifdef L_powl
-long double powl (long double x, long double y)
-{
- return (long double) pow( (double)x, (double)y );
-}
+WRAPPER2(pow)
#endif
#ifdef L_remainderl
-long double remainderl (long double x, long double y)
-{
- return (long double) remainder( (double)x, (double)y );
-}
+WRAPPER2(remainder)
#endif
#ifdef L_remquol
#endif
#ifdef L_scalblnl
-long double scalblnl (long double x, long exp)
+long double scalblnl (long double x, long ex)
{
- return (long double) scalbln( (double)x, exp );
+ return (long double) scalbln( (double)x, ex );
}
#endif
#ifdef L_scalbnl
-long double scalbnl (long double x, int exp)
+long double scalbnl (long double x, int ex)
{
- return (long double) scalbn( (double)x, exp );
+ return (long double) scalbn( (double)x, ex );
}
#endif
#ifdef L_sinl
WRAPPER1(sin)
+libm_hidden_def(sinl)
#endif
#ifdef L_sqrtl
#endif
#ifdef L_significandl
-/* WRAPPER1(significand) won't work, tries to call __GI_xxx,
- * and significand() hasn't got one. */
-long double significandl(long double x)
+WRAPPER1(significand)
+#endif
+
+#ifdef L_y0l
+WRAPPER1(y0)
+#endif
+
+#ifdef L_y1l
+WRAPPER1(y1)
+#endif
+
+#ifdef L_ynl
+long double ynl(int n, long double x)
{
- return (long double) significand((double) x);
+ return (long double) yn(n, (double)x);
}
#endif
-#ifdef __DO_C99_MATH__
-#ifdef L___fpclassifyl
+#if defined __DO_C99_MATH__ && !defined __NO_LONG_DOUBLE_MATH
+
+# ifdef L___fpclassifyl
int_WRAPPER1(__fpclassify)
libm_hidden_def(__fpclassifyl)
-#endif
+# endif
-#ifdef L___finitel
+# ifdef L___finitel
int_WRAPPER1(__finite)
libm_hidden_def(__finitel)
-#endif
+# endif
-#ifdef L___signbitl
+# ifdef L___signbitl
int_WRAPPER1(__signbit)
libm_hidden_def(__signbitl)
-#endif
+# endif
-#ifdef L___isnanl
+# ifdef L___isnanl
int_WRAPPER1(__isnan)
libm_hidden_def(__isnanl)
-#endif
+# endif
-#ifdef L___isinfl
+# ifdef L___isinfl
int_WRAPPER1(__isinf)
libm_hidden_def(__isinfl)
-#endif
+# endif
#endif