[Mesa-dev] [PATCH] mesa: move fpclassify work-arounds into c99_math.h
Brian Paul
brianp at vmware.com
Thu Mar 12 07:38:21 PDT 2015
On 03/12/2015 04:41 AM, Jose Fonseca wrote:
> On 11/03/15 16:48, Brian Paul wrote:
>> v2: Use #error in the #else clause, per Jose.
>> ---
>> include/c99_math.h | 44 ++++++++++++++++++++++++++++++++++++++
>> src/mesa/main/querymatrix.c | 51
>> +--------------------------------------------
>> 2 files changed, 45 insertions(+), 50 deletions(-)
>>
>> diff --git a/include/c99_math.h b/include/c99_math.h
>> index 0a49950..bd35d1b 100644
>> --- a/include/c99_math.h
>> +++ b/include/c99_math.h
>> @@ -161,4 +161,48 @@ 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> */
>> +#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
>> +#error "Need to include or define an fpclassify function"
>> +#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])
>> {
>>
>
> Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
Thanks. Pushed. If this causes any other problems I'm tempted to
simply nuke GL_OES_query_matrix and the _mesa_QueryMatrixxOES() function
which is the only user of fpclassify(). I've never seen an app that
uses this extension and we don't have any piglit tests for it.
-Brian
More information about the mesa-dev
mailing list