Browse Source

split the float wrappers into separate object files

Eric Andersen 19 years ago
parent
commit
0686404653
3 changed files with 565 additions and 50 deletions
  1. 18 4
      libm/Makefile
  2. 547 0
      libm/float_wrappers.c
  3. 0 46
      libm/w_sqrtf.c

+ 18 - 4
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:

+ 547 - 0
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
+
+

+ 0 - 46
libm/w_sqrtf.c

@@ -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
-}