1bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/**************************************************************************
2bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *
3bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * All Rights Reserved.
5bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *
6bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu **************************************************************************/
7bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
8bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
9bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/**
10bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Code to implement GL_OES_query_matrix.  See the spec at:
11bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * http://www.khronos.org/registry/gles/extensions/OES/OES_query_matrix.txt
12bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */
13bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
14bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
15bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <stdlib.h>
16bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <math.h>
17bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include "GLES/gl.h"
18bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include "GLES/glext.h"
19bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
20bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
21bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/**
22bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * This is from the GL_OES_query_matrix extension specification:
23bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *
24bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  GLbitfield glQueryMatrixxOES( GLfixed mantissa[16],
25bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *                                GLint   exponent[16] )
26bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  mantissa[16] contains the contents of the current matrix in GLfixed
27bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  format.  exponent[16] contains the unbiased exponents applied to the
28bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  matrix components, so that the internal representation of component i
29bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  is close to mantissa[i] * 2^exponent[i].  The function returns a status
30bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  word which is zero if all the components are valid. If
31bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  status & (1<<i) != 0, the component i is invalid (e.g., NaN, Inf).
32bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  The implementations are not required to keep track of overflows.  In
33bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu *  that case, the invalid bits are never set.
34bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */
35bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
36bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#define INT_TO_FIXED(x) ((GLfixed) ((x) << 16))
37bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#define FLOAT_TO_FIXED(x) ((GLfixed) ((x) * 65536.0))
38bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
3906928ba3c343eee7098442fe387eaacd4933c401Vinson Lee#if defined(_MSC_VER)
40bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/* Oddly, the fpclassify() function doesn't exist in such a form
4106928ba3c343eee7098442fe387eaacd4933c401Vinson Lee * on MSVC.  This is an implementation using slightly different
42bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * lower-level Windows functions.
43bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */
44bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <float.h>
45bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
46bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuenum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
47bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wufpclassify(double x)
48bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{
49bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    switch(_fpclass(x)) {
50bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_SNAN: /* signaling NaN */
51bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_QNAN: /* quiet NaN */
52bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_NAN;
53bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_NINF: /* negative infinity */
54bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_PINF: /* positive infinity */
55bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_INFINITE;
56bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_NN:   /* negative normal */
57bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_PN:   /* positive normal */
58bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_NORMAL;
59bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_ND:   /* negative denormalized */
60bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_PD:   /* positive denormalized */
61bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_SUBNORMAL;
62bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_NZ:   /* negative zero */
63bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        case _FPCLASS_PZ:   /* positive zero */
64bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_ZERO;
65bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        default:
66bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            /* Should never get here; but if we do, this will guarantee
67bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * that the pattern is not treated like a number.
68bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             */
69bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            return FP_NAN;
70bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    }
71bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu}
72791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul
73beb5e1c807bbe90adc7490a043de623d7a3e6e4eAlan Coopersmith#elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \
742f0b01826dbae60fed60c0d744d42a1a4cde4a84Chia-I Wu     defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \
75e1c7f3af0cb6769ef20a954459cfb87b9f99b4d6Vinson Lee     (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \
76a3752fa63bf8b16524ef2840866445247044e07dAlexander von Gluck     (defined(__sun) && defined(__GNUC__)) || defined(ANDROID) || defined(__HAIKU__)
778191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee
788191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee/* fpclassify is available. */
798191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee
80791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul#elif !defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 600
81791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul
82791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paulenum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
83791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paulfpclassify(double x)
84791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul{
85791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul   /* XXX do something better someday */
86791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul   return FP_NORMAL;
87791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul}
88791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul
89bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#endif
90bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
91bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern GLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]);
92bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
93bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/* The Mesa functions we'll need */
94bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern void GL_APIENTRY _mesa_GetIntegerv(GLenum pname, GLint *params);
95bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern void GL_APIENTRY _mesa_GetFloatv(GLenum pname, GLfloat *params);
96bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
97bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I WuGLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16])
98bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{
99bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    GLfloat matrix[16];
100bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    GLint tmp;
101bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    GLenum currentMode = GL_FALSE;
102bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    GLenum desiredMatrix = GL_FALSE;
103bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* The bitfield returns 1 for each component that is invalid (i.e.
104bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * NaN or Inf).  In case of error, everything is invalid.
105bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     */
106bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    GLbitfield rv;
107bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    register unsigned int i;
108bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    unsigned int bit;
109bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
110bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* This data structure defines the mapping between the current matrix
111bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * mode and the desired matrix identifier.
112bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     */
113bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    static struct {
114bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        GLenum currentMode;
115bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        GLenum desiredMatrix;
116bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    } modes[] = {
117bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        {GL_MODELVIEW, GL_MODELVIEW_MATRIX},
118bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        {GL_PROJECTION, GL_PROJECTION_MATRIX},
119bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        {GL_TEXTURE, GL_TEXTURE_MATRIX},
120bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    };
121bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
122bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* Call Mesa to get the current matrix in floating-point form.  First,
123bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * we have to figure out what the current matrix mode is.
124bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     */
125bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    _mesa_GetIntegerv(GL_MATRIX_MODE, &tmp);
126bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    currentMode = (GLenum) tmp;
127bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
128bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* The mode is either GL_FALSE, if for some reason we failed to query
129bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * the mode, or a given mode from the above table.  Search for the
130bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * returned mode to get the desired matrix; if we don't find it,
131bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * we can return immediately, as _mesa_GetInteger() will have
132bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     * logged the necessary error already.
133bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu     */
134bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    for (i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) {
135bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        if (modes[i].currentMode == currentMode) {
136bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            desiredMatrix = modes[i].desiredMatrix;
137bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            break;
138bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        }
139bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    }
140bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    if (desiredMatrix == GL_FALSE) {
141bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        /* Early error means all values are invalid. */
142bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        return 0xffff;
143bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    }
144bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
145bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* Now pull the matrix itself. */
146bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    _mesa_GetFloatv(desiredMatrix, matrix);
147bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
148bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    rv = 0;
149bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    for (i = 0, bit = 1; i < 16; i++, bit<<=1) {
150bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        float normalizedFraction;
151bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        int exp;
152bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
153bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        switch (fpclassify(matrix[i])) {
154bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            /* A "subnormal" or denormalized number is too small to be
155bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * represented in normal format; but despite that it's a
156bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * valid floating point number.  FP_ZERO and FP_NORMAL
157bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * are both valid as well.  We should be fine treating
158bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * these three cases as legitimate floating-point numbers.
159bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             */
160bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            case FP_SUBNORMAL:
161bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            case FP_NORMAL:
162bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            case FP_ZERO:
163bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                normalizedFraction = (GLfloat)frexp(matrix[i], &exp);
164bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                mantissa[i] = FLOAT_TO_FIXED(normalizedFraction);
165bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                exponent[i] = (GLint) exp;
166bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                break;
167bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
168bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            /* If the entry is not-a-number or an infinity, then the
169bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * matrix component is invalid.  The invalid flag for
170bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * the component is already set; might as well set the
171bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * other return values to known values.  We'll set
172bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * distinct values so that a savvy end user could determine
173bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * whether the matrix component was a NaN or an infinity,
174bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * but this is more useful for debugging than anything else
175bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * since the standard doesn't specify any such magic
176bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * values to return.
177bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             */
178bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            case FP_NAN:
179bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                mantissa[i] = INT_TO_FIXED(0);
180bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                exponent[i] = (GLint) 0;
181bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                rv |= bit;
182bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                break;
183bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
184bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            case FP_INFINITE:
185bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                /* Return +/- 1 based on whether it's a positive or
186bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                 * negative infinity.
187bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                 */
188bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                if (matrix[i] > 0) {
189bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                    mantissa[i] = INT_TO_FIXED(1);
190bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                }
191bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                else {
192bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                    mantissa[i] = -INT_TO_FIXED(1);
193bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                }
194bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                exponent[i] = (GLint) 0;
195bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                rv |= bit;
196bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                break;
197bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
198bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            /* We should never get here; but here's a catching case
199bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             * in case fpclassify() is returnings something unexpected.
200bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu             */
201bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu            default:
202bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                mantissa[i] = INT_TO_FIXED(2);
203bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                exponent[i] = (GLint) 0;
204bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                rv |= bit;
205bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu                break;
206bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu        }
207bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
208bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    } /* for each component */
209bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu
210bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    /* All done */
211bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu    return rv;
212bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu}
213