Use signbit() in IS_NEGATIVE and DIFFERENT_SIGNS
authorMatt Turner <mattst88@gmail.com>
Fri, 14 Sep 2012 23:04:40 +0000 (16:04 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 24 Sep 2012 16:45:17 +0000 (09:45 -0700)
signbit() appears to be available everywhere (even MSVC according to
MSDN), so let's use it instead of open-coding some messy and confusing
bit twiddling macros.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54805
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Suggested-by: Ian Romanick <ian.d.romanick@intel.com>
configure.ac
src/mesa/main/macros.h

index 4193496de9526a58880a46abfc627db020cad75f..cb654675833ced5c658381a11fac1704dda2191f 100644 (file)
@@ -499,6 +499,13 @@ AC_SUBST([DLOPEN_LIBS])
 dnl See if posix_memalign is available
 AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES -DHAVE_POSIX_MEMALIGN"])
 
+dnl signbit() is a macro in glibc's math.h, so AC_CHECK_FUNC fails. To handle
+dnl this, use AC_CHECK_DECLS and fallback to AC_CHECK_FUNC in case it fails.
+AC_CHECK_DECLS([signbit],[],
+               AC_CHECK_FUNC([signbit],[],
+                             AC_MSG_ERROR([could not find signbit()])),
+               [#include <math.h>])
+
 dnl SELinux awareness.
 AC_ARG_ENABLE([selinux],
     [AS_HELP_STRING([--enable-selinux],
index 04d59d79c0788183383a11d1f20633b31a4738fd..7b7fd1b6d760f04691b5345ab0315676cd4d8780 100644 (file)
@@ -693,31 +693,14 @@ NORMALIZE_3FV(GLfloat v[3])
 static inline GLboolean
 IS_NEGATIVE(float x)
 {
-#if defined(USE_IEEE)
-   fi_type fi;
-   fi.f = x;
-   return fi.i < 0;
-#else
-   return x < 0.0F;
-#endif
+   return signbit(x) != 0;
 }
 
-
 /** Test two floats have opposite signs */
 static inline GLboolean
 DIFFERENT_SIGNS(GLfloat x, GLfloat y)
 {
-#if defined(USE_IEEE)
-   fi_type xfi, yfi;
-   xfi.f = x;
-   yfi.f = y;
-   return !!((xfi.i ^ yfi.i) & (1u << 31));
-#else
-   /* Could just use (x*y<0) except for the flatshading requirements.
-    * Maybe there's a better way?
-    */
-   return ((x) * (y) <= 0.0F && (x) - (y) != 0.0F);
-#endif
+   return signbit(x) != signbit(y);
 }