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 * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file compiler.h 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compiler-related stuff. 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef COMPILER_H 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define COMPILER_H 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <ctype.h> 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__alpha__) && defined(CCPML) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <cpml.h> /* use Compaq's Fast Math Library on Alpha */ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <math.h> 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <limits.h> 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h> 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h> 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <float.h> 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdarg.h> 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" { 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get standard integer types 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdint.h> 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sun compilers define __i386 instead of the gcc-style __i386__ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __SUNPRO_C 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if !defined(__i386__) && defined(__i386) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __i386__ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif !defined(__amd64__) && defined(__amd64) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __amd64__ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif !defined(__sparc__) && defined(__sparc) 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __sparc__ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if !defined(__volatile) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __volatile volatile 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * finite macro. 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_MSC_VER) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define finite _finite 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__WATCOMC__) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define finite _finite 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Disable assorted warnings 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) && !defined(BUILD_FOR_SNAP) 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if !defined(__GNUC__) /* mingw environment */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4068 ) /* unknown pragma */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4710 ) /* function 'foo' not inlined */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4127 ) /* conditional expression is constant */ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if defined(MESA_MINWARN) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__WATCOMC__) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# pragma disable_message(201) /* Disable unreachable code warnings */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Function inlining 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef inline 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# ifdef __cplusplus 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* C++ supports inline keyword */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(__GNUC__) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define inline __inline__ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(_MSC_VER) 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define inline __inline 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(__ICL) 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define inline __inline 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(__INTEL_COMPILER) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Intel compiler supports inline keyword */ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define inline __inline 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* C99 supports inline keyword */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif (__STDC_VERSION__ >= 199901L) 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* C99 supports inline keyword */ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# else 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define inline 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef INLINE 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define INLINE inline 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PUBLIC/USED macros 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we build the library with gcc's -fvisibility=hidden flag, we'll 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use the PUBLIC macro to mark functions that are to be exported. 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We also need to define a USED attribute, so the optimizer doesn't 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * inline a static function that we later use in an alias. - ajax 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef PUBLIC 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define PUBLIC __attribute__((visibility("default"))) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define USED __attribute__((used)) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# else 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define PUBLIC 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define USED 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Some compilers don't like some of Mesa's const usage. In those places use 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONST instead of const. Pass -DNO_CONST to compilers where this matters. 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef NO_CONST 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define CONST 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define CONST const 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __builtin_expect macros 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(__GNUC__) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __builtin_expect(x, y) (x) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef likely 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# ifdef __GNUC__ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define likely(x) __builtin_expect(!!(x), 1) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define unlikely(x) __builtin_expect(!!(x), 0) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# else 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define likely(x) (x) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define unlikely(x) (x) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The __FUNCTION__ gcc variable is generally only used for debugging. 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we're not using gcc, define __FUNCTION__ as a cpp symbol here. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Don't define it if using a newer Windows compiler. 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __FUNCTION__ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if defined(__VMS) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __FUNCTION__ "VMS$NL:" 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif !defined(__GNUC__) && !defined(__xlC__) && \ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!defined(_MSC_VER) || _MSC_VER < 1300) 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if (__STDC_VERSION__ >= 199901L) /* C99 */ || \ 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __FUNCTION__ __func__ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# else 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __FUNCTION__ "<unknown>" 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __func__ 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if (__STDC_VERSION__ >= 199901L) || \ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* __func__ is part of C99 */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# elif defined(_MSC_VER) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# if _MSC_VER >= 1300 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __func__ __FUNCTION__ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# else 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define __func__ "<unknown>" 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# endif 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32. 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do not use these unless absolutely necessary! 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to use a runtime test instead. 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For now, only used by some DRI hardware drivers for color/texel packing. 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__linux__) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <byteswap.h> 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CPU_TO_LE32( x ) bswap_32( x ) 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__APPLE__) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <CoreFoundation/CFByteOrder.h> 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif (defined(_AIX) || defined(__blrts)) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE GLuint CPU_TO_LE32(GLuint x) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (((x & 0x000000ff) << 24) | 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((x & 0x0000ff00) << 8) | 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((x & 0x00ff0000) >> 8) | 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((x & 0xff000000) >> 24)); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__OpenBSD__) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h> 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CPU_TO_LE32( x ) htole32( x ) 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else /*__linux__ */ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/endian.h> 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CPU_TO_LE32( x ) bswap32( x ) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /*__linux__*/ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MESA_BIG_ENDIAN 1 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CPU_TO_LE32( x ) ( x ) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MESA_LITTLE_ENDIAN 1 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(CAPI) && defined(WIN32) && !defined(BUILD_FOR_SNAP) 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CAPI _cdecl 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a macro so that asm functions can be linked into compilers other 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * than GNU C 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef _ASMAPI 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(WIN32) && !defined(BUILD_FOR_SNAP)/* was: !defined( __GNUC__ ) && !defined( VMS ) && !defined( __INTEL_COMPILER )*/ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _ASMAPI __cdecl 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _ASMAPI 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef PTR_DECL_IN_FRONT 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _ASMAPIP * _ASMAPI 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _ASMAPIP _ASMAPI * 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef USE_X86_ASM 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _NORMAPI _ASMAPI 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _NORMAPIP _ASMAPIP 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _NORMAPI 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _NORMAPIP * 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Turn off macro checking systems used by other libraries */ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef CHECK 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef CHECK 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ASSERT macro 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(_WIN32_WCE) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(BUILD_FOR_SNAP) && defined(CHECKED) 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define ASSERT(X) _CHECK(X) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(DEBUG) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define ASSERT(X) assert(X) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define ASSERT(X) 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Static (compile-time) assertion. 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Basically, use COND to dimension an array. If COND is false/zero the 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * array size will be -1 and we'll get a compilation error. 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define STATIC_ASSERT(COND) \ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef int static_assertion_failed[(!!(COND))*2-1]; \ 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (__GNUC__ >= 3) 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a))) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRINTFLIKE(f, a) 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef NULL 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NULL 0 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LONGSTRING macro 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * gcc -pedantic warns about long string literals, LONGSTRING silences that. 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(__GNUC__) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define LONGSTRING 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# define LONGSTRING __extension__ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef M_PI 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define M_PI (3.14159265358979323846) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef M_E 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define M_E (2.7182818284590452354) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef M_LOG2E 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define M_LOG2E (1.4426950408889634074) 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef ONE_DIV_SQRT_LN2 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ONE_DIV_SQRT_LN2 (1.201122408786449815) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef FLT_MAX_EXP 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLT_MAX_EXP 128 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE_IEEE: Determine if we're using IEEE floating point 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__i386__) || defined(__386__) || defined(__sparc__) || \ 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__s390x__) || defined(__powerpc__) || \ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__x86_64__) || \ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(ia64) || defined(__ia64__) || \ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__hppa__) || defined(hpux) || \ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__mips) || defined(_MIPS_ARCH) || \ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__arm__) || \ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defined(__sh__) || defined(__m32r__) || \ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (defined(__sun) && defined(_IEEE_754)) || \ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (defined(__alpha__) && (defined(__IEEE_FLOAT) || !defined(VMS))) 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE_IEEE 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IEEE_ONE 0x3f800000 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * START/END_FAST_MATH macros: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * START_FAST_MATH: Set x86 FPU to faster, 32-bit precision mode (and save 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * original mode to a temporary). 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * END_FAST_MATH: Restore x86 FPU to original mode. 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__GNUC__) && defined(__i386__) 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the x86 FPU control word to guarentee only 32 bits of precision 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are stored in registers. Allowing the FPU to store more introduces 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * differences between situations where numbers are pulled out of memory 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vs. situations where the compiler is able to optimize register usage. 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In the worst case, we force the compiler to use a memory access to 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * truncate the float, by specifying the 'volatile' keyword. 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Hardware default: All exceptions masked, extended double precision, 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * round to nearest (IEEE compliant): 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_X86_FPU 0x037f 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* All exceptions masked, single precision, round to nearest: 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FAST_X86_FPU 0x003f 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The fldcw instruction will cause any pending FP exceptions to be 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * raised prior to entering the block, and we clear any pending 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exceptions before exiting the block. Hence, asm code has free 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reign over the FPU while in the fast math block. 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(NO_FAST_MATH) 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) \ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLuint mask = DEFAULT_X86_FPU; \ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm__ ( "fldcw %0" : : "m" (mask) ); \ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) \ 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLuint mask = FAST_X86_FPU; \ 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm__ ( "fldcw %0" : : "m" (mask) ); \ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Restore original FPU mode, and clear any exceptions that may have 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * occurred in the FAST_MATH block. 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define END_FAST_MATH(x) \ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm__ ( "fnclex ; fldcw %0" : : "m" (*&(x)) ); \ 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(__WATCOMC__) && defined(__386__) 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_X86_FPU 0x037f /* See GCC comments above */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FAST_X86_FPU 0x003f /* See GCC comments above */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _watcom_start_fast_math(unsigned short *x,unsigned short *mask); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#pragma aux _watcom_start_fast_math = \ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "fnstcw word ptr [eax]" \ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "fldcw word ptr [ecx]" \ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org parm [eax] [ecx] \ 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modify exact []; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _watcom_end_fast_math(unsigned short *x); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#pragma aux _watcom_end_fast_math = \ 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "fnclex" \ 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "fldcw word ptr [eax]" \ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org parm [eax] \ 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modify exact []; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(NO_FAST_MATH) 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) \ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLushort mask = DEFAULT_X86_FPU; \ 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _watcom_start_fast_math(&x,&mask); \ 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) \ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLushort mask = FAST_X86_FPU; \ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _watcom_start_fast_math(&x,&mask); \ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define END_FAST_MATH(x) _watcom_end_fast_math(&x) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(_MSC_VER) && defined(_M_IX86) 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_X86_FPU 0x037f /* See GCC comments above */ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FAST_X86_FPU 0x003f /* See GCC comments above */ 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(NO_FAST_MATH) 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) do {\ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLuint mask = DEFAULT_X86_FPU;\ 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fnstcw word ptr [x]\ 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fldcw word ptr [mask]\ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while(0) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) do {\ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLuint mask = FAST_X86_FPU;\ 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fnstcw word ptr [x]\ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fldcw word ptr [mask]\ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while(0) 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define END_FAST_MATH(x) do {\ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fnclex\ 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __asm fldcw word ptr [x]\ 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while(0) 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define START_FAST_MATH(x) x = 0 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define END_FAST_MATH(x) (void)(x) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef Elements 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Elements(x) (sizeof(x)/sizeof(*(x))) 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* COMPILER_H */ 504