diff options
Diffstat (limited to 'sysdeps/x86_64/fpu/bits/mathinline.h')
-rw-r--r-- | sysdeps/x86_64/fpu/bits/mathinline.h | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/sysdeps/x86_64/fpu/bits/mathinline.h b/sysdeps/x86_64/fpu/bits/mathinline.h index 210bef8102..721f6e4731 100644 --- a/sysdeps/x86_64/fpu/bits/mathinline.h +++ b/sysdeps/x86_64/fpu/bits/mathinline.h @@ -30,34 +30,35 @@ #endif -#if defined __GNUC__ && __GNUC__ >= 2 -# ifdef __USE_ISOC99 +/* The gcc, version 2.7 or below, has problems with all this inlining + code. So disable it for this version of the compiler. */ +#if __GNUC_PREREQ (2, 8) && defined __USE_ISOC99 __BEGIN_NAMESPACE_C99 /* Test for negative number. Used in the signbit() macro. */ __MATH_INLINE int __NTH (__signbitf (float __x)) { -# if __WORDSIZE == 32 +# if __WORDSIZE == 32 __extension__ union { float __f; int __i; } __u = { __f: __x }; return __u.__i < 0; -# else +# else int __m; __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x)); return __m & 0x8; -# endif +# endif } __MATH_INLINE int __NTH (__signbit (double __x)) { -# if __WORDSIZE == 32 +# if __WORDSIZE == 32 __extension__ union { double __d; int __i[2]; } __u = { __d: __x }; return __u.__i[1] < 0; -# else +# else int __m; __asm ("pmovmskb %1, %0" : "=r" (__m) : "x" (__x)); return __m & 0x80; -# endif +# endif } __MATH_INLINE int __NTH (__signbitl (long double __x)) @@ -66,6 +67,16 @@ __NTH (__signbitl (long double __x)) return (__u.__i[2] & 0x8000) != 0; } +__END_NAMESPACE_C99 +#endif + + +#if (__GNUC_PREREQ (2, 8) && !defined __NO_MATH_INLINES \ + && defined __OPTIMIZE__) + +# ifdef __USE_ISOC99 +__BEGIN_NAMESPACE_C99 + /* Round to nearest integer. */ # if __WORDSIZE == 64 || defined __SSE_MATH__ __MATH_INLINE long int @@ -100,14 +111,10 @@ __NTH (llrint (double __x)) __asm ("cvtsd2si %1, %0" : "=r" (__res) : "xm" (__x)); return __res; } - -__END_NAMESPACE_C99 # endif # if defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ > 0 \ && (__WORDSIZE == 64 || defined __SSE2_MATH__) -__BEGIN_NAMESPACE_C99 - /* Determine maximum of two values. */ __MATH_INLINE float __NTH (fmaxf (float __x, float __y)) |