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