From 6c4538905e65ceb203f59aaa9a61728e81c6bc0a Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Wed, 18 Mar 2015 21:32:22 +0000 Subject: libm: Add missing C99 float/ld wrappers Signed-off-by: Bernhard Reutner-Fischer Status: upstream [uClibc] http://git.uclibc.org/uClibc/commit/?id=6c4538905e65ceb203f59aaa9a61728e81c6bc0a Removed patch for ./TODO. Needed to avoid run-time errors with mesa3d which depends on fminf Signed-off-by: Bernd Kuhls --- diff --git a/include/complex.h b/include/complex.h index 91efc0d..ed7e502 100644 --- a/include/complex.h +++ b/include/complex.h @@ -79,6 +79,7 @@ __BEGIN_DECLS #endif #include #undef _Mdouble_ +#undef _Mfloat_ #undef __MATH_PRECNAME /* And the long double versions. It is non-critical to define them @@ -97,6 +98,7 @@ __BEGIN_DECLS # include #endif #undef _Mdouble_ +#undef _Mlong_double_ #undef __MATH_PRECNAME #undef __MATHDECL_1 #undef __MATHDECL diff --git a/include/math.h b/include/math.h index ecb9aa6..1b54c9e 100644 --- a/include/math.h +++ b/include/math.h @@ -129,6 +129,7 @@ __BEGIN_DECLS # undef _Mdouble_ # undef _Mdouble_BEGIN_NAMESPACE # undef _Mdouble_END_NAMESPACE +# undef _Mfloat_ # undef __MATH_PRECNAME # undef __MATH_maybe_libm_hidden_proto @@ -176,6 +177,7 @@ extern long double __REDIRECT_NTH (nexttowardl, (long double __x, long double __ # undef _Mdouble_ # undef _Mdouble_BEGIN_NAMESPACE # undef _Mdouble_END_NAMESPACE +# undef _Mlong_double_ # undef __MATH_PRECNAME # undef __MATH_maybe_libm_hidden_proto diff --git a/libc/sysdeps/linux/common/bits/mathcalls.h b/libc/sysdeps/linux/common/bits/mathcalls.h index 84b793c..9bebb51 100644 --- a/libc/sysdeps/linux/common/bits/mathcalls.h +++ b/libc/sysdeps/linux/common/bits/mathcalls.h @@ -74,8 +74,22 @@ __MATHCALLI (atan2,, (_Mdouble_ __y, _Mdouble_ __x)) /* Cosine of X. */ __MATHCALLI (cos,, (_Mdouble_ __x)) +# if defined _LIBC && defined _Mlong_double_ +libm_hidden_proto(cosl) +# endif +# if defined _LIBC && defined _Mfloat_ +libm_hidden_proto(cosf) +# endif + /* Sine of X. */ __MATHCALLI (sin,, (_Mdouble_ __x)) +# if defined _LIBC && defined _Mlong_double_ +libm_hidden_proto(sinl) +# endif +# if defined _LIBC && defined _Mfloat_ +libm_hidden_proto(sinf) +# endif + /* Tangent of X. */ __MATHCALLI (tan,, (_Mdouble_ __x)) @@ -111,6 +125,9 @@ __END_NAMESPACE_C99 _Mdouble_BEGIN_NAMESPACE /* Exponential function of X. */ __MATHCALLI (exp,, (_Mdouble_ __x)) +# if defined _LIBC && defined _Mlong_double_ +libm_hidden_proto(expl) +# endif /* Break VALUE into a normalized fraction and an integral power of 2. */ __MATHCALLI (frexp,, (_Mdouble_ __x, int *__exponent)) @@ -173,6 +190,9 @@ _Mdouble_END_NAMESPACE __BEGIN_NAMESPACE_C99 /* Return `sqrt(X*X + Y*Y)'. */ __MATHCALLI (hypot,, (_Mdouble_ __x, _Mdouble_ __y)) +# if defined _LIBC && defined _Mlong_double_ +libm_hidden_proto(hypotl) +# endif __END_NAMESPACE_C99 #endif @@ -298,6 +318,9 @@ __MATHCALLI (rint,, (_Mdouble_ __x)) /* Return X + epsilon if X < Y, X - epsilon if X > Y. */ __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)) +# if defined _LIBC && defined _Mlong_double_ +libm_hidden_proto(nextafterl) +# endif # if defined __USE_ISOC99 && !defined __LDBL_COMPAT __MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__)) # endif diff --git a/libm/Makefile.in b/libm/Makefile.in index 7511706..d886cdb 100644 --- a/libm/Makefile.in +++ b/libm/Makefile.in @@ -75,9 +75,6 @@ libm_CSRC := \ s_remquo.c w_exp2.c \ cexp.c sincos.c -# Not implemented [yet?], see comment in float_wrappers.c: -# fdimf.o fmaf.o fmaxf.o fminf.o -# nearbyintf.o remquof.o scalblnf.o tgammaf.o FL_MOBJ := \ acosf.o \ acoshf.o \ @@ -98,7 +95,11 @@ FL_MOBJ := \ expf.o \ expm1f.o \ fabsf.o \ + fdimf.o \ floorf.o \ + fmaf.o \ + fmaxf.o \ + fminf.o \ fmodf.o \ frexpf.o \ gammaf.o \ @@ -116,11 +117,14 @@ FL_MOBJ := \ lrintf.o \ lroundf.o \ modff.o \ + nearbyintf.o \ + nexttowardf.o \ powf.o \ remainderf.o \ + remquof.o \ rintf.o \ roundf.o \ - scalbf.o \ + scalblnf.o \ scalbnf.o \ significandf.o \ sinf.o \ @@ -128,9 +132,24 @@ FL_MOBJ := \ sqrtf.o \ tanf.o \ tanhf.o \ + tgammaf.o \ truncf.o \ -# Not implemented [yet?]: nexttowardl.o +ifeq ($(UCLIBC_SUSV3_LEGACY),y) +FL_MOBJ += scalbf.o +endif + +# Do not (yet?) implement the float variants of bessel functions +ifeq (not-yet-implemented-$(DO_XSI_MATH),y) +FL_MOBJ += \ + j0f.o \ + j1f.o \ + jnf.o \ + y0f.o \ + y1f.o \ + ynf.o +endif + LD_MOBJ := \ __finitel.o \ __fpclassifyl.o \ @@ -180,6 +199,7 @@ LD_MOBJ := \ modfl.o \ nearbyintl.o \ nextafterl.o \ + nexttowardl.o \ powl.o \ remainderl.o \ remquol.o \ @@ -196,6 +216,17 @@ LD_MOBJ := \ tgammal.o \ truncl.o \ +# Do not (yet?) implement the long double variants of bessel functions +ifeq (not-yet-implemented-$(DO_XSI_MATH),y) +LD_MOBJ += \ + j0l.o \ + j1l.o \ + jnl.o \ + y0l.o \ + y1l.o \ + ynl.o +endif + else # This list of math functions was taken from POSIX/IEEE 1003.1b-1993 diff --git a/libm/float_wrappers.c b/libm/float_wrappers.c index 82b7963..105486e 100644 --- a/libm/float_wrappers.c +++ b/libm/float_wrappers.c @@ -38,19 +38,14 @@ long long func##f (float x) \ return func((double)x); \ } - -/* For the time being, do _NOT_ implement these functions - * that are defined by SuSv3 [because we don't need them - * and nobody asked to include them] */ -#undef L_fdimf /*float fdimf(float, float);*/ -#undef L_fmaf /*float fmaf(float, float, float);*/ -#undef L_fmaxf /*float fmaxf(float, float);*/ -#undef L_fminf /*float fminf(float, float);*/ -#undef L_nearbyintf /*float nearbyintf(float);*/ -#undef L_nexttowardf /*float nexttowardf(float, long double);*/ -#undef L_remquof /*float remquof(float, float, int *);*/ -#undef L_scalblnf /*float scalblnf(float, long);*/ -#undef L_tgammaf /*float tgammaf(float);*/ +#ifndef __DO_XSI_MATH__ +# undef L_j0f /* float j0f(float x); */ +# undef L_j1f /* float j1f(float x); */ +# undef L_jnf /* float jnf(int n, float x); */ +# undef L_y0f /* float y0f(float x); */ +# undef L_y1f /* float y1f(float x); */ +# undef L_ynf /* float ynf(int n, float x); */ +#endif /* Implement the following, as defined by SuSv3 */ #if 0 @@ -155,6 +150,7 @@ float copysignf (float x, float y) #ifdef L_cosf WRAPPER1(cos) +libm_hidden_def(cosf) #endif #ifdef L_coshf @@ -242,6 +238,21 @@ float hypotf (float x, float y) int_WRAPPER1(ilogb) #endif +#ifdef L_j0f +WRAPPER1(j0) +#endif + +#ifdef L_j1f +WRAPPER1(j1) +#endif + +#ifdef L_jnf +float jnf(int n, float x) +{ + return (float) jn(n, (double)x); +} +#endif + #ifdef L_ldexpf float ldexpf (float x, int _exp) { @@ -306,7 +317,7 @@ WRAPPER1(nearbyint) #ifdef L_nexttowardf float nexttowardf (float x, long double y) { - return (float) nexttoward( (double)x, (double)y ); + return (float) nexttoward( (double)x, (long double)y ); } #endif @@ -355,6 +366,7 @@ float scalbnf (float x, int _exp) #ifdef L_sinf WRAPPER1(sin) +libm_hidden_def(sinf) #endif #ifdef L_sinhf @@ -381,13 +393,6 @@ WRAPPER1(tgamma) WRAPPER1(trunc) #endif -#ifdef L_fmaf -float fmaf (float x, float y, float z) -{ - return (float) fma( (double)x, (double)y, (double)z ); -} -#endif - #if defined L_scalbf && defined __UCLIBC_SUSV3_LEGACY__ float scalbf (float x, float y) { @@ -402,3 +407,18 @@ WRAPPER1(gamma) #ifdef L_significandf WRAPPER1(significand) #endif + +#ifdef L_y0f +WRAPPER1(y0) +#endif + +#ifdef L_y1f +WRAPPER1(y1) +#endif + +#ifdef L_ynf +float ynf(int n, float x) +{ + return (float) yn(n, (double)x); +} +#endif diff --git a/libm/ldouble_wrappers.c b/libm/ldouble_wrappers.c index 118a78f..b4215cb 100644 --- a/libm/ldouble_wrappers.c +++ b/libm/ldouble_wrappers.c @@ -42,6 +42,15 @@ long long func##l(long double x) \ return func((double) x); \ } +#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 long double acoshl(long double); @@ -156,6 +165,7 @@ WRAPPER1(cosh) #ifdef L_cosl WRAPPER1(cos) +libm_hidden_def(cosl) #endif #ifdef L_erfcl @@ -172,6 +182,7 @@ WRAPPER1(exp2) #ifdef L_expl WRAPPER1(exp) +libm_hidden_def(expl) #endif #ifdef L_expm1l @@ -222,12 +233,28 @@ WRAPPER1(gamma) #ifdef L_hypotl 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 ex) { @@ -291,12 +318,18 @@ WRAPPER1(nearbyint) #ifdef L_nextafterl WRAPPER2(nextafter) +libm_hidden_def(nextafterl) #endif -/* Disabled in Makefile.in */ -#if 0 /* def L_nexttowardl */ -WRAPPER2(nexttoward) -libm_hidden_def(nexttowardl) +#ifdef L_nexttowardl +# if 0 /* TODO */ +strong_alias(nextafterl, nexttowardl) +# else +long double nexttowardl(long double x, long double y) +{ + return nextafterl(x, y); +} +#endif #endif #ifdef L_powl @@ -344,6 +377,7 @@ WRAPPER1(sinh) #ifdef L_sinl WRAPPER1(sin) +libm_hidden_def(sinl) #endif #ifdef L_sqrtl @@ -370,6 +404,22 @@ WRAPPER1(trunc) 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) yn(n, (double)x); +} +#endif + + #if defined __DO_C99_MATH__ && !defined __NO_LONG_DOUBLE_MATH # ifdef L___fpclassifyl diff --git a/libm/s_fdim.c b/libm/s_fdim.c index 6249219..6ed695c 100644 --- a/libm/s_fdim.c +++ b/libm/s_fdim.c @@ -6,13 +6,22 @@ #include "math.h" #include "math_private.h" +#include double fdim(double x, double y) { - int c = __fpclassify(x); - if (c == FP_NAN || c == FP_INFINITE) - return HUGE_VAL; + int cx = __fpclassify(x); /* need both NAN and INF */ + int cy = __fpclassify(y); /* need both NAN and INF */ + if (cx == FP_NAN || cy == NAN) + return x - y; - return x > y ? x - y : 0.0; + if (x <= y) + return .0; + + double z = x - y; + if (isinf(z) && cx != FP_INFINITE && cy != FP_INFINITE) + __set_errno(ERANGE); + + return z; } libm_hidden_def(fdim) diff --git a/libm/s_fmax.c b/libm/s_fmax.c index 21dfaa9..5f29ad8 100644 --- a/libm/s_fmax.c +++ b/libm/s_fmax.c @@ -9,10 +9,10 @@ double fmax(double x, double y) { - if (__fpclassify(x) == FP_NAN) - return x; - if (__fpclassify(y) == FP_NAN) + if (isnan(x)) return y; + if (isnan(y)) + return x; return x > y ? x : y; } diff --git a/libm/s_fmin.c b/libm/s_fmin.c index 674d9a5..a549678 100644 --- a/libm/s_fmin.c +++ b/libm/s_fmin.c @@ -9,10 +9,10 @@ double fmin(double x, double y) { - if (__fpclassify(x) == FP_NAN) - return x; - if (__fpclassify(y) == FP_NAN) + if (isnan(x)) return y; + if (isnan(y)) + return x; return x < y ? x : y; } diff --git a/libm/s_nextafter.c b/libm/s_nextafter.c index ee4621c..73a8ab2 100644 --- a/libm/s_nextafter.c +++ b/libm/s_nextafter.c @@ -32,7 +32,7 @@ double nextafter(double x, double y) if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) /* y is nan */ return x+y; - if(x==y) return x; /* x=y, return x */ + if(x==y) return y; /* x=y, return y */ if((ix|lx)==0) { /* x == 0 */ INSERT_WORDS(x,hy&0x80000000,1); /* return +-minsubnormal */ y = x*x; @@ -68,3 +68,5 @@ double nextafter(double x, double y) return x; } libm_hidden_def(nextafter) +strong_alias_untyped(nextafter, nexttoward) +libm_hidden_def(nexttoward) diff --git a/test/math/compile_test.c b/test/math/compile_test.c index ab8c40c..aedfde6 100644 --- a/test/math/compile_test.c +++ b/test/math/compile_test.c @@ -22,11 +22,11 @@ r += exp2f(float_x); r += expf(float_x); r += expm1f(float_x); r += fabsf(float_x); -/*r += fdimf(float_x, float_x); - uclibc does not have it (yet?) */ +r += fdimf(float_x, float_x); r += floorf(float_x); -/*r += fmaf(float_x, float_x, float_x); - uclibc does not have it (yet?) */ -/*r += fmaxf(float_x, float_x); - uclibc does not have it (yet?) */ -/*r += fminf(float_x, float_x); - uclibc does not have it (yet?) */ +r += fmaf(float_x, float_x, float_x); +r += fmaxf(float_x, float_x); +r += fminf(float_x, float_x); r += fmodf(float_x, float_x); r += frexpf(float_x, &int_x); r += gammaf(float_x); @@ -44,17 +44,17 @@ r += logf(float_x); r += lrintf(float_x); r += lroundf(float_x); r += modff(float_x, &float_x); -/*r += nearbyintf(float_x); - uclibc does not have it (yet?) */ -/*r += nexttowardf(float_x, long_double_x); - uclibc does not have it (yet?) */ +r += nearbyintf(float_x); +r += nexttowardf(float_x, long_double_x); r += powf(float_x, float_x); r += remainderf(float_x, float_x); -/*r += remquof(float_x, float_x, &int_x); - uclibc does not have it (yet?) */ +r += remquof(float_x, float_x, &int_x); r += rintf(float_x); r += roundf(float_x); #ifdef __UCLIBC_SUSV3_LEGACY__ r += scalbf(float_x, float_x); #endif -/*r += scalblnf(float_x, long_x); - uclibc does not have it (yet?) */ +r += scalblnf(float_x, long_x); r += scalbnf(float_x, int_x); r += significandf(float_x); r += sinf(float_x); @@ -62,7 +62,7 @@ r += sinhf(float_x); r += sqrtf(float_x); r += tanf(float_x); r += tanhf(float_x); -/*r += tgammaf(float_x); - uclibc does not have it (yet?) */ +r += tgammaf(float_x); r += truncf(float_x); return r; } @@ -116,7 +116,7 @@ r += lroundl(long_double_x); r += modfl(long_double_x, &long_double_x); r += nearbyintl(long_double_x); r += nextafterl(long_double_x, long_double_x); -/* r += nexttowardl(long_double_x, long_double_x); - uclibc doesn't provide this [yet?] */ +r += nexttowardl(long_double_x, long_double_x); r += powl(long_double_x, long_double_x); r += remainderl(long_double_x, long_double_x); r += remquol(long_double_x, long_double_x, &int_x); diff --git a/test/math/libm-test.inc b/test/math/libm-test.inc index d0f0a0c..8f0db3c 100644 --- a/test/math/libm-test.inc +++ b/test/math/libm-test.inc @@ -115,6 +115,9 @@ # define _GNU_SOURCE #endif +#undef __CHK_COMPLEX_STUFF +#define __CHK_COMPLEX_STUFF 0 + #include "libm-test-ulps.h" #include #include @@ -1120,8 +1123,10 @@ cacosh_test (void) END (cacosh, complex); } +#endif +#if __CHK_COMPLEX_STUFF static void carg_test (void) { @@ -1188,7 +1193,9 @@ carg_test (void) END (carg); } +#endif /* __CHK_COMPLEX_STUFF */ +#if 0 static void casin_test (void) { @@ -1683,7 +1690,7 @@ ceil_test (void) } -#if 0 +#if __CHK_COMPLEX_STUFF static void cexp_test (void) { @@ -1746,8 +1753,9 @@ cexp_test (void) END (cexp, complex); } +#endif /* __CHK_COMPLEX_STUFF */ - +#if 0 static void cimag_test (void) { @@ -2588,7 +2596,6 @@ fabs_test (void) } -#if 0 static void fdim_test (void) { @@ -2624,7 +2631,6 @@ fdim_test (void) END (fdim); } -#endif static void @@ -2694,7 +2700,6 @@ floor_test (void) } -#if 0 static void fma_test (void) { @@ -2797,7 +2802,6 @@ fmin_test (void) END (fmin); } -#endif static void @@ -3002,7 +3006,7 @@ isnormal_test (void) END (isnormal); } -#if defined __DO_XSI_MATH__ +#if defined __DO_XSI_MATH__ && !(defined TEST_LDOUBLE || defined TEST_FLOAT) static void j0_test (void) { @@ -3629,7 +3633,6 @@ modf_test (void) } -#if 0 static void nearbyint_test (void) { @@ -3710,7 +3713,6 @@ nexttoward_test (void) END (nexttoward); } -#endif static void @@ -3950,7 +3952,6 @@ remainder_test (void) END (remainder); } -#if 0 static void remquo_test (void) { @@ -3981,7 +3982,6 @@ remquo_test (void) END (remquo); } -#endif static void rint_test (void) @@ -4229,12 +4229,12 @@ round_test (void) #endif +#ifdef __UCLIBC_SUSV3_LEGACY__ static void scalb_test (void) { START (scalb); #ifndef TEST_LDOUBLE /* uclibc doesn't have scalbl */ -#ifdef __UCLIBC_SUSV3_LEGACY__ /* scalbf is susv3 legacy */ TEST_ff_f (scalb, 2.0, 0.5, nan_value, INVALID_EXCEPTION); TEST_ff_f (scalb, 3.0, -2.5, nan_value, INVALID_EXCEPTION); @@ -4285,11 +4285,10 @@ scalb_test (void) TEST_ff_f (scalb, 0.8L, 4, 12.8L); TEST_ff_f (scalb, -0.854375L, 5, -27.34L); -#endif /* __UCLIBC_SUSV3_LEGACY__ */ #endif /* TEST_LDOUBLE */ END (scalb); } - +#endif static void scalbn_test (void) @@ -4313,7 +4312,6 @@ scalbn_test (void) } -#if 0 static void scalbln_test (void) { @@ -4334,7 +4332,6 @@ scalbln_test (void) END (scalbn); } -#endif static void @@ -4539,7 +4536,6 @@ tanh_test (void) END (tanh); } -#if 0 static void tgamma_test (void) { @@ -4571,7 +4567,6 @@ tgamma_test (void) END (tgamma); } -#endif #if 0 @@ -4651,7 +4646,7 @@ trunc_test (void) } #endif -#if defined __DO_XSI_MATH__ +#if defined __DO_XSI_MATH__ && !(defined TEST_LDOUBLE || defined TEST_FLOAT) static void y0_test (void) { @@ -4979,11 +4974,11 @@ main (int argc, char **argv) logb_test (); modf_test (); ilogb_test (); +#ifdef __UCLIBC_SUSV3_LEGACY__ scalb_test (); +#endif scalbn_test (); -#if 0 scalbln_test (); -#endif significand_test (); /* Power and absolute value functions: */ @@ -4998,16 +4993,12 @@ main (int argc, char **argv) erfc_test (); gamma_test (); lgamma_test (); -#if 0 tgamma_test (); -#endif /* Nearest integer functions: */ ceil_test (); floor_test (); -#if 0 nearbyint_test (); -#endif rint_test (); #if 0 rint_test_tonearest (); @@ -5025,13 +5016,10 @@ main (int argc, char **argv) /* Remainder functions: */ fmod_test (); remainder_test (); -#if 0 remquo_test (); -#endif /* Manipulation functions: */ copysign_test (); -#if 0 nextafter_test (); nexttoward_test (); @@ -5043,24 +5031,29 @@ main (int argc, char **argv) /* Multiply and add: */ fma_test (); + /* Complex functions: */ cabs_test (); +#if __CHK_COMPLEX_STUFF +#if 0 cacos_test (); cacosh_test (); +#endif carg_test (); +#if 0 casin_test (); casinh_test (); catan_test (); catanh_test (); ccos_test (); ccosh_test (); +#endif cexp_test (); +#if 0 cimag_test (); clog10_test (); clog_test (); -#if 0 conj_test (); -#endif cpow_test (); cproj_test (); creal_test (); @@ -5070,9 +5063,10 @@ main (int argc, char **argv) ctan_test (); ctanh_test (); #endif +#endif /* __CHK_COMPLEX_STUFF */ /* Bessel functions: */ -#if defined __DO_XSI_MATH__ +#if defined __DO_XSI_MATH__ && !(defined TEST_LDOUBLE || defined TEST_FLOAT) j0_test (); j1_test (); jn_test (); -- cgit v0.9.1