[Mesa-dev] [PATCH 1/4] mesa: move fpclassify work-arounds into c99_math.h

Brian Paul brianp at vmware.com
Wed Mar 11 07:20:03 PDT 2015


On 03/11/2015 01:23 AM, Jose Fonseca wrote:
> On 11/03/15 01:41, Brian Paul wrote:
>> ---
>>   include/c99_math.h          | 52
>> +++++++++++++++++++++++++++++++++++++++++++++
>>   src/mesa/main/querymatrix.c | 51
>> +-------------------------------------------
>>   2 files changed, 53 insertions(+), 50 deletions(-)
>>
>> diff --git a/include/c99_math.h b/include/c99_math.h
>> index 0a49950..f1a6685 100644
>> --- a/include/c99_math.h
>> +++ b/include/c99_math.h
>> @@ -161,4 +161,56 @@ llrintf(float f)
>>   #endif
>>
>>
>> +#if defined(fpclassify)
>> +/* ISO C99 says that fpclassify is a macro.  Assume that any
>> implementation
>> + * of fpclassify, whether it's in a C99 compiler or not, will be a
>> macro.
>> + */
>> +#elif defined(__cplusplus)
>> +/* For C++, fpclassify() should be defined in <cmath> */
>
> Does MSVC's cmath implement fpclassify?  If not this #elif clause should
> be moved after MSC_VER clause.

Looks like the answer is "no".  I'll move it.  Though things built fine 
on MSVC probably because we don't use fpclassify in any C++ files.


>
>> +#elif defined(_MSC_VER)
>> +/* Not required on VS2013 and above.  Oddly, the fpclassify() function
>> + * doesn't exist in such a form on MSVC.  This is an implementation
>> using
>> + * slightly different lower-level Windows functions.
>> + */
>> +#include <float.h>
>> +
>> +static inline enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL,
>> FP_NORMAL}
>> +fpclassify(double x)
>> +{
>> +   switch(_fpclass(x)) {
>> +   case _FPCLASS_SNAN: /* signaling NaN */
>> +   case _FPCLASS_QNAN: /* quiet NaN */
>> +      return FP_NAN;
>> +   case _FPCLASS_NINF: /* negative infinity */
>> +   case _FPCLASS_PINF: /* positive infinity */
>> +      return FP_INFINITE;
>> +   case _FPCLASS_NN:   /* negative normal */
>> +   case _FPCLASS_PN:   /* positive normal */
>> +      return FP_NORMAL;
>> +   case _FPCLASS_ND:   /* negative denormalized */
>> +   case _FPCLASS_PD:   /* positive denormalized */
>> +      return FP_SUBNORMAL;
>> +   case _FPCLASS_NZ:   /* negative zero */
>> +   case _FPCLASS_PZ:   /* positive zero */
>> +      return FP_ZERO;
>> +   default:
>> +      /* Should never get here; but if we do, this will guarantee
>> +       * that the pattern is not treated like a number.
>> +       */
>> +      return FP_NAN;
>> +   }
>> +}
>> +
>> +#else
>
> If might be better to simply #error here.  Or leave the code but put a
> #warning.

I'll do the #error.  That seems to be the pattern we're using in the 
wrapper headers.

-Brian



>
> Jose
>
>> +static inline enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL,
>> FP_NORMAL}
>> +fpclassify(double x)
>> +{
>> +   /* XXX do something better someday */
>> +   return FP_NORMAL;
>> +}
>> +
>> +#endif
>> +
>> +
>>   #endif /* #define _C99_MATH_H_ */
>> diff --git a/src/mesa/main/querymatrix.c b/src/mesa/main/querymatrix.c
>> index ef85175..095817c 100644
>> --- a/src/mesa/main/querymatrix.c
>> +++ b/src/mesa/main/querymatrix.c
>> @@ -13,7 +13,7 @@
>>
>>
>>   #include <stdlib.h>
>> -#include <math.h>
>> +#include "c99_math.h"
>>   #include "glheader.h"
>>   #include "querymatrix.h"
>>   #include "main/get.h"
>> @@ -37,55 +37,6 @@
>>   #define INT_TO_FIXED(x) ((GLfixed) ((x) << 16))
>>   #define FLOAT_TO_FIXED(x) ((GLfixed) ((x) * 65536.0))
>>
>> -#if defined(fpclassify)
>> -/* ISO C99 says that fpclassify is a macro.  Assume that any
>> implementation
>> - * of fpclassify, whether it's in a C99 compiler or not, will be a
>> macro.
>> - */
>> -#elif defined(_MSC_VER)
>> -/* Not required on VS2013 and above. */
>> -/* Oddly, the fpclassify() function doesn't exist in such a form
>> - * on MSVC.  This is an implementation using slightly different
>> - * lower-level Windows functions.
>> - */
>> -#include <float.h>
>> -
>> -enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
>> -fpclassify(double x)
>> -{
>> -    switch(_fpclass(x)) {
>> -        case _FPCLASS_SNAN: /* signaling NaN */
>> -        case _FPCLASS_QNAN: /* quiet NaN */
>> -            return FP_NAN;
>> -        case _FPCLASS_NINF: /* negative infinity */
>> -        case _FPCLASS_PINF: /* positive infinity */
>> -            return FP_INFINITE;
>> -        case _FPCLASS_NN:   /* negative normal */
>> -        case _FPCLASS_PN:   /* positive normal */
>> -            return FP_NORMAL;
>> -        case _FPCLASS_ND:   /* negative denormalized */
>> -        case _FPCLASS_PD:   /* positive denormalized */
>> -            return FP_SUBNORMAL;
>> -        case _FPCLASS_NZ:   /* negative zero */
>> -        case _FPCLASS_PZ:   /* positive zero */
>> -            return FP_ZERO;
>> -        default:
>> -            /* Should never get here; but if we do, this will guarantee
>> -             * that the pattern is not treated like a number.
>> -             */
>> -            return FP_NAN;
>> -    }
>> -}
>> -
>> -#else
>> -
>> -enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
>> -fpclassify(double x)
>> -{
>> -   /* XXX do something better someday */
>> -   return FP_NORMAL;
>> -}
>> -
>> -#endif
>>
>>   GLbitfield GLAPIENTRY _mesa_QueryMatrixxOES(GLfixed mantissa[16],
>> GLint exponent[16])
>>   {
>>
>
> Otherwise series looks good.
>
> Jose



More information about the mesa-dev mailing list