diff options
Diffstat (limited to 'libm')
-rw-r--r-- | libm/Makefile | 22 | ||||
-rw-r--r-- | libm/float_wrappers.c | 547 | ||||
-rw-r--r-- | libm/w_sqrtf.c | 46 |
3 files changed, 565 insertions, 50 deletions
diff --git a/libm/Makefile b/libm/Makefile index e8aaddc12..7c8bf1d3e 100644 --- a/libm/Makefile +++ b/libm/Makefile @@ -49,6 +49,7 @@ LIBM=libm.a LIBM_SHARED=libm.so LIBM_SHARED_FULLNAME=libm-$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL).so CFLAGS+=-D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE +FL_MSRC = float_wrappers.c ifeq ($(strip $(DO_C99_MATH)),y) CSRC = e_acos.c e_acosh.c e_asin.c e_atan2.c e_atanh.c e_cosh.c\ @@ -65,7 +66,15 @@ CSRC = e_acos.c e_acosh.c e_asin.c e_atan2.c e_atanh.c e_cosh.c\ w_cosh.c w_drem.c w_exp.c w_fmod.c w_gamma.c w_gamma_r.c\ w_hypot.c w_j0.c w_j1.c w_jn.c w_lgamma.c w_lgamma_r.c\ w_log.c w_log10.c w_pow.c w_remainder.c w_scalb.c w_sinh.c\ - w_sqrt.c w_sqrtf.c fpmacros.c nan.c s_ceilf.c s_floorf.c + w_sqrt.c fpmacros.c nan.c s_ceilf.c s_floorf.c +FL_MOBJ = acosf.o acoshf.o asinf.o asinhf.o atan2f.o atanf.o atanhf.o cbrtf.o \ + ceilf.o copysignf.o cosf.o coshf.o erfcf.o erff.o exp2f.o expf.o \ + expm1f.o fabsf.o fdimf.o floorf.o fmaf.o fmaxf.o fminf.o fmodf.o \ + frexpf.o hypotf.o ilogbf.o ldexpf.o lgammaf.o log10f.o log1pf.o \ + log2f.o logbf.o logf.o lrintf.o lroundf.o modff.o nearbyintf.o \ + nextafterf.o powf.o remainderf.o remquof.o rintf.o roundf.o \ + scalblnf.o scalbnf.o sinf.o sinhf.o sqrtf.o tanf.o tanhf.o \ + tgammaf.o truncf.o else # This list of math functions was taken from POSIX/IEEE 1003.1b-1993 CSRC = w_acos.c w_asin.c s_atan.c w_atan2.c s_ceil.c s_cos.c \ @@ -76,11 +85,12 @@ CSRC+= s_expm1.c s_scalbn.c s_copysign.c e_acos.c e_asin.c e_atan2.c \ k_cos.c e_cosh.c e_exp.c e_fmod.c e_log.c e_log10.c e_pow.c \ k_sin.c e_sinh.c e_sqrt.c k_tan.c e_rem_pio2.c k_rem_pio2.c \ s_finite.c -# We'll add sqrtf to avoid different configurations of libstdc++. -CSRC+= w_sqrtf.c +# We'll add sqrtf to avoid problems with libstdc++ +FL_MOBJ = sqrtf.o endif + COBJS=$(patsubst %.c,%.o, $(CSRC)) -OBJS=$(COBJS) +OBJS=$(COBJS) $(FL_MOBJ) ifneq ($(strip $(UCLIBC_HAS_FLOATS)),y) @@ -117,6 +127,10 @@ $(COBJS): %.o : %.c $(CC) $(CFLAGS) -c $< -o $@ $(STRIPTOOL) -x -R .note -R .comment $*.o +$(FL_MOBJ): $(FL_MSRC) + $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o + $(STRIPTOOL) -x -R .note -R .comment $*.o + $(OBJ): Makefile tags: diff --git a/libm/float_wrappers.c b/libm/float_wrappers.c new file mode 100644 index 000000000..d2b43afaf --- /dev/null +++ b/libm/float_wrappers.c @@ -0,0 +1,547 @@ +/* vi: set sw=4 ts=4: */ +/* + * Wrapper functions implementing all the float math functions + * defined by SuSv3 by actually calling the double version of + * each function and then casting the result back to a float + * to return to the user. + * + * Copyright (C) 2005 by Erik Andersen <andersen@uclibc.org> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Library General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License + * for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "math.h" + +/* For the time being, do _NOT_ implement these functions + * that are defined by SuSv3 */ +#if 0 +long long llrintf(float); +long long llroundf(float); +float nexttowardf(float, long double); +#endif + +/* Implement the following, as defined by SuSv3 */ +#if 0 +float acosf(float); +float acoshf(float); +float asinf(float); +float asinhf(float); +float atan2f(float, float); +float atanf(float); +float atanhf(float); +float cbrtf(float); +float ceilf(float); +float copysignf(float, float); +float cosf(float); +float coshf(float); +float erfcf(float); +float erff(float); +float exp2f(float); +float expf(float); +float expm1f(float); +float fabsf(float); +float fdimf(float, float); +float floorf(float); +float fmaf(float, float, float); +float fmaxf(float, float); +float fminf(float, float); +float fmodf(float, float); +float frexpf(float value, int *); +float hypotf(float, float); +int ilogbf(float); +float ldexpf(float, int); +float lgammaf(float); +float log10f(float); +float log1pf(float); +float log2f(float); +float logbf(float); +float logf(float); +long lrintf(float); +long lroundf(float); +float modff(float, float *); +float nearbyintf(float); +float nextafterf(float, float); +float powf(float, float); +float remainderf(float, float); +float remquof(float, float, int *); +float rintf(float); +float roundf(float); +float scalblnf(float, long); +float scalbnf(float, int); +float sinf(float); +float sinhf(float); +float sqrtf(float); +float tanf(float); +float tanhf(float); +float tgammaf(float); +float truncf(float); +#endif + +#ifdef L_acosf +float acosf (float x) +{ + return (float) acos( (double)x ); +} +#endif + + +#ifdef L_acoshf +float acoshf (float x) +{ + return (float) acosh( (double)x ); +} +#endif + + +#ifdef L_asinf +float asinf (float x) +{ + return (float) asin( (double)x ); +} +#endif + + +#ifdef L_asinhf +float asinhf (float x) +{ + return (float) asinh( (double)x ); +} +#endif + + +#ifdef L_atan2f +float atan2f (float x, float y) +{ + return (float) atan2( (double)x, (double)y ); +} +#endif + + +#ifdef L_atanf +float atanf (float x) +{ + return (float) atan( (double)x ); +} +#endif + + +#ifdef L_atanhf +float atanhf (float x) +{ + return (float) atanh( (double)x ); +} +#endif + + +#ifdef L_cbrtf +float cbrtf (float x) +{ + return (float) cbrt( (double)x ); +} +#endif + + +#ifdef L_ceilf +float ceilf (float x) +{ + return (float) ceil( (double)x ); +} +#endif + + +#ifdef L_copysignf +float copysignf (float x, float y) +{ + return (float) copysign( (double)x, (double)y ); +} +#endif + + +#ifdef L_cosf +float cosf (float x) +{ + return (float) cos( (double)x ); +} +#endif + + +#ifdef L_coshf +float coshf (float x) +{ + return (float) cosh( (double)x ); +} +#endif + + +#ifdef L_erfcf +float erfcf (float x) +{ + return (float) erfc( (double)x ); +} +#endif + + +#ifdef L_erff +float erff (float x) +{ + return (float) erf( (double)x ); +} +#endif + + +#ifdef L_exp2f +float exp2f (float x) +{ + return (float) exp2( (double)x ); +} +#endif + + +#ifdef L_expf +float expf (float x) +{ + return (float) exp( (double)x ); +} +#endif + + +#ifdef L_expm1f +float expm1f (float x) +{ + return (float) expm1( (double)x ); +} +#endif + + +#ifdef L_fabsf +float fabsf (float x) +{ + return (float) fabs( (double)x ); +} +#endif + + +#ifdef L_fdimf +float fdimf (float x, float y) +{ + return (float) fdim( (double)x, (double)y ); +} +#endif + + +#ifdef L_floorf +float floorf (float x) +{ + return (float) floor( (double)x ); +} +#endif + + +#ifdef L_fmaf +float fmaf (float x, float y, float z) +{ + return (float) fma( (double)x, (double)y, (double)z ); +} +#endif + + +#ifdef L_fmaxf +float fmaxf (float x, float y) +{ + return (float) fmax( (double)x, (double)y ); +} +#endif + + +#ifdef L_fminf +float fminf (float x, float y) +{ + return (float) fmin( (double)x, (double)y ); +} +#endif + + +#ifdef L_fmodf +float fmodf (float x, float y) +{ + return (float) fmod( (double)x, (double)y ); +} +#endif + + +#ifdef L_frexpf +float frexpf (float x, int *exp) +{ + return (float) frexp( (double)x, exp ); +} +#endif + + +#ifdef L_hypotf +float hypotf (float x, float y) +{ + return (float) hypot( (double)x, (double)y ); +} +#endif + + +#ifdef L_ilogbf +int ilogbf (float x) +{ + return (float) ilogb( (double)x ); +} +#endif + + +#ifdef L_ldexpf +float ldexpf (float x, int exp) +{ + return (float) ldexp( (double)x, exp ); +} +#endif + + +#ifdef L_lgammaf +float lgammaf (float x) +{ + return (float) lgamma( (double)x ); +} +#endif + + +#if 0 +#ifdef L_llrintf +long long llrintf (float x) +{ + return (float) llrint( (double)x ); +} +#endif + + +#ifdef L_llroundf +long long llroundf (float x) +{ + return (float) llround( (double)x ); +} +#endif + +#endif + +#ifdef L_log10f +float log10f (float x) +{ + return (float) log10( (double)x ); +} +#endif + + +#ifdef L_log1pf +float log1pf (float x) +{ + return (float) log1p( (double)x ); +} +#endif + + +#ifdef L_log2f +float log2f (float x) +{ + return (float) log2( (double)x ); +} +#endif + + +#ifdef L_logbf +float logbf (float x) +{ + return (float) logb( (double)x ); +} +#endif + + +#ifdef L_logf +float logf (float x) +{ + return (float) log( (double)x ); +} +#endif + + +#ifdef L_lrintf +long lrintf (float x) +{ + return (float) lrint( (double)x ); +} +#endif + + +#ifdef L_lroundf +long lroundf (float x) +{ + return (float) lround( (double)x ); +} +#endif + + +#ifdef L_modff +float modff (float x, float *iptr) +{ + double y, result; + result = modf ( x, &y ); + *iptr = (float)y; + return (float) result; + +} +#endif + + +#ifdef L_nearbyintf +float nearbyintf (float x) +{ + return (float) nearbyint( (double)x ); +} +#endif + + +#ifdef L_nextafterf +float nextafterf (float x, float y) +{ + return (float) nextafter( (double)x, (double)y ); +} +#endif + + +#if 0 +#ifdef L_nexttowardf +float nexttowardf (float x, long double y) +{ + return (float) nexttoward( (double)x, (double)y ); +} +#endif + +#endif + +#ifdef L_powf +float powf (float x, float y) +{ + return (float) pow( (double)x, (double)y ); +} +#endif + + +#ifdef L_remainderf +float remainderf (float x, float y) +{ + return (float) remainder( (double)x, (double)y ); +} +#endif + + +#ifdef L_remquof +float remquof (float x, float y, int *quo) +{ + return (float) remquo( (double)x, (double)y, quo ); +} +#endif + + +#ifdef L_rintf +float rintf (float x) +{ + return (float) rint( (double)x ); +} +#endif + + +#ifdef L_roundf +float roundf (float x) +{ + return (float) round( (double)x ); +} +#endif + + +#ifdef L_scalblnf +float scalblnf (float x, long exp) +{ + return (float) scalbln( (double)x, exp ); +} +#endif + + +#ifdef L_scalbnf +float scalbnf (float x, int exp) +{ + return (float) scalbn( (double)x, exp ); +} +#endif + + +#ifdef L_sinf +float sinf (float x) +{ + return (float) sin( (double)x ); +} +#endif + + +#ifdef L_sinhf +float sinhf (float x) +{ + return (float) sinh( (double)x ); +} +#endif + + +#ifdef L_sqrtf +float sqrtf (float x) +{ + return (float) sqrt( (double)x ); +} +#endif + + +#ifdef L_tanf +float tanf (float x) +{ + return (float) tan( (double)x ); +} +#endif + + +#ifdef L_tanhf +float tanhf (float x) +{ + return (float) tanh( (double)x ); +} +#endif + + +#ifdef L_tgammaf +float tgammaf (float x) +{ + return (float) tgamma( (double)x ); +} +#endif + + +#ifdef L_truncf +float truncf (float x) +{ + return (float) trunc( (double)x ); +} +#endif + + diff --git a/libm/w_sqrtf.c b/libm/w_sqrtf.c deleted file mode 100644 index 971acf466..000000000 --- a/libm/w_sqrtf.c +++ /dev/null @@ -1,46 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* sqrtf for uClibc - * - * Copyright (C) 2002 by Erik Andersen <andersen@uclibc.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Library General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License - * for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * wrapper for sqrt(x) - */ - -#include "math.h" -#include "math_private.h" - -#ifdef __STDC__ - float sqrtf(float x) /* wrapper sqrt */ -#else - float sqrtf(x) /* wrapper sqrt */ - float x; -#endif -{ -#ifdef _IEEE_LIBM - return __ieee754_sqrt(x); -#else - float z; - z = __ieee754_sqrt(x); - if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; - if(x<0.0) { - return __kernel_standard(x,x,26); /* sqrt(negative) */ - } else - return z; -#endif -} |