--- mathinline.h_ 2005-06-08 07:58:21.000000000 +0200 +++ mathinline.h 2005-06-08 11:10:35.000000000 +0200 @@ -293,6 +293,13 @@ __inline_mathcode (__sgn, __x, \ /* __FAST_MATH__ is defined by gcc -ffast-math. */ #ifdef __FAST_MATH__ +#if __GNUC_PREREQ (4, 0) +__inline_mathcode (__pow2, __x, \ + __extension__ long long int __p = (long long int) __x; \ + if (__x == (long double) __p) \ + return __builtin_ldexpl (__x, 1); \ + return __builtin_exp2l (__x)) +#else __inline_mathcode (__pow2, __x, \ register long double __value; \ register long double __exponent; \ @@ -316,6 +323,7 @@ __inline_mathcode (__pow2, __x, \ ("fscale" \ : "=t" (__value) : "0" (__value), "u" (__exponent)); \ return __value) +#endif # ifdef __USE_GNU # define __sincos_code \ @@ -527,6 +535,9 @@ __inline_mathcodeNP (tanh, __x, \ return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x)) #endif +#if defined __FAST_MATH__ && __GNUC_PREREQ (4, 0) +__inline_mathcodeNP (floor, __x, return __builtin_floorl (__x)) +#else __inline_mathcodeNP (floor, __x, \ register long double __value; \ __volatile unsigned short int __cw; \ @@ -537,7 +548,11 @@ __inline_mathcodeNP (floor, __x, \ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); \ __asm __volatile ("fldcw %0" : : "m" (__cw)); \ return __value) +#endif +#if defined __FAST_MATH__ && __GNUC_PREREQ (4, 0) +__inline_mathcodeNP (ceil, __x, return __builtin_ceill (__x)) +#else __inline_mathcodeNP (ceil, __x, \ register long double __value; \ __volatile unsigned short int __cw; \ @@ -548,14 +563,20 @@ __inline_mathcodeNP (ceil, __x, \ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); \ __asm __volatile ("fldcw %0" : : "m" (__cw)); \ return __value) +#endif #ifdef __FAST_MATH__ -# define __ldexp_code \ +# if __GNUC_PREREQ (4, 0) +# define __ldexp_code \ + return __builtin_ldexpl (__x, __y) +# else +# define __ldexp_code \ register long double __value; \ __asm __volatile__ \ ("fscale" \ : "=t" (__value) : "0" (__x), "u" ((long double) __y)); \ return __value +# endif __MATH_INLINE double __NTH (ldexp (double __x, int __y)) @@ -641,15 +662,22 @@ __NTH (ldexpl (long double __x, int __y) __inline_mathcodeNP3 (fma, __x, __y, __z, return (__x * __y) + __z) +# if !__GNUC_PREREQ (4, 0) __inline_mathopNP (rint, "frndint") +# endif # endif /* __FAST_MATH__ */ -# define __lrint_code \ +# if defined __FAST_MATH__ && __GNUC_PREREQ (4, 0) +# define __lrint_code \ + return __builtin_lrintl (__x) +# else +# define __lrint_code \ long int __lrintres; \ __asm__ __volatile__ \ ("fistpl %0" \ : "=m" (__lrintres) : "t" (__x) : "st"); \ return __lrintres +# endif __MATH_INLINE long int __NTH (lrintf (float __x)) { @@ -667,12 +695,17 @@ __NTH (lrintl (long double __x)) } # undef __lrint_code -# define __llrint_code \ +# if defined __FAST_MATH__ && __GNUC_PREREQ (4, 0) +# define __llrint_code \ + return __builtin_llrintl (__x) +# else +# define __llrint_code \ long long int __llrintres; \ __asm__ __volatile__ \ ("fistpll %0" \ : "=m" (__llrintres) : "t" (__x) : "st"); \ return __llrintres +# endif __MATH_INLINE long long int __NTH (llrintf (float __x)) { @@ -690,7 +723,7 @@ __NTH (llrintl (long double __x)) } # undef __llrint_code -#endif +#endif /* __USE_ISOC99 */ #ifdef __USE_MISC