diff options
-rw-r--r-- | libm/float_wrappers.c | 280 | ||||
-rw-r--r-- | libm/ldouble_wrappers.c | 73 |
2 files changed, 113 insertions, 240 deletions
diff --git a/libm/float_wrappers.c b/libm/float_wrappers.c index e6d660e13..22258f1fa 100644 --- a/libm/float_wrappers.c +++ b/libm/float_wrappers.c @@ -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 @@ float tanhf(float); #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 @@ float atan2f (float x, float y) } #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 @@ float cargf (float complex x) } #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 @@ float copysignf (float x, float y) } #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 @@ float fdimf (float x, float y) } #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 @@ float fmaf (float x, float y, float z) } #endif - #ifdef L_fmaxf float fmaxf (float x, float y) { @@ -259,7 +209,6 @@ float fmaxf (float x, float y) } #endif - #ifdef L_fminf float fminf (float x, float y) { @@ -267,7 +216,6 @@ float fminf (float x, float y) } #endif - #ifdef L_fmodf float fmodf (float x, float y) { @@ -275,7 +223,6 @@ float fmodf (float x, float y) } #endif - #ifdef L_frexpf float frexpf (float x, int *_exp) { @@ -283,7 +230,6 @@ float frexpf (float x, int *_exp) } #endif - #ifdef L_hypotf float hypotf (float x, float y) { @@ -291,15 +237,10 @@ float hypotf (float x, float y) } #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 @@ float ldexpf (float x, int _exp) } #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 @@ float modff (float x, float *iptr) } #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 @@ float nexttowardf (float x, long double y) } #endif - #ifdef L_powf float powf (float x, float y) { @@ -423,7 +317,6 @@ float powf (float x, float y) } #endif - #ifdef L_remainderf float remainderf (float x, float y) { @@ -431,7 +324,6 @@ float remainderf (float x, float y) } #endif - #ifdef L_remquof float remquof (float x, float y, int *quo) { @@ -439,23 +331,14 @@ float remquof (float x, float y, int *quo) } #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 @@ float scalblnf (float x, long _exp) } #endif - #ifdef L_scalbnf float scalbnf (float x, int _exp) { @@ -471,60 +353,32 @@ float scalbnf (float x, int _exp) } #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 @@ float scalbf (float x, float y) #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 diff --git a/libm/ldouble_wrappers.c b/libm/ldouble_wrappers.c index 6e253fad1..a9324cece 100644 --- a/libm/ldouble_wrappers.c +++ b/libm/ldouble_wrappers.c @@ -23,18 +23,29 @@ long double func##l(long double x) \ { \ 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 @@ int func##l(long double x) \ * 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 @@ int func##l(long double x) \ # 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 @@ int func##l(long double x) \ ); \ 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 @@ WRAPPER1(lgamma) #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 @@ WRAPPER1(log) #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 |