[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