----- Original Message ----- > > > ----- Original Message ----- > > 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 > > Cc: Alan Coopersmith <alan.coopersm...@oracle.com> > > Suggested-by: Ian Romanick <ian.d.roman...@intel.com> > > --- > > I'd prefer to see if we can use this everywhere before we decide to > > keep > > the open-coded macros around for other platforms. > > > > Alan, does this work for you on Solaris? > > > > configure.ac | 7 +++++++ > > src/mesa/main/macros.h | 21 ++------------------- > > 2 files changed, 9 insertions(+), 19 deletions(-) > > > > diff --git a/configure.ac b/configure.ac > > index 4193496..f23bfb8 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -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], > > diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h > > index 04d59d7..7b7fd1b 100644 > > --- a/src/mesa/main/macros.h > > +++ b/src/mesa/main/macros.h > > @@ -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; > > } > > I'd vote by simply using "x < 0.0F". A modern compiler should > generate the best code for that instruction already. > > Furthermore signbit(-0.0f) != signbit(0.0f) > > > /** 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); > > This is not the same thing: DIFFERENT_SIGNS(-0.0f, 0.0f) was > returning false, and now it will return TRUE.
Nevermind. DIFFERENT_SIGNS(-0.0f, 0.0f) returns false and your code is correct. Jose _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev