<span style="font-size:13px"><font face="arial, helvetica, sans-serif">Concurrency::precise_math::signbit(), and only as of VS 2012 runtimes. This is an awfully high bar for such a simple function.</font></span><div><font face="Segoe UI, Verdana, Arial"><br>
</font></div><div><font face="Segoe UI, Verdana, Arial"><br></font><br><div class="gmail_quote">On Mon, Sep 24, 2012 at 1:43 PM, Matt Turner <span dir="ltr"><<a href="mailto:mattst88@gmail.com" target="_blank">mattst88@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, Sep 24, 2012 at 11:02 AM, Brian Paul <<a href="mailto:brianp@vmware.com">brianp@vmware.com</a>> wrote:<br>

> On 09/24/2012 10:49 AM, Matt Turner wrote:<br>
>><br>
>> Module: Mesa<br>
>> Branch: master<br>
>> Commit: 0f3ba405eada72e1ab4371948315b28608903927<br>
>> URL:<br>
>> <a href="http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f3ba405eada72e1ab4371948315b28608903927" target="_blank">http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f3ba405eada72e1ab4371948315b28608903927</a><br>

>><br>
>> Author: Matt Turner<<a href="mailto:mattst88@gmail.com">mattst88@gmail.com</a>><br>
>> Date:   Fri Sep 14 16:04:40 2012 -0700<br>
>><br>
>> Use signbit() in IS_NEGATIVE and DIFFERENT_SIGNS<br>
>><br>
>> signbit() appears to be available everywhere (even MSVC according to<br>
>> MSDN), so let's use it instead of open-coding some messy and confusing<br>
>> bit twiddling macros.<br>
>><br>
>> Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=54805" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=54805</a><br>
>> Reviewed-by: Paul Berry<<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
>> Suggested-by: Ian Romanick<<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
>><br>
>> ---<br>
>><br>
>>   <a href="http://configure.ac" target="_blank">configure.ac</a>           |    7 +++++++<br>
>>   src/mesa/main/macros.h |   21 ++-------------------<br>
>>   2 files changed, 9 insertions(+), 19 deletions(-)<br>
>><br>
>> diff --git a/<a href="http://configure.ac" target="_blank">configure.ac</a> b/<a href="http://configure.ac" target="_blank">configure.ac</a><br>
>> index 4193496..cb65467 100644<br>
>> --- a/<a href="http://configure.ac" target="_blank">configure.ac</a><br>
>> +++ b/<a href="http://configure.ac" target="_blank">configure.ac</a><br>
>> @@ -499,6 +499,13 @@ AC_SUBST([DLOPEN_LIBS])<br>
>>   dnl See if posix_memalign is available<br>
>>   AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES<br>
>> -DHAVE_POSIX_MEMALIGN"])<br>
>><br>
>> +dnl signbit() is a macro in glibc's math.h, so AC_CHECK_FUNC fails. To<br>
>> handle<br>
>> +dnl this, use AC_CHECK_DECLS and fallback to AC_CHECK_FUNC in case it<br>
>> fails.<br>
>> +AC_CHECK_DECLS([signbit],[],<br>
>> +               AC_CHECK_FUNC([signbit],[],<br>
>> +                             AC_MSG_ERROR([could not find signbit()])),<br>
>> +               [#include<math.h>])<br>
>> +<br>
>>   dnl SELinux awareness.<br>
>>   AC_ARG_ENABLE([selinux],<br>
>>       [AS_HELP_STRING([--enable-selinux],<br>
>> diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h<br>
>> index 04d59d7..7b7fd1b 100644<br>
>> --- a/src/mesa/main/macros.h<br>
>> +++ b/src/mesa/main/macros.h<br>
>> @@ -693,31 +693,14 @@ NORMALIZE_3FV(GLfloat v[3])<br>
>>   static inline GLboolean<br>
>>   IS_NEGATIVE(float x)<br>
>>   {<br>
>> -#if defined(USE_IEEE)<br>
>> -   fi_type fi;<br>
>> -   fi.f = x;<br>
>> -   return fi.i<  0;<br>
>> -#else<br>
>> -   return x<  0.0F;<br>
>> -#endif<br>
>> +   return signbit(x) != 0;<br>
>>   }<br>
>><br>
>> -<br>
>>   /** Test two floats have opposite signs */<br>
>>   static inline GLboolean<br>
>>   DIFFERENT_SIGNS(GLfloat x, GLfloat y)<br>
>>   {<br>
>> -#if defined(USE_IEEE)<br>
>> -   fi_type xfi, yfi;<br>
>> -   xfi.f = x;<br>
>> -   yfi.f = y;<br>
>> -   return !!((xfi.i ^ yfi.i)&  (1u<<  31));<br>
>> -#else<br>
>> -   /* Could just use (x*y<0) except for the flatshading requirements.<br>
>> -    * Maybe there's a better way?<br>
>> -    */<br>
>> -   return ((x) * (y)<= 0.0F&&  (x) - (y) != 0.0F);<br>
>> -#endif<br>
>> +   return signbit(x) != signbit(y);<br>
>>   }<br>
>><br>
>><br>
><br>
> Looks like we don't have signbit() on Windows.  We build with scons there so<br>
> the autoconf check isn't applicable.  I'll post a patch in a bit.<br>
><br>
> -Brian<br>
<br>
MSDN claims that Windows does have signbit():<br>
<a href="http://msdn.microsoft.com/en-us/library/hh308342.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/hh308342.aspx</a><br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div>