[Mesa-dev] [PATCH 1/2] util: Move the alternate fpclassify implementation to util

Jason Ekstrand jason at jlekstrand.net
Mon Jan 26 15:37:44 PST 2015


On Mon, Jan 26, 2015 at 3:27 PM, Ian Romanick <idr at freedesktop.org> wrote:

> 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. :)
>

done

>
> 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 */
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150126/b1f6dd0b/attachment-0001.html>


More information about the mesa-dev mailing list