1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file imports.h
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Standard C library function wrappers.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This file provides wrappers for all the standard C library functions
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * like malloc(), free(), printf(), getenv(), etc.
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef IMPORTS_H
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMPORTS_H
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "compiler.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "errors.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Memory macros */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Allocate \p BYTES bytes */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MALLOC(BYTES)      malloc(BYTES)
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Allocate and zero \p BYTES bytes */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CALLOC(BYTES)      calloc(1, BYTES)
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Allocate a structure of type \p T */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MALLOC_STRUCT(T)   (struct T *) malloc(sizeof(struct T))
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Allocate and zero a structure of type \p T */
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Free memory */
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FREE(PTR)          free(PTR)
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For GL_ARB_vertex_buffer_object we need to treat vertex array pointers
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as offsets into buffer stores.  Since the vertex array pointer and
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer store pointer are both pointers and we need to add them, we use
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this macro.
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Both pointers/offsets are expressed in bytes.
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ADD_POINTERS(A, B)  ( (GLubyte *) (A) + (uintptr_t) (B) )
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sometimes we treat GLfloats as GLints.  On x86 systems, moving a float
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as a int (thereby using integer registers instead of FP registers) is
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a performance win.  Typically, this can be done with ordinary casts.
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0)
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * these casts generate warnings.
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The following union typedef is used to solve that.
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef union { GLfloat f; GLint i; GLuint u; } fi_type;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Math macros
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_GLUSHORT	0xffff
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_GLUINT	0xffffffff
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Degrees to radians conversion: */
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEG2RAD (M_PI/180.0)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** SQRTF: single-precision square root
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SQRTF(X)  (float) sqrt((float) (X))
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** INV_SQRTF: single-precision inverse square root
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INV_SQRTF(X) (1.0F / SQRTF(X))
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \name Work-arounds for platforms that lack C99 math functions
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@{*/
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 600)) && !defined(_ISOC99_SOURCE) \
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)) \
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   && (!defined(_MSC_VER) || (_MSC_VER < 1400))
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define acosf(f) ((float) acos(f))
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define asinf(f) ((float) asin(f))
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define atan2f(x,y) ((float) atan2(x,y))
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define atanf(f) ((float) atan(f))
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ceilf(f) ((float) ceil(f))
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define cosf(f) ((float) cos(f))
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define coshf(f) ((float) cosh(f))
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define expf(f) ((float) exp(f))
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define exp2f(f) ((float) exp2(f))
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define floorf(f) ((float) floor(f))
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define logf(f) ((float) log(f))
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef ANDROID
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define log2f(f) (logf(f) * (float) (1.0 / M_LN2))
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define log2f(f) ((float) log2(f))
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define powf(x,y) ((float) pow(x,y))
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define sinf(f) ((float) sin(f))
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define sinhf(f) ((float) sinh(f))
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define sqrtf(f) ((float) sqrt(f))
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define tanf(f) ((float) tan(f))
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define tanhf(f) ((float) tanh(f))
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define acoshf(f) ((float) acosh(f))
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define asinhf(f) ((float) asinh(f))
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define atanhf(f) ((float) atanh(f))
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_MSC_VER)
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float truncf(float x) { return x < 0.0f ? ceilf(x) : floorf(x); }
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float exp2f(float x) { return powf(2.0f, x); }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float log2f(float x) { return logf(x) * 1.442695041f; }
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float asinhf(float x) { return logf(x + sqrtf(x * x + 1.0f)); }
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int isblank(int ch) { return ch == ' ' || ch == '\t'; }
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define strtoll(p, e, b) _strtoi64(p, e, b)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** LOG2: Log base 2 of float
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_IEEE
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is pretty fast, but not accurate enough (only 2 fractional bits).
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Based on code from http://www.stereopsis.com/log2.html
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLfloat LOG2(GLfloat x)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat y = x * x * x * x;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint ix = *((GLuint *) &y);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint exp = (ix >> 23) & 0xFF;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint log2 = ((GLint) exp) - 127;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLfloat) log2 * (1.0 / 4.0);  /* 4, because of x^4 above */
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Pretty fast, and accurate.
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Based on code from http://www.flipcode.com/totd/
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLfloat LOG2(GLfloat val)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi_type num;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint log_2;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num.f = val;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   log_2 = ((num.i >> 23) & 255) - 128;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num.i &= ~(255 << 23);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num.i += 127 << 23;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return num.f + log_2;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NOTE: log_base_2(x) = log(x) / log(2)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NOTE: 1.442695 = 1/log(2).
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOG2(x)  ((GLfloat) (log(x) * 1.442695F))
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** IS_INF_OR_NAN: test if float is infinite or NaN
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_IEEE
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int IS_INF_OR_NAN( float x )
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi_type tmp;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tmp.f = x;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(isfinite)
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_INF_OR_NAN(x)        (!isfinite(x))
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(finite)
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_INF_OR_NAN(x)        (!finite(x))
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__VMS)
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_INF_OR_NAN(x)        (!finite(x))
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_INF_OR_NAN(x)        (!isfinite(x))
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_INF_OR_NAN(x)        (!finite(x))
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** IS_NEGATIVE: test if float is negative
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_IEEE)
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int GET_FLOAT_BITS( float x )
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi_type fi;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi.f = x;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return fi.i;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) < 0)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_NEGATIVE(x) (x < 0.0F)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** DIFFERENT_SIGNS: test if two floats have opposite signs
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_IEEE)
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DIFFERENT_SIGNS(x,y) ((GET_FLOAT_BITS(x) ^ GET_FLOAT_BITS(y)) & (1<<31))
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Could just use (x*y<0) except for the flatshading requirements.
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Maybe there's a better way?
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DIFFERENT_SIGNS(x,y) ((x) * (y) <= 0.0F && (x) - (y) != 0.0F)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** CEILF: ceiling of float
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** FLOORF: floor of float
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** FABSF: absolute value of float
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** LOGF: the natural logarithm (base e) of the value
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** EXPF: raise e to the value
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** LDEXPF: multiply value by an integral power of two
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** FREXPF: extract mantissa and exponent from value
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__gnu_linux__)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* C99 functions */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CEILF(x)   ceilf(x)
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLOORF(x)  floorf(x)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FABSF(x)   fabsf(x)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOGF(x)    logf(x)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPF(x)    expf(x)
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LDEXPF(x,y)  ldexpf(x,y)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FREXPF(x,y)  frexpf(x,y)
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CEILF(x)   ((GLfloat) ceil(x))
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLOORF(x)  ((GLfloat) floor(x))
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FABSF(x)   ((GLfloat) fabs(x))
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOGF(x)    ((GLfloat) log(x))
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPF(x)    ((GLfloat) exp(x))
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LDEXPF(x,y)  ((GLfloat) ldexp(x,y))
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FREXPF(x,y)  ((GLfloat) frexp(x,y))
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert float to int by rounding to nearest integer, away from zero.
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int IROUND(float f)
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (int) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F));
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert float to int64 by rounding to nearest integer.
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLint64 IROUND64(float f)
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLint64) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F));
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert positive float to int by rounding to nearest integer.
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int IROUND_POS(float f)
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(f >= 0.0F);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (int) (f + 0.5F);
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert float to int using a fast method.  The rounding mode may vary.
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX We could use an x86-64/SSE2 version here.
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int F_TO_I(float f)
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int r;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st");
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return r;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(USE_X86_ASM) && defined(_MSC_VER)
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int F_TO_I(float f)
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int r;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _asm {
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fld f
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fistp r
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return r;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__WATCOMC__) && defined(__386__)
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglong F_TO_I(float f);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#pragma aux iround =                    \
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	"push   eax"                        \
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	"fistp  dword ptr [esp]"            \
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	"pop    eax"                        \
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	parm [8087]                         \
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	value [eax]                         \
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	modify exact [eax];
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define F_TO_I(f)  IROUND(f)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** IFLOOR: return (as an integer) floor of float
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IEEE floor for computers that round to nearest or even.
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 'f' must be between -4194304 and 4194303.
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1",
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but uses some IEEE specific tricks for better speed.
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Contributed by Josh Vanderhoof
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int ifloor(float f)
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ai, bi;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double af, bf;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   af = (3 << 22) + 0.5 + (double)f;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bf = (3 << 22) + 0.5 - (double)f;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* GCC generates an extra fstp/fld without this. */
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (ai - bi) >> 1;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IFLOOR(x)  ifloor(x)
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(USE_IEEE)
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int ifloor(float f)
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ai, bi;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double af, bf;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi_type u;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   af = (3 << 22) + 0.5 + (double)f;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bf = (3 << 22) + 0.5 - (double)f;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u.f = (float) af;  ai = u.i;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u.f = (float) bf;  bi = u.i;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (ai - bi) >> 1;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IFLOOR(x)  ifloor(x)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int ifloor(float f)
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i = IROUND(f);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (i > f) ? i - 1 : i;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IFLOOR(x)  ifloor(x)
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *** ICEIL: return (as an integer) ceiling of float
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***/
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IEEE ceil for computers that round to nearest or even.
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 'f' must be between -4194304 and 4194303.
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1",
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but uses some IEEE specific tricks for better speed.
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Contributed by Josh Vanderhoof
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int iceil(float f)
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ai, bi;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double af, bf;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   af = (3 << 22) + 0.5 + (double)f;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bf = (3 << 22) + 0.5 - (double)f;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* GCC generates an extra fstp/fld without this. */
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (ai - bi + 1) >> 1;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ICEIL(x)  iceil(x)
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(USE_IEEE)
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int iceil(float f)
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ai, bi;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double af, bf;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fi_type u;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   af = (3 << 22) + 0.5 + (double)f;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bf = (3 << 22) + 0.5 - (double)f;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u.f = (float) af; ai = u.i;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u.f = (float) bf; bi = u.i;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (ai - bi + 1) >> 1;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ICEIL(x)  iceil(x)
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int iceil(float f)
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i = IROUND(f);
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (i < f) ? i + 1 : i;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ICEIL(x)  iceil(x)
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Is x a power of two?
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_pow_two(int x)
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return !(x & (x - 1));
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Round given integer to next higer power of two
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If X is zero result is undefined.
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Source for the fallback implementation is
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sean Eron Anderson's webpage "Bit Twiddling Hacks"
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * http://graphics.stanford.edu/~seander/bithacks.html
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When using builtin function have to do some work
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for case when passed values 1 to prevent hiting
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * undefined result from __builtin_clz. Undefined
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * results would be different depending on optimization
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level used for build.
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int32_t
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_next_pow_two_32(uint32_t x)
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && \
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t y = (x != 1);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return (1 + y) << ((__builtin_clz(x - y) ^ 31) );
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x--;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 1;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 2;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 4;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 8;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 16;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x++;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return x;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline int64_t
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_next_pow_two_64(uint64_t x)
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && \
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint64_t y = (x != 1);
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sizeof(x) == sizeof(long))
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return (1 + y) << ((__builtin_clzl(x - y) ^ 63));
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return (1 + y) << ((__builtin_clzll(x - y) ^ 63));
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x--;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 1;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 2;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 4;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 8;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 16;
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x |= x >> 32;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	x++;
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return x;
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Returns the floor form of binary logarithm for a 32-bit integer.
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLuint
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_logbase2(GLuint n)
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && \
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (31 - __builtin_clz(n | 1));
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint pos = 0;
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n >= 1<<16) { n >>= 16; pos += 16; }
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n >= 1<< 8) { n >>=  8; pos +=  8; }
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n >= 1<< 4) { n >>=  4; pos +=  4; }
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n >= 1<< 2) { n >>=  2; pos +=  2; }
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n >= 1<< 1) {           pos +=  1; }
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pos;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return 1 if this is a little endian machine, 0 if big endian.
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLboolean
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_little_endian(void)
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint ui = 1; /* intentionally not static */
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return *((const GLubyte *) &ui);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Functions
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_align_malloc( size_t bytes, unsigned long alignment );
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_align_calloc( size_t bytes, unsigned long alignment );
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_align_free( void *ptr );
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_align_realloc(void *oldBuffer, size_t oldSize, size_t newSize,
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    unsigned long alignment);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_exec_malloc( GLuint size );
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_exec_free( void *addr );
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_realloc( void *oldBuffer, size_t oldSize, size_t newSize );
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef FFS_DEFINED
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FFS_DEFINED 1
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __GNUC__
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(ANDROID) || defined(__APPLE__)
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ffs __builtin_ffs
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ffsll __builtin_ffsll
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int ffs(int i);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int ffsll(long long int i);
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /*__ GNUC__ */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FFS_DEFINED */
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_bitcount(i) __builtin_popcount(i)
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_bitcount_64(i) __builtin_popcountll(i)
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern unsigned int
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_bitcount(unsigned int n);
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern unsigned int
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_bitcount_64(uint64_t n);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the last (most significant) bit set in a word.
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Essentially ffs() in the reverse direction.
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline unsigned int
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fls(unsigned int n)
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304)
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return n == 0 ? 0 : 32 - __builtin_clz(n);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int v = 1;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n == 0)
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (n >>= 1)
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       v++;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return v;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLhalfARB
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_float_to_half(float f);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern float
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_half_to_float(GLhalfARB h);
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_bsearch( const void *key, const void *base, size_t nmemb, size_t size,
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               int (*compar)(const void *, const void *) );
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern char *
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_getenv( const char *var );
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern char *
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_strdup( const char *s );
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern float
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_strtof( const char *s, char **end );
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern unsigned int
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_str_checksum(const char *str);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_snprintf( char *str, size_t size, const char *fmt, ... ) PRINTFLIKE(3, 4);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_vsnprintf(char *str, size_t size, const char *fmt, va_list arg);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_MSC_VER) && !defined(snprintf)
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define snprintf _snprintf
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* IMPORTS_H */
654