diff options
Diffstat (limited to 'sysdeps/powerpc/fpu_control.h')
-rw-r--r-- | sysdeps/powerpc/fpu_control.h | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/sysdeps/powerpc/fpu_control.h b/sysdeps/powerpc/fpu_control.h index fa04a67643..d0fdad7b45 100644 --- a/sysdeps/powerpc/fpu_control.h +++ b/sysdeps/powerpc/fpu_control.h @@ -65,35 +65,37 @@ extern fpu_control_t __fpu_control; typedef unsigned int fpu_control_t; /* Macros for accessing the hardware control word. */ -# define __FPU_MFFS() \ - ({register double __fr; \ - __asm__ __volatile__("mffs %0" : "=f" (__fr)); \ - __fr; \ - }) - # define _FPU_GETCW(cw) \ ({union { double __d; unsigned long long __ll; } __u; \ - __u.__d = __FPU_MFFS(); \ + __asm__ __volatile__("mffs %0" : "=f" (__u.__d)); \ (cw) = (fpu_control_t) __u.__ll; \ (fpu_control_t) __u.__ll; \ }) -#ifdef _ARCH_PWR9 -# define __FPU_MFFSL() \ - ({register double __fr; \ - __asm__ __volatile__("mffsl %0" : "=f" (__fr)); \ - __fr; \ +# define _FPU_GET_RC_ISA300() \ + ({union { double __d; unsigned long long __ll; } __u; \ + __asm__ __volatile__( \ + ".machine push; .machine \"power9\"; mffsl %0; .machine pop" \ + : "=f" (__u.__d)); \ + (fpu_control_t) (__u.__ll & _FPU_MASK_RC); \ }) -#else -# define __FPU_MFFSL() __FPU_MFFS() -#endif - -# define _FPU_GET_RC() \ - ({union { double __d; unsigned long long __ll; } __u; \ - __u.__d = __FPU_MFFSL(); \ - __u.__ll &= _FPU_MASK_RC; \ - (fpu_control_t) __u.__ll; \ + +# ifdef _ARCH_PWR9 +# define _FPU_GET_RC() _FPU_GET_RC_ISA300() +# elif defined __BUILTIN_CPU_SUPPORTS__ +# define _FPU_GET_RC() \ + ({fpu_control_t __rc; \ + __rc = __glibc_likely (__builtin_cpu_supports ("arch_3_00")) \ + ? _FPU_GET_RC_ISA300 () \ + : _FPU_GETCW (__rc) & _FPU_MASK_RC; \ + __rc; \ + }) +# else +# define _FPU_GET_RC() \ + ({fpu_control_t __rc = _FPU_GETCW (__rc) & _FPU_MASK_RC; \ + __rc; \ }) +# endif # define _FPU_SETCW(cw) \ { union { double __d; unsigned long long __ll; } __u; \ |