[Mesa-dev] [PATCH 1/2] util: Move the alternate fpclassify implementation to util
Ian Romanick
idr at freedesktop.org
Mon Jan 26 15:27:15 PST 2015
I think the functions in the header file need to be 'static inline'.
Otherwise linking will fail platforms that don't have fpclassify...
which defeats the purpose. :)
On 01/26/2015 02:22 PM, Jason Ekstrand wrote:
> ---
> src/mesa/main/querymatrix.c | 51 +-------------------------------------------
> src/util/macros.h | 52 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+), 50 deletions(-)
>
> diff --git a/src/mesa/main/querymatrix.c b/src/mesa/main/querymatrix.c
> index ef85175..d2d643b 100644
> --- a/src/mesa/main/querymatrix.c
> +++ b/src/mesa/main/querymatrix.c
> @@ -17,6 +17,7 @@
> #include "glheader.h"
> #include "querymatrix.h"
> #include "main/get.h"
> +#include "util/macros.h"
>
>
> /**
> @@ -37,56 +38,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])
> {
> GLfloat matrix[16];
> diff --git a/src/util/macros.h b/src/util/macros.h
> index eec8b93..a0c3ecf 100644
> --- a/src/util/macros.h
> +++ b/src/util/macros.h
> @@ -24,6 +24,8 @@
> #ifndef UTIL_MACROS_H
> #define UTIL_MACROS_H
>
> +#include <math.h>
> +
> /* Compute the size of an array */
> #ifndef ARRAY_SIZE
> # define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
> @@ -156,4 +158,54 @@ do { \
> # endif
> #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(_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
> +
> #endif /* UTIL_MACROS_H */
>
More information about the mesa-dev
mailing list