[Mesa-dev] [PATCH] mesa: move fpclassify work-arounds into c99_math.h
Jose Fonseca
jfonseca at vmware.com
Thu Mar 12 03:41:53 PDT 2015
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>
More information about the mesa-dev
mailing list