compiler.h revision cbb2b4149ba26ee26f73f53e9b2aa960d9e5862c
19d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek/*
29d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Mesa 3-D graphics library
39d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Version:  7.5
49d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek *
59d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
69d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
79d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek *
89d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Permission is hereby granted, free of charge, to any person obtaining a
99d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * copy of this software and associated documentation files (the "Software"),
109d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * to deal in the Software without restriction, including without limitation
119d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * the rights to use, copy, modify, merge, publish, distribute, sublicense,
129d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * and/or sell copies of the Software, and to permit persons to whom the
139d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * Software is furnished to do so, subject to the following conditions:
149d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek *
152d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall * The above copyright notice and this permission notice shall be included
1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * in all copies or substantial portions of the Software.
177cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall *
1857e264e9f4ff0a72f3585a960cdf63437b76fa93Fariborz Jahanian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2450df6ae41f232612e5e88b19e0db9900d08d2f6cJohn McCall */
258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer
269d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek
279d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek/**
289d64c15223497f31899cc47fbe1531873dc06f2eTed Kremenek * \file compiler.h
2928685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek * Compiler-related stuff.
3028685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek */
3128685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek
3228685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek
33265941bc308d65cc270d5c4de5806f37ce405606John McCall#ifndef COMPILER_H
34265941bc308d65cc270d5c4de5806f37ce405606John McCall#define COMPILER_H
35265941bc308d65cc270d5c4de5806f37ce405606John McCall
36265941bc308d65cc270d5c4de5806f37ce405606John McCall
37265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <assert.h>
38265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <ctype.h>
39265941bc308d65cc270d5c4de5806f37ce405606John McCall#if defined(__alpha__) && defined(CCPML)
40265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <cpml.h> /* use Compaq's Fast Math Library on Alpha */
41265941bc308d65cc270d5c4de5806f37ce405606John McCall#else
42265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <math.h>
43265941bc308d65cc270d5c4de5806f37ce405606John McCall#endif
44265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <limits.h>
45265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <stdlib.h>
46265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <stdio.h>
47d64c2eb83d7ec86faa4f2554935a977a19573f59John McCall#include <string.h>
48265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <float.h>
49265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <stdarg.h>
50265941bc308d65cc270d5c4de5806f37ce405606John McCall
51265941bc308d65cc270d5c4de5806f37ce405606John McCall
52265941bc308d65cc270d5c4de5806f37ce405606John McCall#ifdef __cplusplus
53265941bc308d65cc270d5c4de5806f37ce405606John McCallextern "C" {
54265941bc308d65cc270d5c4de5806f37ce405606John McCall#endif
55265941bc308d65cc270d5c4de5806f37ce405606John McCall
56265941bc308d65cc270d5c4de5806f37ce405606John McCall
57265941bc308d65cc270d5c4de5806f37ce405606John McCall/**
58265941bc308d65cc270d5c4de5806f37ce405606John McCall * Get standard integer types
59265941bc308d65cc270d5c4de5806f37ce405606John McCall */
60265941bc308d65cc270d5c4de5806f37ce405606John McCall#include <stdint.h>
61265941bc308d65cc270d5c4de5806f37ce405606John McCall
62265941bc308d65cc270d5c4de5806f37ce405606John McCall
63265941bc308d65cc270d5c4de5806f37ce405606John McCall/**
64f85e193739c953358c865005855253af4f68a497John McCall  * Sun compilers define __i386 instead of the gcc-style __i386__
65f85e193739c953358c865005855253af4f68a497John McCall */
66f85e193739c953358c865005855253af4f68a497John McCall#ifdef __SUNPRO_C
67f85e193739c953358c865005855253af4f68a497John McCall# if !defined(__i386__) && defined(__i386)
68f85e193739c953358c865005855253af4f68a497John McCall#  define __i386__
69f85e193739c953358c865005855253af4f68a497John McCall# elif !defined(__amd64__) && defined(__amd64)
70f85e193739c953358c865005855253af4f68a497John McCall#  define __amd64__
71f85e193739c953358c865005855253af4f68a497John McCall# elif !defined(__sparc__) && defined(__sparc)
72f85e193739c953358c865005855253af4f68a497John McCall#  define __sparc__
73f85e193739c953358c865005855253af4f68a497John McCall# endif
74f85e193739c953358c865005855253af4f68a497John McCall# if !defined(__volatile)
75f85e193739c953358c865005855253af4f68a497John McCall#  define __volatile volatile
76265941bc308d65cc270d5c4de5806f37ce405606John McCall# endif
77265941bc308d65cc270d5c4de5806f37ce405606John McCall#endif
78265941bc308d65cc270d5c4de5806f37ce405606John McCall
79f85e193739c953358c865005855253af4f68a497John McCall
80265941bc308d65cc270d5c4de5806f37ce405606John McCall/**
81265941bc308d65cc270d5c4de5806f37ce405606John McCall * finite macro.
82265941bc308d65cc270d5c4de5806f37ce405606John McCall */
83265941bc308d65cc270d5c4de5806f37ce405606John McCall#if defined(_MSC_VER)
84265941bc308d65cc270d5c4de5806f37ce405606John McCall#  define finite _finite
85265941bc308d65cc270d5c4de5806f37ce405606John McCall#elif defined(__WATCOMC__)
86265941bc308d65cc270d5c4de5806f37ce405606John McCall#  define finite _finite
87265941bc308d65cc270d5c4de5806f37ce405606John McCall#endif
88265941bc308d65cc270d5c4de5806f37ce405606John McCall
89265941bc308d65cc270d5c4de5806f37ce405606John McCall
90265941bc308d65cc270d5c4de5806f37ce405606John McCall/**
91265941bc308d65cc270d5c4de5806f37ce405606John McCall * Disable assorted warnings
92265941bc308d65cc270d5c4de5806f37ce405606John McCall */
93f85e193739c953358c865005855253af4f68a497John McCall#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) && !defined(BUILD_FOR_SNAP)
94f85e193739c953358c865005855253af4f68a497John McCall#  if !defined(__GNUC__) /* mingw environment */
95f85e193739c953358c865005855253af4f68a497John McCall#    pragma warning( disable : 4068 ) /* unknown pragma */
96f85e193739c953358c865005855253af4f68a497John McCall#    pragma warning( disable : 4710 ) /* function 'foo' not inlined */
97f85e193739c953358c865005855253af4f68a497John McCall#    pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */
98f85e193739c953358c865005855253af4f68a497John McCall#    pragma warning( disable : 4127 ) /* conditional expression is constant */
99f85e193739c953358c865005855253af4f68a497John McCall#    if defined(MESA_MINWARN)
100b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis#      pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */
101f85e193739c953358c865005855253af4f68a497John McCall#      pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */
102265941bc308d65cc270d5c4de5806f37ce405606John McCall#      pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */
103f85e193739c953358c865005855253af4f68a497John McCall#      pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */
104f85e193739c953358c865005855253af4f68a497John McCall#      pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */
105f85e193739c953358c865005855253af4f68a497John McCall#    endif
106dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#  endif
107dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#endif
108dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#if defined(__WATCOMC__)
109dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#  pragma disable_message(201) /* Disable unreachable code warnings */
110dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#endif
111dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
112dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
113dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
114dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian/**
115b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor * Function inlining
116b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor */
117b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#ifndef inline
118b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  ifdef __cplusplus
119b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor     /* C++ supports inline keyword */
120b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(__GNUC__)
121b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    define inline __inline__
122b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(_MSC_VER)
123b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    define inline __inline
124b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(__ICL)
125b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    define inline __inline
126b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(__INTEL_COMPILER)
127b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor     /* Intel compiler supports inline keyword */
128b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
129b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    define inline __inline
130b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
131b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor     /* C99 supports inline keyword */
132b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif (__STDC_VERSION__ >= 199901L)
133b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor     /* C99 supports inline keyword */
134b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  else
135b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    define inline
136b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  endif
137b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#endif
138b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#ifndef INLINE
139b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  define INLINE inline
140b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#endif
141b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor
142d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall
14377bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian/**
144d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall * PUBLIC/USED macros
145d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall *
146d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall * If we build the library with gcc's -fvisibility=hidden flag, we'll
147d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall * use the PUBLIC macro to mark functions that are to be exported.
148d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall *
1494a2e9ea0c191176ebe996516a9cf4f93b7e932ccTed Kremenek * We also need to define a USED attribute, so the optimizer doesn't
1504a2e9ea0c191176ebe996516a9cf4f93b7e932ccTed Kremenek * inline a static function that we later use in an alias. - ajax
151ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling */
152f85e193739c953358c865005855253af4f68a497John McCall#ifndef PUBLIC
153f85e193739c953358c865005855253af4f68a497John McCall#  if (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
154ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#    define PUBLIC __attribute__((visibility("default")))
155dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#    define USED __attribute__((used))
156ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#  else
15728685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek#    define PUBLIC
158ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#    define USED
15928685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek#  endif
16028685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek#endif
161ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling
16228685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek
163ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling/**
164ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling * Some compilers don't like some of Mesa's const usage.  In those places use
165ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling * CONST instead of const.  Pass -DNO_CONST to compilers where this matters.
166ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling */
167ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#ifdef NO_CONST
16814086764e340267e17803d0f8243070ffae2c76eFariborz Jahanian#  define CONST
169aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#else
170a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian#  define CONST const
171aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#endif
172aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor
173ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian
174aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor/**
175ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian * __builtin_expect macros
176ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian */
177ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#if !defined(__GNUC__)
178dbbdec994f5a96b5c25aaa679cd86ecabf545f7bArgyrios Kyrtzidis#  define __builtin_expect(x, y) (x)
179ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian#endif
180ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian
181aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#ifndef likely
182aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#  ifdef __GNUC__
183ae415dc21ee6402cee1675ec8bb965a24f9e5b6bFariborz Jahanian#    define likely(x)   __builtin_expect(!!(x), 1)
184aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#    define unlikely(x) __builtin_expect(!!(x), 0)
185aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#  else
186aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#    define likely(x)   (x)
187aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#    define unlikely(x) (x)
188aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#  endif
189aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#endif
190aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor
191aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor/**
192aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor * The __FUNCTION__ gcc variable is generally only used for debugging.
193aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
1944a2e9ea0c191176ebe996516a9cf4f93b7e932ccTed Kremenek * Don't define it if using a newer Windows compiler.
195842f07b065ac481fce9d82d55cb62e36bac6c921Fariborz Jahanian */
196ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#ifndef __FUNCTION__
197cea06d26b8f3a2599bba79f7e072b7550de949a7Fariborz Jahanian# if defined(__VMS)
198cea06d26b8f3a2599bba79f7e072b7550de949a7Fariborz Jahanian#  define __FUNCTION__ "VMS$NL:"
199f85e193739c953358c865005855253af4f68a497John McCall# elif !defined(__GNUC__) && !defined(__xlC__) &&	\
2004e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      (!defined(_MSC_VER) || _MSC_VER < 1300)
201f85e193739c953358c865005855253af4f68a497John McCall#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
202f85e193739c953358c865005855253af4f68a497John McCall    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
203b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#   define __FUNCTION__ __func__
204aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#  else
205b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#   define __FUNCTION__ "<unknown>"
206b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  endif
207aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor# endif
208aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#endif
209b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#ifndef __func__
210b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  if (__STDC_VERSION__ >= 199901L) || \
211aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor      (defined(__SUNPRO_C) && defined(__C99FEATURES__))
212b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor       /* __func__ is part of C99 */
213b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  elif defined(_MSC_VER)
214b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    if _MSC_VER >= 1300
215b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#      define __func__ __FUNCTION__
216b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    else
217b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#      define __func__ "<unknown>"
218b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#    endif
219b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#  endif
220b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#endif
221b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor
222b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor
223b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor/**
224b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32.
225b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor * Do not use these unless absolutely necessary!
226b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor * Try to use a runtime test instead.
227b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor * For now, only used by some DRI hardware drivers for color/texel packing.
228b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor */
229b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
230b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#if defined(__linux__)
231b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#include <byteswap.h>
232b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#define CPU_TO_LE32( x )	bswap_32( x )
233b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#elif defined(__APPLE__)
234b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#include <CoreFoundation/CFByteOrder.h>
235b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#define CPU_TO_LE32( x )	CFSwapInt32HostToLittle( x )
236b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#elif (defined(_AIX) || defined(__blrts))
237b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregorstatic INLINE GLuint CPU_TO_LE32(GLuint x)
238b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor{
239b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor   return (((x & 0x000000ff) << 24) |
240b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor           ((x & 0x0000ff00) <<  8) |
241b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor           ((x & 0x00ff0000) >>  8) |
242b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor           ((x & 0xff000000) >> 24));
243b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor}
244b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#else /*__linux__ */
245b892d7010f9c2c61e2f3a2686546cbfbffbedef3Douglas Gregor#include <sys/endian.h>
246aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#define CPU_TO_LE32( x )	bswap32( x )
247aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#endif /*__linux__*/
248aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor#define MESA_BIG_ENDIAN 1
249abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko#else
250842f07b065ac481fce9d82d55cb62e36bac6c921Fariborz Jahanian#define CPU_TO_LE32( x )	( x )
251e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define MESA_LITTLE_ENDIAN 1
252e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#endif
253b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define LE32_TO_CPU( x )	CPU_TO_LE32( x )
254ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling
255b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis
256ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling
257b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#if !defined(CAPI) && defined(WIN32) && !defined(BUILD_FOR_SNAP)
258ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#define CAPI _cdecl
259b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#endif
260ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling
261b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis
262ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling/**
263b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis * Create a macro so that asm functions can be linked into compilers other
264ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling * than GNU C
265b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis */
266ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#ifndef _ASMAPI
267b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#if defined(WIN32) && !defined(BUILD_FOR_SNAP)/* was: !defined( __GNUC__ ) && !defined( VMS ) && !defined( __INTEL_COMPILER )*/
268ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#define _ASMAPI __cdecl
269b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#else
270ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#define _ASMAPI
271b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#endif
272ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#ifdef	PTR_DECL_IN_FRONT
273b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define	_ASMAPIP * _ASMAPI
274ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#else
275b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define	_ASMAPIP _ASMAPI *
276ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#endif
277b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#endif
278ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling
279b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#ifdef USE_X86_ASM
280b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define _NORMAPI _ASMAPI
281b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define _NORMAPIP _ASMAPIP
282b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#else
283b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis#define _NORMAPI
2845bf0e3522fac400cf7bf49a775554f0fc942b336Fariborz Jahanian#define _NORMAPIP *
285edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#endif
286edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
287edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
288edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian/* This is a macro on IRIX */
289edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#ifdef _P
290edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#undef _P
291edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#endif
292edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
293edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
294edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian/* Turn off macro checking systems used by other libraries */
295edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#ifdef CHECK
296edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#undef CHECK
297edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#endif
298edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
299edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
300edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian/**
301edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian * ASSERT macro
302edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian */
303edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#if !defined(_WIN32_WCE)
304edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#if defined(BUILD_FOR_SNAP) && defined(CHECKED)
305edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#  define ASSERT(X)   _CHECK(X)
306edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#elif defined(DEBUG)
307edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#  define ASSERT(X)   assert(X)
308edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#else
309edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#  define ASSERT(X)
310edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#endif
311edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian#endif
312edcc27f6171fd8cc736d057d87b128252fcb7344Fariborz Jahanian
3132b309fb125906b1fb10efb1890860cd042fbfab3Fariborz Jahanian#if (__GNUC__ >= 3)
3142b309fb125906b1fb10efb1890860cd042fbfab3Fariborz Jahanian#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
315d9f95b35dc4fc168a167a9b9b61a5f9e1d0462baFariborz Jahanian#else
316dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#define PRINTFLIKE(f, a)
317dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#endif
318dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
319dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#ifndef NULL
320dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#define NULL 0
321dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#endif
322dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
323dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian
324aabd094cf694039fe823987e133af7ac25cb9711Douglas Gregor/**
325a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian * LONGSTRING macro
32677bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian * gcc -pedantic warns about long string literals, LONGSTRING silences that.
32777bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian */
32877bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian#if !defined(__GNUC__)
329e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek# define LONGSTRING
330e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#else
331e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek# define LONGSTRING __extension__
332ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#endif
333dbbdec994f5a96b5c25aaa679cd86ecabf545f7bArgyrios Kyrtzidis
334e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
33583a230c83a54190366138c1a4f4310ef838b88fcJohn McCall#ifndef M_PI
336e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define M_PI (3.14159265358979323846)
33758a764940df0cd41767367eb2f4fced6f374176bFariborz Jahanian#endif
338e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
339a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian#ifndef M_E
340e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define M_E (2.7182818284590452354)
3412a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian#endif
3422a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian
343d329724745b49f894b768d47275b7c2713106e89Douglas Gregor#ifndef M_LOG2E
3442a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian#define M_LOG2E     (1.4426950408889634074)
3452a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian#endif
346d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
347d329724745b49f894b768d47275b7c2713106e89Douglas Gregor#ifndef ONE_DIV_SQRT_LN2
348d329724745b49f894b768d47275b7c2713106e89Douglas Gregor#define ONE_DIV_SQRT_LN2 (1.201122408786449815)
349d329724745b49f894b768d47275b7c2713106e89Douglas Gregor#endif
350d329724745b49f894b768d47275b7c2713106e89Douglas Gregor
351d329724745b49f894b768d47275b7c2713106e89Douglas Gregor#ifndef FLT_MAX_EXP
3522a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian#define FLT_MAX_EXP 128
3532a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian#endif
3542a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian
3552a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian
3562a2891410b02d146b779cdb29eeb9b6d1a9fa030Fariborz Jahanian/**
357d329724745b49f894b768d47275b7c2713106e89Douglas Gregor * USE_IEEE: Determine if we're using IEEE floating point
358d329724745b49f894b768d47275b7c2713106e89Douglas Gregor */
359e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#if defined(__i386__) || defined(__386__) || defined(__sparc__) || \
360e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek    defined(__s390x__) || defined(__powerpc__) || \
36188f5e9be350f4b107f8665183a6d441874e0fcc7Fariborz Jahanian    defined(__x86_64__) || \
362e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek    defined(ia64) || defined(__ia64__) || \
363e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek    defined(__hppa__) || defined(hpux) || \
36477bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian    defined(__mips) || defined(_MIPS_ARCH) || \
365b98ffded10453d80369951f33f3892f35d747c95Argyrios Kyrtzidis    defined(__arm__) || \
366dbbdec994f5a96b5c25aaa679cd86ecabf545f7bArgyrios Kyrtzidis    defined(__sh__) || defined(__m32r__) || \
367ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling    (defined(__sun) && defined(_IEEE_754)) || \
36822f757b38da3fc9f17ea9e99524064fdfbca3456Fariborz Jahanian    (defined(__alpha__) && (defined(__IEEE_FLOAT) || !defined(VMS)))
369ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#define USE_IEEE
37022f757b38da3fc9f17ea9e99524064fdfbca3456Fariborz Jahanian#define IEEE_ONE 0x3f800000
371b7b25659355d736a4f19099d96acc54d672340a5Fariborz Jahanian#endif
372b7b25659355d736a4f19099d96acc54d672340a5Fariborz Jahanian
373b7b25659355d736a4f19099d96acc54d672340a5Fariborz Jahanian
374b7b25659355d736a4f19099d96acc54d672340a5Fariborz Jahanian/**
37588f5e9be350f4b107f8665183a6d441874e0fcc7Fariborz Jahanian * START/END_FAST_MATH macros:
37688f5e9be350f4b107f8665183a6d441874e0fcc7Fariborz Jahanian *
37788f5e9be350f4b107f8665183a6d441874e0fcc7Fariborz Jahanian * START_FAST_MATH: Set x86 FPU to faster, 32-bit precision mode (and save
37891ae6b43b3a294243698cdb544dd7a18efa4c7a8Douglas Gregor *                  original mode to a temporary).
379e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * END_FAST_MATH: Restore x86 FPU to original mode.
380e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek */
381e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#if defined(__GNUC__) && defined(__i386__)
382e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek/*
383e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * Set the x86 FPU control word to guarentee only 32 bits of precision
384e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * are stored in registers.  Allowing the FPU to store more introduces
385e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * differences between situations where numbers are pulled out of memory
386d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall * vs. situations where the compiler is able to optimize register usage.
387e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek *
388e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * In the worst case, we force the compiler to use a memory access to
389e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * truncate the float, by specifying the 'volatile' keyword.
390e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek */
391e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek/* Hardware default: All exceptions masked, extended double precision,
392e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * round to nearest (IEEE compliant):
393e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek */
394e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define DEFAULT_X86_FPU		0x037f
395e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek/* All exceptions masked, single precision, round to nearest:
396d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis */
39777bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian#define FAST_X86_FPU		0x003f
398e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek/* The fldcw instruction will cause any pending FP exceptions to be
399ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling * raised prior to entering the block, and we clear any pending
400e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * exceptions before exiting the block.  Hence, asm code has free
401e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek * reign over the FPU while in the fast math block.
402e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek */
403e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#if defined(NO_FAST_MATH)
404d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis#define START_FAST_MATH(x)						\
405a054fb46b1fb596d1719b89d2d9a5be3c32a4b0dTed Kremenekdo {									\
406d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis   static GLuint mask = DEFAULT_X86_FPU;				\
407d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis   __asm__ ( "fnstcw %0" : "=m" (*&(x)) );				\
408c80553efdc269dabd4ed0c3210555f45729ab5ddArgyrios Kyrtzidis   __asm__ ( "fldcw %0" : : "m" (mask) );				\
409d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis} while (0)
410d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis#else
411e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define START_FAST_MATH(x)						\
412e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahaniando {									\
413e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian   static GLuint mask = FAST_X86_FPU;					\
414e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian   __asm__ ( "fnstcw %0" : "=m" (*&(x)) );				\
415ff2a0ecae1d7692dbb63aa540dba41a8c21d7ee4Fariborz Jahanian   __asm__ ( "fldcw %0" : : "m" (mask) );				\
416ff2a0ecae1d7692dbb63aa540dba41a8c21d7ee4Fariborz Jahanian} while (0)
417ad7eff2faf517779689327dc268817c2c2c8ebc4Fariborz Jahanian#endif
418ad7eff2faf517779689327dc268817c2c2c8ebc4Fariborz Jahanian/* Restore original FPU mode, and clear any exceptions that may have
419ad7eff2faf517779689327dc268817c2c2c8ebc4Fariborz Jahanian * occurred in the FAST_MATH block.
420ad7eff2faf517779689327dc268817c2c2c8ebc4Fariborz Jahanian */
421e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian#define END_FAST_MATH(x)						\
422e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahaniando {									\
423e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian   __asm__ ( "fnclex ; fldcw %0" : : "m" (*&(x)) );			\
424e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian} while (0)
425e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian
426e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian#elif defined(__WATCOMC__) && defined(__386__)
427e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian#define DEFAULT_X86_FPU		0x037f /* See GCC comments above */
428e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian#define FAST_X86_FPU		0x003f /* See GCC comments above */
4296defd9f31eec51278d056f1bff885018e2321373Fariborz Jahanianvoid _watcom_start_fast_math(unsigned short *x,unsigned short *mask);
430e23518342e326e3d6e9139f05384f030e2a94d4aFariborz Jahanian#pragma aux _watcom_start_fast_math =                                   \
431a4b984d8396724a8e1137c22186c558c0cb0bf3fFariborz Jahanian   "fnstcw  word ptr [eax]"                                             \
432a4b984d8396724a8e1137c22186c558c0cb0bf3fFariborz Jahanian   "fldcw   word ptr [ecx]"                                             \
433e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek   parm [eax] [ecx]                                                     \
434e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek   modify exact [];
43580aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanianvoid _watcom_end_fast_math(unsigned short *x);
436e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#pragma aux _watcom_end_fast_math =                                     \
437dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian   "fnclex"                                                             \
438ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling   "fldcw   word ptr [eax]"                                             \
439d9f95b35dc4fc168a167a9b9b61a5f9e1d0462baFariborz Jahanian   parm [eax]                                                           \
440dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian   modify exact [];
441dad633b0a0955ceb4579e9508224562ad41b6a8dFariborz Jahanian#if defined(NO_FAST_MATH)
442e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define START_FAST_MATH(x)                                              \
443e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenekdo {                                                                    \
444e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek   static GLushort mask = DEFAULT_X86_FPU;	                        \
4459944c769b69b1904a7b16d3ce10fbdc9c67c764fTed Kremenek   _watcom_start_fast_math(&x,&mask);                                   \
4469944c769b69b1904a7b16d3ce10fbdc9c67c764fTed Kremenek} while (0)
4479944c769b69b1904a7b16d3ce10fbdc9c67c764fTed Kremenek#else
448e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define START_FAST_MATH(x)                                              \
449e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenekdo {                                                                    \
450e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek   static GLushort mask = FAST_X86_FPU;                                 \
451e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek   _watcom_start_fast_math(&x,&mask);                                   \
452e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek} while (0)
453e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#endif
454e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#define END_FAST_MATH(x)  _watcom_end_fast_math(&x)
455e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
456a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian#elif defined(_MSC_VER) && defined(_M_IX86)
457a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian#define DEFAULT_X86_FPU		0x037f /* See GCC comments above */
4587939418cbdf1b610a69e6adf29cd7dc8d0e9eaf8Fariborz Jahanian#define FAST_X86_FPU		0x003f /* See GCC comments above */
4597939418cbdf1b610a69e6adf29cd7dc8d0e9eaf8Fariborz Jahanian#if defined(NO_FAST_MATH)
460d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall#define START_FAST_MATH(x) do {\
46177bfb8b43ec3f7dee3a71f6e854b03ad29dab84fFariborz Jahanian	static GLuint mask = DEFAULT_X86_FPU;\
462e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek	__asm fnstcw word ptr [x]\
463e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek	__asm fldcw word ptr [mask]\
464a28948f34817476d02412fa204cae038e228c827Fariborz Jahanian} while(0)
4654a2e9ea0c191176ebe996516a9cf4f93b7e932ccTed Kremenek#else
4664a2e9ea0c191176ebe996516a9cf4f93b7e932ccTed Kremenek#define START_FAST_MATH(x) do {\
467d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall	static GLuint mask = FAST_X86_FPU;\
46828685ab2ddeea146841bf2e277e25c7b32dfc9f6Ted Kremenek	__asm fnstcw word ptr [x]\
469e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek	__asm fldcw word ptr [mask]\
470ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling} while(0)
471e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#endif
472ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#define END_FAST_MATH(x) do {\
473f85e193739c953358c865005855253af4f68a497John McCall	__asm fnclex\
474ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling	__asm fldcw word ptr [x]\
475e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek} while(0)
476e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
477e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#else
478788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek#define START_FAST_MATH(x)  x = 0
479788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek#define END_FAST_MATH(x)  (void)(x)
480788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek#endif
481788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek
482788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek
483ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling#ifndef Elements
484788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek#define Elements(x) (sizeof(x)/sizeof(*(x)))
485788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek#endif
486788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek
487788f489a37bf1150deb9378cec6a6eb902d0d1b2Ted Kremenek
488e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
489e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#ifdef __cplusplus
4906defd9f31eec51278d056f1bff885018e2321373Fariborz Jahanian}
491e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek#endif
492e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
493e3d67bcc7b89b335dbcd097a299658057ea31097Ted Kremenek
4948254aa62d9189395be1eed61194cd4b5ee6cb4a2Ted Kremenek#endif /* COMPILER_H */
495d7c15a64ba8ebdca0dd48dd1d2f233107d34494eArgyrios Kyrtzidis