diff options
author | Rogerio Alves <rcardoso@linux.ibm.com> | 2020-02-10 12:09:02 -0300 |
---|---|---|
committer | Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com> | 2020-02-25 18:57:12 -0300 |
commit | f1a0840c15d039631c13258544cdc04e4cbb9c69 (patch) | |
tree | 47d1824dadb7d583622d7e16fd5c9a2a0e3badc1 | |
parent | d423e17031f379d51c5ad6c33e8b57380c8eea35 (diff) | |
download | glibc-f1a0840c15d039631c13258544cdc04e4cbb9c69.tar.gz glibc-f1a0840c15d039631c13258544cdc04e4cbb9c69.tar.xz glibc-f1a0840c15d039631c13258544cdc04e4cbb9c69.zip |
powerpc: Refactor fenvinline.h
This patch refactor fenviline.h replaces some statements for builtins. Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
-rw-r--r-- | sysdeps/powerpc/bits/fenvinline.h | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/sysdeps/powerpc/bits/fenvinline.h b/sysdeps/powerpc/bits/fenvinline.h index 70689664e2..89ea38a4f8 100644 --- a/sysdeps/powerpc/bits/fenvinline.h +++ b/sysdeps/powerpc/bits/fenvinline.h @@ -51,25 +51,34 @@ # define fegetround() __fegetround () # ifndef __NO_MATH_INLINES + +/* Builtins to mtfsb0 and mtfsb1 was introduced on GCC 9. */ +# if !__GNUC_PREREQ(9, 0) /* The weird 'i#*X' constraints on the following suppress a gcc warning when __excepts is not a constant. Otherwise, they mean the - same as just plain 'i'. */ + same as just plain 'i'. This warning only happens in old GCC + versions (gcc 3 or less). Otherwise plain 'i' works fine. */ +# define __MTFSB0(__b) __asm__ __volatile__ ("mtfsb0 %0" : : "i#*X" (__b)) +# define __MTFSB1(__b) __asm__ __volatile__ ("mtfsb1 %0" : : "i#*X" (__b)) +# else +# define __MTFSB0(__b) __builtin_mtfsb0 (__b) +# define __MTFSB1(__b) __builtin_mtfsb1 (__b) +# endif # if __GNUC_PREREQ(3, 4) +#include <sys/param.h> + /* Inline definition for feraiseexcept. */ # define feraiseexcept(__excepts) \ (__extension__ ({ \ int __e = __excepts; \ - int __ret; \ + int __ret = 0; \ if (__builtin_constant_p (__e) \ - && (__e & (__e - 1)) == 0 \ + && powerof2 (__e) \ && __e != FE_INVALID) \ { \ - if (__e != 0) \ - __asm__ __volatile__ ("mtfsb1 %0" \ - : : "i#*X" (__builtin_clz (__e))); \ - __ret = 0; \ + __MTFSB1 ((__builtin_clz (__e))); \ } \ else \ __ret = feraiseexcept (__e); \ @@ -80,15 +89,12 @@ # define feclearexcept(__excepts) \ (__extension__ ({ \ int __e = __excepts; \ - int __ret; \ + int __ret = 0; \ if (__builtin_constant_p (__e) \ - && (__e & (__e - 1)) == 0 \ + && powerof2 (__e) \ && __e != FE_INVALID) \ { \ - if (__e != 0) \ - __asm__ __volatile__ ("mtfsb0 %0" \ - : : "i#*X" (__builtin_clz (__e))); \ - __ret = 0; \ + __MTFSB0 ((__builtin_clz (__e))); \ } \ else \ __ret = feclearexcept (__e); \ |