From 4e588ec90ee84124a647f85455f0c7858c5f52c9 Mon Sep 17 00:00:00 2001 From: Gabriel Dos Reis Date: Fri, 25 May 2001 21:43:42 +0000 Subject: [PATCH] std_cmath.h: Tweak. * include/c_std/bits/std_cmath.h: Tweak. #define away abs, cos, fabs, sin, sqrt. They are now implemented in terms of __builtin_ variants. From-SVN: r42595 --- libstdc++-v3/ChangeLog | 6 + libstdc++-v3/include/c_std/bits/std_cmath.h | 621 +++++++++----------- 2 files changed, 300 insertions(+), 327 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 44999eb6b42..a7619efe655 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2001-05-25 Gabriel Dos Reis + + * include/c_std/bits/std_cmath.h: Tweak. #define away abs, cos, + fabs, sin, sqrt. They are now implemented in terms of __builtin_ + variants. + 2001-05-24 Benjamin Kosnik libstdc++/2830 diff --git a/libstdc++-v3/include/c_std/bits/std_cmath.h b/libstdc++-v3/include/c_std/bits/std_cmath.h index d37f900c139..3f6f23db75c 100644 --- a/libstdc++-v3/include/c_std/bits/std_cmath.h +++ b/libstdc++-v3/include/c_std/bits/std_cmath.h @@ -40,6 +40,16 @@ #include #pragma GCC system_header + +// Need to mangle these "C" functions. Ideally, we could like to do the +// same for the remaining of the "C" functions but they do not have +// builtin implementations. So, they are still of nuisance. +#define abs __glibcpp_abs +#define cos __glibcpp_cos +#define fabs __glibcpp_fabs +#define sin __glibcpp_sin +#define sqrt __glibcpp_sqrt + #include // Get rid of those macros defined in in lieu of real functions. @@ -80,17 +90,21 @@ namespace std return __x < _Tp() ? -__x : __x; } -#if _GLIBCPP_HAVE___BUILTIN_FABSF - inline float - abs(float __x) { return __builtin_fabsf(__x); } -#elif _GLIBCPP_HAVE_FABSF - inline float - abs(float __x) { return ::fabsf(__x); } -#else - inline float - abs(float __x) { return __cmath_abs(__x); } -#endif + // abs. + inline float + abs(float __x) + { return __builtin_fabsf(__x); } + inline double + abs(double __x) + { return __builtin_fabs(__x); } + + inline long double + abs(long double __x) + { return __builtin_fabsl(__x); } + + + // acos. #if _GLIBCPP_HAVE_ACOSF inline float acos(float __x) { return ::acosf(__x); } @@ -99,6 +113,18 @@ namespace std acos(float __x) { return ::acos(static_cast(__x)); } #endif + extern "C" double acos(double __x); + +#if _GLIBCPP_HAVE_ACOSL + inline long double + acos(long double __x) { return ::acosl(__x); } +#else + inline long double + acos(long double __x) { return ::acos(static_cast(__x)); } +#endif + + + // asin. #if _GLIBCPP_HAVE_ASINF inline float asin(float __x) { return ::asinf(__x); } @@ -107,6 +133,18 @@ namespace std asin(float __x) { return ::asin(static_cast(__x)); } #endif + extern "C" double asin(double __x); + +#if _GLIBCPP_HAVE_ASINL + inline long double + asin(long double __x) { return ::asinl(__x); } +#else + inline long double + asin(long double __x) { return ::asin(static_cast(__x)); } +#endif + + + // atan. #if _GLIBCPP_HAVE_ATANF inline float atan(float __x) { return ::atanf(__x); } @@ -115,6 +153,18 @@ namespace std atan(float __x) { return ::atan(static_cast(__x)); } #endif + extern "C" double atan(double __x); + +#if _GLIBCPP_HAVE_ATANL + inline long double + atan(long double __x) { return ::atanl(__x); } +#else + inline long double + atan(long double __x) { return ::atan(static_cast(__x)); } +#endif + + + // atan2. #if _GLIBCPP_HAVE_ATAN2F inline float atan2(float __y, float __x) { return ::atan2f(__y, __x); } @@ -124,6 +174,19 @@ namespace std { return ::atan2(static_cast(__y), static_cast(__x)); } #endif + extern "C" double atan2(double __y, double __x); + +#if _GLIBCPP_HAVE_ATAN2L + inline long double + atan2(long double __y, long double __x) { return ::atan2l(__y, __x); } +#else + inline long double + atan2(long double __y, long double __x) + { return ::atan2(static_cast(__y), static_cast(__x)); } +#endif + + + // ceil. #if _GLIBCPP_HAVE_CEILF inline float ceil(float __x) { return ::ceilf(__x); } @@ -132,17 +195,32 @@ namespace std ceil(float __x) { return ::ceil(static_cast(__x)); } #endif -#if _GLIBCPP_HAVE___BUILTIN_COSF - inline float - cos(float __x) { return __builtin_cosf(__x); } -#elif _GLIBCPP_HAVE_COSF - inline float - cos(float __x) { return ::cosf(__x); } + extern "C" double ceil(double __x); + +#if _GLIBCPP_HAVE_CEILL + inline long double + ceil(long double __x) { return ::ceill(__x); } #else - inline float - cos(float __x) { return ::cos(static_cast(__x)); } + inline long double + ceil(long double __x) { return ::ceil(static_cast(__x)); } #endif + + // cos. + inline float + cos(float __x) + { return __builtin_cosf(__x); } + + inline double + cos(double __x) + { return __builtin_cos(__x); } + + inline long double + cos(long double __x) + { return __builtin_cosl(__x); } + + + // cosh. #if _GLIBCPP_HAVE_COSHF inline float cosh(float __x) { return ::coshf(__x); } @@ -151,6 +229,18 @@ namespace std cosh(float __x) { return ::cosh(static_cast(__x)); } #endif + extern "C" double cosh(double __x); + +#if _GLIBCPP_HAVE_COSHL + inline long double + cosh(long double __x) { return ::coshl(__x); } +#else + inline long double + cosh(long double __x) { return ::cosh(static_cast(__x)); } +#endif + + + // exp. #if _GLIBCPP_HAVE_EXPF inline float exp(float __x) { return ::expf(__x); } @@ -159,17 +249,32 @@ namespace std exp(float __x) { return ::exp(static_cast(__x)); } #endif -#if _GLIBCPP_HAVE___BUILTIN_FABSF - inline float - fabs(float __x) { return __builtin_fabsf(__x); } -#elif _GLIBCPP_HAVE_FABSF - inline float - fabs(float __x) { return ::fabsf(__x); } + extern "C" double exp(double __x); + +#if _GLIBCPP_HAVE_EXPL + inline long double + exp(long double __x) { return ::expl(__x); } #else - inline float - fabs(float __x) { return __cmath_abs(__x); } + inline long double + exp(long double __x) { return ::exp(static_cast(__x)); } #endif + + // fabs. + inline float + fabs(float __x) + { return __builtin_fabsf(__x); } + + inline double + fabs(double __x) + { return __builtin_fabs(__x); } + + inline long double + fabs(long double __x) + { return __builtin_fabsl(__x); } + + + // floor. #if _GLIBCPP_HAVE_FLOORF inline float floor(float __x) { return ::floorf(__x); } @@ -178,6 +283,18 @@ namespace std floor(float __x) { return ::floor(static_cast(__x)); } #endif + extern "C" double floor(double __x); + +#if _GLIBCPP_HAVE_FLOORL + inline long double + floor(long double __x) { return ::floorl(__x); } +#else + inline long double + floor(long double __x) { return ::floor(static_cast(__x)); } +#endif + + + // fmod. #if _GLIBCPP_HAVE_FMODF inline float fmod(float __x, float __y) { return ::fmodf(__x, __y); } @@ -187,6 +304,19 @@ namespace std { return ::fmod(static_cast(__x), static_cast(__y)); } #endif + extern "C" double fmod(double __x, double __y); + +#if _GLIBCPP_HAVE_FMODL + inline long double + fmod(long double __x, long double __y) { return ::fmodl(__x, __y); } +#else + inline long double + fmod(long double __x, long double __y) + { return ::fmod(static_cast(__x), static_cast(__y)); } +#endif + + + // frexp. #if _GLIBCPP_HAVE_FREXPF inline float frexp(float __x, int* __exp) { return ::frexpf(__x, __exp); } @@ -195,6 +325,19 @@ namespace std frexp(float __x, int* __exp) { return ::frexp(__x, __exp); } #endif + extern "C" double frexp(double __x, int* __exp); + +#if _GLIBCPP_HAVE_FREXPL + inline long double + frexp(long double __x, int* __exp) { return ::frexpl(__x, __exp); } +#else + inline long double + frexp(long double __x, int* __exp) + { return ::frexp(static_cast(__x), __exp); } +#endif + + + // ldexp. #if _GLIBCPP_HAVE_LDEXPF inline float ldexp(float __x, int __exp) { return ::ldexpf(__x, __exp); } @@ -204,6 +347,19 @@ namespace std { return ::ldexp(static_cast(__x), __exp); } #endif + extern "C" double ldexp(double __x, int __exp); + +#if _GLIBCPP_HAVE_LDEXPL + inline long double + ldexp(long double __x, int __exp) { return ::ldexpl(__x, __exp); } +#else + inline long double + ldexp(long double __x, int __exp) + { return ::ldexp(static_cast(__x), __exp); } +#endif + + + // log. #if _GLIBCPP_HAVE_LOGF inline float log(float __x) { return ::logf(__x); } @@ -212,6 +368,18 @@ namespace std { return ::log(static_cast(__x)); } #endif + extern "C" double log(double __x); + +#if _GLIBCPP_HAVE_LOGL + inline long double + log(long double __x) { return ::logl(__x); } +#else + inline long double + log(long double __x) { return ::log(static_cast(__x)); } +#endif + + + // log10. #if _GLIBCPP_HAVE_LOG10F inline float log10(float __x) { return ::log10f(__x); } @@ -220,6 +388,18 @@ namespace std log10(float __x) { return ::log10(static_cast(__x)); } #endif + extern "C" double log10(double __x); + +#if _GLIBCPP_HAVE_LOG10L + inline long double + log10(long double __x) { return ::log10l(__x); } +#else + inline long double + log10(long double __x) { return ::log10(static_cast(__x)); } +#endif + + + // modf. #if _GLIBCPP_HAVE_MODFF inline float modf(float __x, float* __iptr) { return ::modff(__x, __iptr); } @@ -234,6 +414,24 @@ namespace std } #endif + extern "C" double modf(double __x, double* __iptr); + +#if _GLIBCPP_HAVE_MODFL + inline long double + modf(long double __x, long double* __iptr) { return ::modfl(__x, __iptr); } +#else + inline long double + modf(long double __x, long double* __iptr) + { + double __tmp; + double __res = ::modf(static_cast(__x), &__tmp); + * __iptr = static_cast(__tmp); + return __res; + } +#endif + + + // pow. template inline _Tp __pow_helper(_Tp __x, int __n) @@ -252,293 +450,8 @@ namespace std { return ::pow(static_cast(__x), static_cast(__y)); } #endif - inline float - pow(float __x, int __n) - { - return __pow_helper(__x, __n); - } - -#if _GLIBCPP_HAVE___BUILTIN_SINF - inline float - sin(float __x) { return __builtin_sinf(__x); } -#elif _GLIBCPP_HAVE_SINF - inline float - sin(float __x) { return ::sinf(__x); } -#else - inline float - sin(float __x) { return ::sin(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_SINHF - inline float - sinh(float __x) { return ::sinhf(__x); } -#else - inline float - sinh(float __x) { return ::sinh(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE___BUILTIN_SQRTF - inline float - sqrt(float __x) { return __builtin_sqrtf(__x); } -#elif _GLIBCPP_HAVE_SQRTF - inline float - sqrt(float __x) { return ::sqrtf(__x); } -#else - inline float - sqrt(float __x) { return ::sqrt(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_TANF - inline float - tan(float __x) { return ::tanf(__x); } -#else - inline float - tan(float __x) { return ::tan(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_TANHF - inline float - tanh(float __x) { return ::tanhf(__x); } -#else - inline float - tanh(float __x) { return ::tanh(static_cast(__x)); } -#endif - - - extern "C" double acos(double __x); - - extern "C" double asin(double __x); - - extern "C" double atan(double __x); - - extern "C" double atan2(double __y, double __x); - - extern "C" double ceil(double __x); - -#if _GLIBCPP_HAVE___BUILTIN_COS - inline double - cos(double __x) { return __builtin_cos(__x); } -#else - extern "C" double cos(double __x); -#endif - - extern "C" double cosh(double __x); - - extern "C" double exp(double __x); - -#if _GLIBCPP_HAVE___BUILTIN_FABS - inline double - fabs(double __x) { return __builtin_fabs(__x); } -#else - extern "C" double fabs(double __x); -#endif - -#if _GLIBCPP_HAVE___BUILTIN_FABS - inline double - abs(double __x) { return __builtin_fabs(__x); } -#else - inline double - abs(double __x) { return fabs(__x); } -#endif - - extern "C" double floor(double __x); - - extern "C" double fmod(double __x, double __y); - - extern "C" double frexp(double __x, int* __exp); - - extern "C" double ldexp(double __x, int __exp); - - extern "C" double log(double __x); - - extern "C" double log10(double __x); - - extern "C" double modf(double __x, double* __iptr); - extern "C" double pow(double __x, double __y); - inline double - pow(double __x, int __i) - { - return __pow_helper(__x, __i); - } - -#if _GLIBCPP_HAVE___BUILTIN_SIN - inline double - sin(double __x) { return __builtin_sin(__x); } -#else - extern "C" double sin(double __x); -#endif - - extern "C" double sinh(double __x); - -#if _GLIBCPP_HAVE___BUILTIN_SQRT - inline double - sqrt(double __x) { return __builtin_fsqrt(__x); } -#else - extern "C" double sqrt(double __x); -#endif - - extern "C" double tan(double __x); - - extern "C" double tanh(double __x); - - -#if _GLIBCPP_HAVE___BUILTIN_FABSL - inline long double - abs(long double __x) { return __builtin_fabsl(__x); } -#elif _GLIBCPP_HAVE_FABSL - inline long double - abs(long double __x) { return ::fabsl(__x); } -#else - inline long double - abs(long double __x) { return __cmath_abs(__x); } -#endif - -#if _GLIBCPP_HAVE_ACOSL - inline long double - acos(long double __x) { return ::acosl(__x); } -#else - inline long double - acos(long double __x) { return ::acos(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_ASINL - inline long double - asin(long double __x) { return ::asinl(__x); } -#else - inline long double - asin(long double __x) { return ::asin(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_ATANL - inline long double - atan(long double __x) { return ::atanl(__x); } -#else - inline long double - atan(long double __x) { return ::atan(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_ATAN2L - inline long double - atan2(long double __y, long double __x) { return ::atan2l(__y, __x); } -#else - inline long double - atan2(long double __y, long double __x) - { return ::atan2(static_cast(__y), static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_CEILL - inline long double - ceil(long double __x) { return ::ceill(__x); } -#else - inline long double - ceil(long double __x) { return ::ceil(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE___BUILTIN_COSL - inline long double - cos(long double __x) { return __builtin_cosl(__x); } -#elif _GLIBCPP_HAVE_COSL - inline long double - cos(long double __x) { return ::cosl(__x); } -#else - inline long double - cos(long double __x) { return ::cos(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_COSHL - inline long double - cosh(long double __x) { return ::coshl(__x); } -#else - inline long double - cosh(long double __x) { return ::cosh(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_EXPL - inline long double - exp(long double __x) { return ::expl(__x); } -#else - inline long double - exp(long double __x) { return ::exp(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE___BUILTIN_FABSL - inline long double - fabs(long double __x) { return __builtin_fabsl(__x); } -#elif _GLIBCPP_HAVE_FABSL - inline long double - fabs(long double __x) { return ::fabsl(__x); } -#else - inline long double - fabs(long double __x) { return __cmath_abs(__x); } -#endif - -#if _GLIBCPP_HAVE_FLOORL - inline long double - floor(long double __x) { return ::floorl(__x); } -#else - inline long double - floor(long double __x) { return ::floor(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_FMODL - inline long double - fmod(long double __x, long double __y) { return ::fmodl(__x, __y); } -#else - inline long double - fmod(long double __x, long double __y) - { return ::fmod(static_cast(__x), static_cast(__y)); } -#endif - -#if _GLIBCPP_HAVE_FREXPL - inline long double - frexp(long double __x, int* __exp) { return ::frexpl(__x, __exp); } -#else - inline long double - frexp(long double __x, int* __exp) - { return ::frexp(static_cast(__x), __exp); } -#endif - -#if _GLIBCPP_HAVE_LDEXPL - inline long double - ldexp(long double __x, int __exp) { return ::ldexpl(__x, __exp); } -#else - inline long double - ldexp(long double __x, int __exp) - { return ::ldexp(static_cast(__x), __exp); } -#endif - -#if _GLIBCPP_HAVE_LOGL - inline long double - log(long double __x) { return ::logl(__x); } -#else - inline long double - log(long double __x) { return ::log(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_LOG10L - inline long double - log10(long double __x) { return ::log10l(__x); } -#else - inline long double - log10(long double __x) { return ::log10(static_cast(__x)); } -#endif - -#if _GLIBCPP_HAVE_MODFL - inline long double - modf(long double __x, long double* __iptr) { return ::modfl(__x, __iptr); } -#else - inline long double - modf(long double __x, long double* __iptr) - { - double __tmp; - double __res = ::modf(static_cast(__x), &__tmp); - * __iptr = static_cast(__tmp); - return __res; - } -#endif - #if _GLIBCPP_HAVE_POWL inline long double pow(long double __x, long double __y) { return ::powl(__x, __y); } @@ -548,23 +461,50 @@ namespace std { return ::pow(static_cast(__x), static_cast(__y)); } #endif + inline float + pow(float __x, int __n) + { + return __pow_helper(__x, __n); + } + + inline double + pow(double __x, int __i) + { + return __pow_helper(__x, __i); + } + inline long double pow(long double __x, int __n) { return __pow_helper(__x, __n); } -#if _GLIBCPP_HAVE___BUILTIN_SINL - inline long double - sin(long double __x) { return __builtin_sinl(__x); } -#elif _GLIBCPP_HAVE_SINL - inline long double - sin(long double __x) { return ::sinl(__x); } + + // sin. + inline float + sin(float __x) + { return __builtin_sinf(__x); } + + inline double + sin(double __x) + { return __builtin_sin(__x); } + + inline long double + sin(long double __x) + { return __builtin_sinl(__x); } + + + // sinh. +#if _GLIBCPP_HAVE_SINHF + inline float + sinh(float __x) { return ::sinhf(__x); } #else - inline long double - sin(long double __x) { return ::sin(static_cast(__x)); } + inline float + sinh(float __x) { return ::sinh(static_cast(__x)); } #endif + extern "C" double sinh(double __x); + #if _GLIBCPP_HAVE_SINHL inline long double sinh(long double __x) { return ::sinhl(__x); } @@ -573,17 +513,32 @@ namespace std sinh(long double __x) { return ::sinh(static_cast(__x)); } #endif -#if _GLIBCPP_HAVE___BUILTIN_SQRTL - inline long double - sqrt(long double __x) { return __builtin_sqrtl(__x); } -#elif _GLIBCPP_HAVE_SQRTL - inline long double - sqrt(long double __x) { return ::sqrtl(__x); } + + // sqrt. + inline float + sqrt(float __x) + { return __builtin_sqrtf(__x); } + + inline double + sqrt(double __x) + { return __builtin_fsqrt(__x); } + + inline long double + sqrt(long double __x) + { return __builtin_sqrtl(__x); } + + + // tan. +#if _GLIBCPP_HAVE_TANF + inline float + tan(float __x) { return ::tanf(__x); } #else - inline long double - sqrt(long double __x) { return ::sqrt(static_cast(__x)); } + inline float + tan(float __x) { return ::tan(static_cast(__x)); } #endif + extern "C" double tan(double __x); + #if _GLIBCPP_HAVE_TANL inline long double tan(long double __x) { return ::tanl(__x); } @@ -592,6 +547,18 @@ namespace std tan(long double __x) { return ::tan(static_cast(__x)); } #endif + + // tanh. +#if _GLIBCPP_HAVE_TANHF + inline float + tanh(float __x) { return ::tanhf(__x); } +#else + inline float + tanh(float __x) { return ::tanh(static_cast(__x)); } +#endif + + extern "C" double tanh(double __x); + #if _GLIBCPP_HAVE_TANHL inline long double tanh(long double __x) { return ::tanhl(__x); }