powerpc: Refactor fenvinline.h
authorRogerio Alves <rcardoso@linux.ibm.com>
Mon, 10 Feb 2020 15:09:02 +0000 (12:09 -0300)
committerTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Tue, 25 Feb 2020 21:57:12 +0000 (18:57 -0300)
This patch refactor fenviline.h replaces some statements for
builtins.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
sysdeps/powerpc/bits/fenvinline.h

index 7068966..89ea38a 100644 (file)
 # 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);                                           \
 #   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);                                           \