On Mon, Jan 26, 2015 at 3:27 PM, Ian Romanick <i...@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 */ > > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev