svn commit: branches/uClibc-nptl/libm

vda at uclibc.org vda at uclibc.org
Mon Feb 9 22:55:38 UTC 2009


Author: vda
Date: 2009-02-09 22:55:38 +0000 (Mon, 09 Feb 2009)
New Revision: 25284

Log:
ldouble_wrappers.c: add long and long long optimized wrappers
float_wrappers.c: add xxxWRAPPER1(func) macros. no code changes,
 but makes this file much shorter.

    text           data     bss     dec     hex filename
-  42504            188       4   42696    a6c8 lib/libm-0.9.30-svn.so
+  42488            188       4   42680    a6b8 lib/libm-0.9.30-svn.so



Modified:
   branches/uClibc-nptl/libm/float_wrappers.c
   branches/uClibc-nptl/libm/ldouble_wrappers.c


Changeset:
Modified: branches/uClibc-nptl/libm/float_wrappers.c
===================================================================
--- branches/uClibc-nptl/libm/float_wrappers.c	2009-02-09 22:55:08 UTC (rev 25283)
+++ branches/uClibc-nptl/libm/float_wrappers.c	2009-02-09 22:55:38 UTC (rev 25284)
@@ -16,8 +16,31 @@
 #include <math.h>
 #include <complex.h>
 
+
+#define WRAPPER1(func) \
+float func##f (float x) \
+{ \
+	return (float) func((double)x); \
+}
+#define int_WRAPPER1(func) \
+int func##f (float x) \
+{ \
+	return func((double)x); \
+}
+#define long_WRAPPER1(func) \
+long func##f (float x) \
+{ \
+	return func((double)x); \
+}
+#define long_long_WRAPPER1(func) \
+long long func##f (float x) \
+{ \
+	return func((double)x); \
+}
+
+
 /* For the time being, do _NOT_ implement these functions
- * that are defined by SuSv3 */
+ * that are defined by SuSv3 [why?] */
 #undef L_exp2f         /*float       exp2f(float);*/
 #undef L_fdimf         /*float       fdimf(float, float);*/
 #undef L_fmaf          /*float       fmaf(float, float, float);*/
@@ -77,37 +100,21 @@
 #endif
 
 #ifdef L_acosf
-float acosf (float x)
-{
-	return (float) acos( (double)x );
-}
+WRAPPER1(acos)
 #endif
 
-
 #ifdef L_acoshf
-float acoshf (float x)
-{
-	return (float) acosh( (double)x );
-}
+WRAPPER1(acosh)
 #endif
 
-
 #ifdef L_asinf
-float asinf (float x)
-{
-	return (float) asin( (double)x );
-}
+WRAPPER1(asin)
 #endif
 
-
 #ifdef L_asinhf
-float asinhf (float x)
-{
-	return (float) asinh( (double)x );
-}
+WRAPPER1(asinh)
 #endif
 
-
 #ifdef L_atan2f
 float atan2f (float x, float y)
 {
@@ -115,23 +122,14 @@
 }
 #endif
 
-
 #ifdef L_atanf
-float atanf (float x)
-{
-	return (float) atan( (double)x );
-}
+WRAPPER1(atan)
 #endif
 
-
 #ifdef L_atanhf
-float atanhf (float x)
-{
-	return (float) atanh( (double)x );
-}
+WRAPPER1(atanh)
 #endif
 
-
 #ifdef L_cargf
 float cargf (float complex x)
 {
@@ -139,23 +137,14 @@
 }
 #endif
 
-
 #ifdef L_cbrtf
-float cbrtf (float x)
-{
-	return (float) cbrt( (double)x );
-}
+WRAPPER1(cbrt)
 #endif
 
-
 #ifdef L_ceilf
-float ceilf (float x)
-{
-	return (float) ceil( (double)x );
-}
+WRAPPER1(ceil)
 #endif
 
-
 #ifdef L_copysignf
 float copysignf (float x, float y)
 {
@@ -163,71 +152,38 @@
 }
 #endif
 
-
 #ifdef L_cosf
-float cosf (float x)
-{
-	return (float) cos( (double)x );
-}
+WRAPPER1(cos)
 #endif
 
-
 #ifdef L_coshf
-float coshf (float x)
-{
-	return (float) cosh( (double)x );
-}
+WRAPPER1(cosh)
 #endif
 
-
 #ifdef L_erfcf
-float erfcf (float x)
-{
-	return (float) erfc( (double)x );
-}
+WRAPPER1(erfc)
 #endif
 
-
 #ifdef L_erff
-float erff (float x)
-{
-	return (float) erf( (double)x );
-}
+WRAPPER1(erf)
 #endif
 
-
 #ifdef L_exp2f
-float exp2f (float x)
-{
-	return (float) exp2( (double)x );
-}
+WRAPPER1(exp2)
 #endif
 
-
 #ifdef L_expf
-float expf (float x)
-{
-	return (float) exp( (double)x );
-}
+WRAPPER1(exp)
 #endif
 
-
 #ifdef L_expm1f
-float expm1f (float x)
-{
-	return (float) expm1( (double)x );
-}
+WRAPPER1(expm1)
 #endif
 
-
 #ifdef L_fabsf
-float fabsf (float x)
-{
-	return (float) fabs( (double)x );
-}
+WRAPPER1(fabs)
 #endif
 
-
 #ifdef L_fdimf
 float fdimf (float x, float y)
 {
@@ -235,15 +191,10 @@
 }
 #endif
 
-
 #ifdef L_floorf
-float floorf (float x)
-{
-	return (float) floor( (double)x );
-}
+WRAPPER1(floor)
 #endif
 
-
 #ifdef L_fmaf
 float fmaf (float x, float y, float z)
 {
@@ -251,7 +202,6 @@
 }
 #endif
 
-
 #ifdef L_fmaxf
 float fmaxf (float x, float y)
 {
@@ -259,7 +209,6 @@
 }
 #endif
 
-
 #ifdef L_fminf
 float fminf (float x, float y)
 {
@@ -267,7 +216,6 @@
 }
 #endif
 
-
 #ifdef L_fmodf
 float fmodf (float x, float y)
 {
@@ -275,7 +223,6 @@
 }
 #endif
 
-
 #ifdef L_frexpf
 float frexpf (float x, int *_exp)
 {
@@ -283,7 +230,6 @@
 }
 #endif
 
-
 #ifdef L_hypotf
 float hypotf (float x, float y)
 {
@@ -291,15 +237,10 @@
 }
 #endif
 
-
 #ifdef L_ilogbf
-int ilogbf (float x)
-{
-	return (int) ilogb( (double)x );
-}
+int_WRAPPER1(ilogb)
 #endif
 
-
 #ifdef L_ldexpf
 float ldexpf (float x, int _exp)
 {
@@ -307,87 +248,46 @@
 }
 #endif
 
-
 #ifdef L_lgammaf
-float lgammaf (float x)
-{
-	return (float) lgamma( (double)x );
-}
+WRAPPER1(lgamma)
 #endif
 
-
 #ifdef L_llrintf
-long long llrintf (float x)
-{
-	return (long long) llrint( (double)x );
-}
+long_long_WRAPPER1(llrint)
 #endif
 
-
 #ifdef L_llroundf
-long long llroundf (float x)
-{
-	return (long long) llround( (double)x );
-}
+long_long_WRAPPER1(llround)
 #endif
 
-
 #ifdef L_log10f
-float log10f (float x)
-{
-	return (float) log10( (double)x );
-}
+WRAPPER1(log10)
 #endif
 
-
 #ifdef L_log1pf
-float log1pf (float x)
-{
-	return (float) log1p( (double)x );
-}
+WRAPPER1(log1p)
 #endif
 
-
 #ifdef L_log2f
-float log2f (float x)
-{
-	return (float) log2( (double)x );
-}
+WRAPPER1(log2)
 #endif
 
-
 #ifdef L_logbf
-float logbf (float x)
-{
-	return (float) logb( (double)x );
-}
+WRAPPER1(logb)
 #endif
 
-
 #ifdef L_logf
-float logf (float x)
-{
-	return (float) log( (double)x );
-}
+WRAPPER1(log)
 #endif
 
-
 #ifdef L_lrintf
-long lrintf (float x)
-{
-	return (long) lrint( (double)x );
-}
+long_WRAPPER1(lrint)
 #endif
 
-
 #ifdef L_lroundf
-long lroundf (float x)
-{
-	return (long) lround( (double)x );
-}
+long_WRAPPER1(lround)
 #endif
 
-
 #ifdef L_modff
 float modff (float x, float *iptr)
 {
@@ -399,15 +299,10 @@
 }
 #endif
 
-
 #ifdef L_nearbyintf
-float nearbyintf (float x)
-{
-	return (float) nearbyint( (double)x );
-}
+WRAPPER1(nearbyint)
 #endif
 
-
 #ifdef L_nexttowardf
 float nexttowardf (float x, long double y)
 {
@@ -415,7 +310,6 @@
 }
 #endif
 
-
 #ifdef L_powf
 float powf (float x, float y)
 {
@@ -423,7 +317,6 @@
 }
 #endif
 
-
 #ifdef L_remainderf
 float remainderf (float x, float y)
 {
@@ -431,7 +324,6 @@
 }
 #endif
 
-
 #ifdef L_remquof
 float remquof (float x, float y, int *quo)
 {
@@ -439,23 +331,14 @@
 }
 #endif
 
-
 #ifdef L_rintf
-float rintf (float x)
-{
-	return (float) rint( (double)x );
-}
+WRAPPER1(rint)
 #endif
 
-
 #ifdef L_roundf
-float roundf (float x)
-{
-	return (float) round( (double)x );
-}
+WRAPPER1(round)
 #endif
 
-
 #ifdef L_scalblnf
 float scalblnf (float x, long _exp)
 {
@@ -463,7 +346,6 @@
 }
 #endif
 
-
 #ifdef L_scalbnf
 float scalbnf (float x, int _exp)
 {
@@ -471,60 +353,32 @@
 }
 #endif
 
-
 #ifdef L_sinf
-float sinf (float x)
-{
-	return (float) sin( (double)x );
-}
+WRAPPER1(sin)
 #endif
 
-
 #ifdef L_sinhf
-float sinhf (float x)
-{
-	return (float) sinh( (double)x );
-}
+WRAPPER1(sinh)
 #endif
 
-
 #ifdef L_sqrtf
-float sqrtf (float x)
-{
-	return (float) sqrt( (double)x );
-}
+WRAPPER1(sqrt)
 #endif
 
-
 #ifdef L_tanf
-float tanf (float x)
-{
-	return (float) tan( (double)x );
-}
+WRAPPER1(tan)
 #endif
 
-
 #ifdef L_tanhf
-float tanhf (float x)
-{
-	return (float) tanh( (double)x );
-}
+WRAPPER1(tanh)
 #endif
 
-
 #ifdef L_tgammaf
-float tgammaf (float x)
-{
-	return (float) tgamma( (double)x );
-}
+WRAPPER1(tgamma)
 #endif
 
-
 #ifdef L_truncf
-float truncf (float x)
-{
-	return (float) trunc( (double)x );
-}
+WRAPPER1(trunc)
 #endif
 
 #ifdef L_fmaf
@@ -542,15 +396,9 @@
 #endif
 
 #ifdef L_gammaf
-float gammaf (float x)
-{
-	return (float) gamma( (double)x );
-}
+WRAPPER1(gamma)
 #endif
 
 #ifdef L_significandf
-float significandf (float x)
-{
-	return (float) significand( (double)x );
-}
+WRAPPER1(significand)
 #endif

Modified: branches/uClibc-nptl/libm/ldouble_wrappers.c
===================================================================
--- branches/uClibc-nptl/libm/ldouble_wrappers.c	2009-02-09 22:55:08 UTC (rev 25283)
+++ branches/uClibc-nptl/libm/ldouble_wrappers.c	2009-02-09 22:55:38 UTC (rev 25284)
@@ -23,18 +23,29 @@
 { \
 	return (long double) func((double) x); \
 }
-
 #define int_WRAPPER1(func) \
 int func##l(long double x) \
 { \
 	return func((double) x); \
 }
+#define long_WRAPPER1(func) \
+long func##l(long double x) \
+{ \
+	return func((double) x); \
+}
+#define long_long_WRAPPER1(func) \
+long long 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
+ *	sub	$0x10,%esp
  *	fldt	0x14(%esp)
  *	fstpl	0x8(%esp)
  *	fldl	0x8(%esp) <-- ??
@@ -46,8 +57,8 @@
  * 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 as a double. At this point, stack looks exactly
- * as "double func(double)" expects it to be.
+ * 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.
@@ -56,15 +67,15 @@
 # define WRAPPER1(func) \
 long double func##l(long double x) \
 { \
-	long double fp_top; \
+	long double st_top; \
 	__asm ( \
 	"	fldt	%1\n" \
 	"	fstpl	%1\n" \
 	"	jmp	" STRINGIZE(__GI_##func) "\n" \
-	: "=t" (fp_top) \
+	: "=t" (st_top) \
 	: "m" (x) \
 	); \
-	return fp_top; \
+	return st_top; \
 }
 # define int_WRAPPER1(func) \
 int func##l(long double x) \
@@ -79,7 +90,33 @@
 	); \
 	return ret; \
 }
-#endif /* __i386__ */
+# define long_WRAPPER1(func) \
+long func##l(long double x) \
+{ \
+	long ret; \
+	__asm ( \
+	"	fldt	%1\n" \
+	"	fstpl	%1\n" \
+	"	jmp	" STRINGIZE(__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	" STRINGIZE(__GI_##func) "\n" \
+	: "=A" (ret) \
+	: "m" (x) \
+	); \
+	return ret; \
+}
+#endif /* __i386__ && __OPTIMIZE__ */
 
 
 /* Implement the following, as defined by SuSv3 */
@@ -297,17 +334,11 @@
 #endif
 
 #ifdef L_llrintl
-long long llrintl (long double x)
-{
-	return llrint( (double)x );
-}
+long_long_WRAPPER1(llrint)
 #endif
 
 #ifdef L_llroundl
-long long llroundl (long double x)
-{
-	return llround( (double)x );
-}
+long_long_WRAPPER1(llround)
 #endif
 
 #ifdef L_log10l
@@ -331,17 +362,11 @@
 #endif
 
 #ifdef L_lrintl
-long lrintl (long double x)
-{
-	return lrint( (double)x );
-}
+long_WRAPPER1(lrint)
 #endif
 
 #ifdef L_lroundl
-long lroundl (long double x)
-{
-	return lround( (double)x );
-}
+long_WRAPPER1(lround)
 #endif
 
 #ifdef L_modfl



More information about the uClibc-cvs mailing list