diff options
author | Richard Henderson <rth@twiddle.net> | 2012-03-07 09:16:59 -0800 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2012-03-09 11:16:18 -0800 |
commit | 67bb6da6798d55fff7ed759af51799dfeca740d3 (patch) | |
tree | 3073ed92087837aec2120709e25af890a2bf503c /sysdeps/powerpc | |
parent | 15194b4b3d39e3d2099f9159f3a8abb52d37cc00 (diff) | |
download | glibc-67bb6da6798d55fff7ed759af51799dfeca740d3.zip glibc-67bb6da6798d55fff7ed759af51799dfeca740d3.tar.gz glibc-67bb6da6798d55fff7ed759af51799dfeca740d3.tar.bz2 |
powerpc: Convert __ieee754_sqrt{,f} from macros to inlines.
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r-- | sysdeps/powerpc/fpu/math_private.h | 106 |
1 files changed, 36 insertions, 70 deletions
diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h index 7bacecb..28628f0 100644 --- a/sysdeps/powerpc/fpu/math_private.h +++ b/sysdeps/powerpc/fpu/math_private.h @@ -23,35 +23,49 @@ #include <sysdep.h> #include <ldsodefs.h> #include <dl-procinfo.h> - #include <math/math_private.h> # if __WORDSIZE == 64 || defined _ARCH_PWR4 # define __CPU_HAS_FSQRT 1 - -#ifndef __ieee754_sqrt -# define __ieee754_sqrt(x) \ - ({ double __z; \ - __asm __volatile ( \ - " fsqrt %0,%1\n" \ - : "=f" (__z) \ - : "f"(x)); \ - __z; }) -#endif -#ifndef __ieee754_sqrtf -# define __ieee754_sqrtf(x) \ - ({ float __z; \ - __asm __volatile ( \ - " fsqrts %0,%1\n" \ - : "=f" (__z) \ - : "f"(x)); \ - __z; }) -#endif - # else # define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) -# endif // __WORDSIZE == 64 || defined _ARCH_PWR4 +# endif + +extern double __slow_ieee754_sqrt (double); +extern __always_inline double +__ieee754_sqrt (double __x) +{ + double __z; + if (__CPU_HAS_FSQRT) + { + /* Volatile is required to prevent the compiler from moving the + fsqrt instruction above the branch. */ + __asm __volatile ("fsqrt %0,%1" : "=f" (__z) : "f" (__x)); + } + else + __z = __slow_ieee754_sqrt(__x); + + return __z; +} + +extern float __slow_ieee754_sqrtf (float); +extern __always_inline float +__ieee754_sqrtf (float __x) +{ + float __z; + + if (__CPU_HAS_FSQRT) + { + /* Volatile is required to prevent the compiler from moving the + fsqrts instruction above the branch. */ + __asm __volatile ("fsqrts %0,%1" : "=f" (__z) : "f" (__x)); + } + else + __z = __slow_ieee754_sqrtf(__x); + + return __z; +} #if defined _ARCH_PWR5X @@ -162,52 +176,4 @@ #endif /* defined _ARCH_PWR6 */ - -# ifndef __LIBC_INTERNAL_MATH_INLINES -extern double __slow_ieee754_sqrt (double); -__inline double -__ieee754_sqrt (double __x) -{ - double __z; - - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrt instruction above the branch. */ - __asm __volatile ( - " fsqrt %0,%1\n" - : "=f" (__z) - : "f" (__x)); - } - else - __z = __slow_ieee754_sqrt(__x); - - return __z; -} - -extern float __slow_ieee754_sqrtf (float); - -__inline float -__ieee754_sqrtf (float __x) -{ - float __z; - - /* If the CPU is 64-bit we can use the optional FP instructions. */ - if (__CPU_HAS_FSQRT) - { - /* Volatile is required to prevent the compiler from moving the - fsqrts instruction above the branch. */ - __asm __volatile ( - " fsqrts %0,%1\n" - : "=f" (__z) - : "f" (__x)); - } - else - __z = __slow_ieee754_sqrtf(__x); - - return __z; -} -#endif /* __LIBC_INTERNAL_MATH_INLINES */ - #endif /* _PPC_MATH_PRIVATE_H_ */ |