diff options
Diffstat (limited to 'sysdeps/alpha/fpu/bits/mathinline.h')
-rw-r--r-- | sysdeps/alpha/fpu/bits/mathinline.h | 108 |
1 files changed, 36 insertions, 72 deletions
diff --git a/sysdeps/alpha/fpu/bits/mathinline.h b/sysdeps/alpha/fpu/bits/mathinline.h index 87d40058c3..a126dcf056 100644 --- a/sysdeps/alpha/fpu/bits/mathinline.h +++ b/sysdeps/alpha/fpu/bits/mathinline.h @@ -1,5 +1,6 @@ /* Inline math functions for Alpha. - Copyright (C) 1996, 1997, 1999-2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999-2001, 2004, 2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by David Mosberger-Tang. @@ -25,7 +26,7 @@ #ifdef __cplusplus # define __MATH_INLINE __inline #else -# define __MATH_INLINE extern __inline +# define __MATH_INLINE __extern_inline #endif #if defined __USE_ISOC99 && defined __GNUC__ && !__GNUC_PREREQ(3,0) @@ -83,101 +84,64 @@ __inline_fabs (fabs, double) # undef __inline_fabs #endif +#ifdef __USE_ISOC99 -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ - -__MATH_INLINE float -__NTH (__floorf (float __x)) +/* Test for negative number. Used in the signbit() macro. */ +__MATH_INLINE int +__NTH (__signbitf (float __x)) { - /* Check not zero since floor(-0) == -0. */ - if (__x != 0 && fabsf (__x) < 16777216.0f) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float __tmp1, __tmp2; - - __asm ("cvtst/s %3,%2\n\t" -#ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" +#if !__GNUC_PREREQ (4, 0) + __extension__ union { float __f; int __i; } __u = { __f: __x }; + return __u.__i < 0; #else - "cvttq/svm %2,%1\n\t" + return __builtin_signbitf (__x); #endif - "cvtqt/m %1,%0\n\t" - : "=f"(__x), "=&f"(__tmp1), "=&f"(__tmp2) - : "f"(__x)); - } - return __x; } -__MATH_INLINE double -__NTH (__floor (double __x)) +__MATH_INLINE int +__NTH (__signbit (double __x)) { - if (__x != 0 && fabs (__x) < 9007199254740992.0) /* 1 << DBL_MANT_DIG */ - { - double __tmp1; - __asm ( -#ifdef _IEEE_FP_INEXACT - "cvttq/svim %2,%1\n\t" +#if !__GNUC_PREREQ (4, 0) + __extension__ union { double __d; long __i; } __u = { __d: __x }; + return __u.__i < 0; #else - "cvttq/svm %2,%1\n\t" + return __builtin_signbit (__x); #endif - "cvtqt/m %1,%0\n\t" - : "=f"(__x), "=&f"(__tmp1) - : "f"(__x)); - } - return __x; } -__MATH_INLINE float __NTH (floorf (float __x)) { return __floorf(__x); } -__MATH_INLINE double __NTH (floor (double __x)) { return __floor(__x); } - - -#ifdef __USE_ISOC99 - -__MATH_INLINE float -__NTH (__fdimf (float __x, float __y)) -{ - return __x <= __y ? 0.0f : __x - __y; -} - -__MATH_INLINE float -__NTH (fdimf (float __x, float __y)) +__MATH_INLINE int +__NTH (__signbitl (long double __x)) { - return __x <= __y ? 0.0f : __x - __y; +#if !__GNUC_PREREQ (4, 0) + __extension__ union { + long double __d; + long __i[sizeof(long double)/sizeof(long)]; + } __u = { __d: __x }; + return __u.__i[sizeof(long double)/sizeof(long) - 1] < 0; +#else + return __builtin_signbitl (__x); +#endif } -__MATH_INLINE double -__NTH (__fdim (double __x, double __y)) -{ - return __x <= __y ? 0.0 : __x - __y; -} +/* Test for NaN. Used in the isnan() macro. */ -__MATH_INLINE double -__NTH (fdim (double __x, double __y)) +__MATH_INLINE int +__NTH (__isnanf (float __x)) { - return __x <= __y ? 0.0 : __x - __y; + return isunordered (__x, __x); } -/* Test for negative number. Used in the signbit() macro. */ __MATH_INLINE int -__NTH (__signbitf (float __x)) +__NTH (__isnan (double __x)) { - __extension__ union { float __f; int __i; } __u = { __f: __x }; - return __u.__i < 0; + return isunordered (__x, __x); } __MATH_INLINE int -__NTH (__signbit (double __x)) +__NTH (__isnanl (long double __x)) { - __extension__ union { double __d; long __i; } __u = { __d: __x }; - return __u.__i < 0; + return isunordered (__x, __x); } - #endif /* C99 */ #endif /* __NO_MATH_INLINES */ |