diff mbox

powerpc: Fix inline feraiseexcept, feclearexcept macros

Message ID 54C2C558.2050304@linux.vnet.ibm.com
State New
Headers show

Commit Message

Adhemerval Zanella Jan. 23, 2015, 10:04 p.m. UTC
This patch fixes the inline feraiseexcept and feclearexcept macros for
powerpc by casting the input argument to integer before operation on it.

It fixes BZ#17776.

Tested on powerpc64 and powerp32, no regression found. 

--

	[BZ #17776]
	* sysdeps/powerpc/bits/fenvinline.h (feraiseexcept): Convert input to
	integer before bitwise and assembly operations.
	(feclearexcept): Likewise.

--

Comments

Joseph Myers Jan. 24, 2015, 2:21 a.m. UTC | #1
On Fri, 23 Jan 2015, Adhemerval Zanella wrote:

> This patch fixes the inline feraiseexcept and feclearexcept macros for
> powerpc by casting the input argument to integer before operation on it.
> 
> It fixes BZ#17776.

This should add an (architecture-independent) testcase (probably covering 
such arguments to all <fenv.h> functions that accept an integer argument, 
not just those with the bug).

> +    if (__builtin_constant_p (__e)					      \

Have you made sure __builtin_constant_p works for variables assigned like 
this from a macro argument?
diff mbox

Patch

diff --git a/NEWS b/NEWS
index ed15176..b62088c 100644
--- a/NEWS
+++ b/NEWS
@@ -17,8 +17,8 @@  Version 2.21
   17608, 17616, 17625, 17630, 17633, 17634, 17635, 17647, 17653, 17657,
   17658, 17664, 17665, 17668, 17682, 17702, 17717, 17719, 17722, 17723,
   17724, 17725, 17732, 17733, 17744, 17745, 17746, 17747, 17748, 17775,
-  17777, 17780, 17781, 17782, 17791, 17793, 17796, 17797, 17803, 17806,
-  17834, 17844.
+  17776, 17777, 17780, 17781, 17782, 17791, 17793, 17796, 17797, 17803,
+  17806, 17834, 17844.
 
 * A new semaphore algorithm has been implemented in generic C code for all
   machines. Previous custom assembly implementations of semaphore were
diff --git a/sysdeps/powerpc/bits/fenvinline.h b/sysdeps/powerpc/bits/fenvinline.h
index 35c2114..999c6b2 100644
--- a/sysdeps/powerpc/bits/fenvinline.h
+++ b/sysdeps/powerpc/bits/fenvinline.h
@@ -34,29 +34,41 @@ 
 
 /* Inline definition for feraiseexcept.  */
 #  define feraiseexcept(__excepts) \
-  ((__builtin_constant_p (__excepts)					      \
-    && ((__excepts) & ((__excepts)-1)) == 0				      \
-    && (__excepts) != FE_INVALID)					      \
-   ? ((__excepts) != 0							      \
-      ? (__extension__ ({ __asm__ __volatile__				      \
-			  ("mtfsb1 %s0"					      \
-			   : : "i#*X"(__builtin_ffs (__excepts)));	      \
-			  0; }))					      \
-      : 0)								      \
-   : (feraiseexcept) (__excepts))
+  (__extension__  ({ 							      \
+    int __e = __excepts;						      \
+    int __ret;								      \
+    if (__builtin_constant_p (__e)					      \
+        && ((__e & (__e-1)) == 0)					      \
+        && (__e != FE_INVALID))						      \
+      {									      \
+	if (__e != 0)							      \
+	  __asm__ __volatile__ ("mtfsb1 %s0"				      \
+				: : "i#*X" (__builtin_ffs (__e)));	      \
+        __ret = 0;							      \
+      }									      \
+    else								      \
+      __ret = feraiseexcept (__e);					      \
+    __ret;								      \
+  }))
 
 /* Inline definition for feclearexcept.  */
 #  define feclearexcept(__excepts) \
-  ((__builtin_constant_p (__excepts)					      \
-    && ((__excepts) & ((__excepts)-1)) == 0				      \
-    && (__excepts) != FE_INVALID)					      \
-   ? ((__excepts) != 0							      \
-      ? (__extension__ ({ __asm__ __volatile__				      \
-			  ("mtfsb0 %s0"					      \
-			   : : "i#*X"(__builtin_ffs (__excepts)));	      \
-			  0; }))					      \
-      : 0)								      \
-   : (feclearexcept) (__excepts))
+  (__extension__  ({ 							      \
+    int __e = __excepts;						      \
+    int __ret;								      \
+    if (__builtin_constant_p (__e)					      \
+        && ((__e & (__e-1)) == 0)					      \
+        && (__e != FE_INVALID))						      \
+      {									      \
+	if (__e != 0)							      \
+	  __asm__ __volatile__ ("mtfsb0 %s0"				      \
+				: : "i#*X" (__builtin_ffs (__e)));	      \
+        __ret = 0;							      \
+      }									      \
+    else								      \
+      __ret = feclearexcept (__e);					      \
+    __ret;								      \
+  }))
 
 # endif /* !__NO_MATH_INLINES.  */