11591693c7b415e9869157c711fe11263c95d74eDavid Li/* 21591693c7b415e9869157c711fe11263c95d74eDavid Li * Mesa 3-D graphics library 31591693c7b415e9869157c711fe11263c95d74eDavid Li * Version: 7.5 41591693c7b415e9869157c711fe11263c95d74eDavid Li * 51591693c7b415e9869157c711fe11263c95d74eDavid Li * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 61591693c7b415e9869157c711fe11263c95d74eDavid Li * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 71591693c7b415e9869157c711fe11263c95d74eDavid Li * 81591693c7b415e9869157c711fe11263c95d74eDavid Li * Permission is hereby granted, free of charge, to any person obtaining a 91591693c7b415e9869157c711fe11263c95d74eDavid Li * copy of this software and associated documentation files (the "Software"), 101591693c7b415e9869157c711fe11263c95d74eDavid Li * to deal in the Software without restriction, including without limitation 111591693c7b415e9869157c711fe11263c95d74eDavid Li * the rights to use, copy, modify, merge, publish, distribute, sublicense, 121591693c7b415e9869157c711fe11263c95d74eDavid Li * and/or sell copies of the Software, and to permit persons to whom the 131591693c7b415e9869157c711fe11263c95d74eDavid Li * Software is furnished to do so, subject to the following conditions: 141591693c7b415e9869157c711fe11263c95d74eDavid Li * 151591693c7b415e9869157c711fe11263c95d74eDavid Li * The above copyright notice and this permission notice shall be included 161591693c7b415e9869157c711fe11263c95d74eDavid Li * in all copies or substantial portions of the Software. 171591693c7b415e9869157c711fe11263c95d74eDavid Li * 181591693c7b415e9869157c711fe11263c95d74eDavid Li * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 191591693c7b415e9869157c711fe11263c95d74eDavid Li * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 201591693c7b415e9869157c711fe11263c95d74eDavid Li * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 211591693c7b415e9869157c711fe11263c95d74eDavid Li * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 221591693c7b415e9869157c711fe11263c95d74eDavid Li * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 231591693c7b415e9869157c711fe11263c95d74eDavid Li * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 241591693c7b415e9869157c711fe11263c95d74eDavid Li */ 251591693c7b415e9869157c711fe11263c95d74eDavid Li 261591693c7b415e9869157c711fe11263c95d74eDavid Li 271591693c7b415e9869157c711fe11263c95d74eDavid Li/** 281591693c7b415e9869157c711fe11263c95d74eDavid Li * \file compiler.h 291591693c7b415e9869157c711fe11263c95d74eDavid Li * Compiler-related stuff. 301591693c7b415e9869157c711fe11263c95d74eDavid Li */ 311591693c7b415e9869157c711fe11263c95d74eDavid Li 321591693c7b415e9869157c711fe11263c95d74eDavid Li 331591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef COMPILER_H 341591693c7b415e9869157c711fe11263c95d74eDavid Li#define COMPILER_H 351591693c7b415e9869157c711fe11263c95d74eDavid Li 361591693c7b415e9869157c711fe11263c95d74eDavid Li 371591693c7b415e9869157c711fe11263c95d74eDavid Li#include <assert.h> 381591693c7b415e9869157c711fe11263c95d74eDavid Li#include <ctype.h> 391591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__alpha__) && defined(CCPML) 401591693c7b415e9869157c711fe11263c95d74eDavid Li#include <cpml.h> /* use Compaq's Fast Math Library on Alpha */ 411591693c7b415e9869157c711fe11263c95d74eDavid Li#else 421591693c7b415e9869157c711fe11263c95d74eDavid Li#include <math.h> 431591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 441591693c7b415e9869157c711fe11263c95d74eDavid Li#include <limits.h> 451591693c7b415e9869157c711fe11263c95d74eDavid Li#include <stdlib.h> 461591693c7b415e9869157c711fe11263c95d74eDavid Li#include <stdio.h> 471591693c7b415e9869157c711fe11263c95d74eDavid Li#include <string.h> 481591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__linux__) && defined(__i386__) 490d626ca0718fac8b88b18218eb8f75e9d51b6e38David Li//#include <fpu_control.h> 501591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 511591693c7b415e9869157c711fe11263c95d74eDavid Li#include <float.h> 521591693c7b415e9869157c711fe11263c95d74eDavid Li#include <stdarg.h> 531591693c7b415e9869157c711fe11263c95d74eDavid Li 541591693c7b415e9869157c711fe11263c95d74eDavid Li 551591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef __cplusplus 561591693c7b415e9869157c711fe11263c95d74eDavid Liextern "C" { 571591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 581591693c7b415e9869157c711fe11263c95d74eDavid Li 591591693c7b415e9869157c711fe11263c95d74eDavid Li 601591693c7b415e9869157c711fe11263c95d74eDavid Li/** 611591693c7b415e9869157c711fe11263c95d74eDavid Li * Get standard integer types 621591693c7b415e9869157c711fe11263c95d74eDavid Li */ 631591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(_MSC_VER) 641591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int8 int8_t; 651591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int8 uint8_t; 661591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int16 int16_t; 671591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int16 uint16_t; 681591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int32 int32_t; 691591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int32 uint32_t; 701591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int64 int64_t; 711591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int64 uint64_t; 721591693c7b415e9869157c711fe11263c95d74eDavid Li 731591693c7b415e9869157c711fe11263c95d74eDavid Li# if defined(_WIN64) 741591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int64 intptr_t; 751591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int64 uintptr_t; 761591693c7b415e9869157c711fe11263c95d74eDavid Li# else 771591693c7b415e9869157c711fe11263c95d74eDavid Li typedef __int32 intptr_t; 781591693c7b415e9869157c711fe11263c95d74eDavid Li typedef unsigned __int32 uintptr_t; 791591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 801591693c7b415e9869157c711fe11263c95d74eDavid Li 811591693c7b415e9869157c711fe11263c95d74eDavid Li# define INT64_C(__val) __val##i64 821591693c7b415e9869157c711fe11263c95d74eDavid Li# define UINT64_C(__val) __val##ui64 831591693c7b415e9869157c711fe11263c95d74eDavid Li#else 841591693c7b415e9869157c711fe11263c95d74eDavid Li# include <stdint.h> 851591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 861591693c7b415e9869157c711fe11263c95d74eDavid Li 871591693c7b415e9869157c711fe11263c95d74eDavid Li 881591693c7b415e9869157c711fe11263c95d74eDavid Li/** 891591693c7b415e9869157c711fe11263c95d74eDavid Li * Sun compilers define __i386 instead of the gcc-style __i386__ 901591693c7b415e9869157c711fe11263c95d74eDavid Li */ 911591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef __SUNPRO_C 921591693c7b415e9869157c711fe11263c95d74eDavid Li# if !defined(__i386__) && defined(__i386) 931591693c7b415e9869157c711fe11263c95d74eDavid Li# define __i386__ 941591693c7b415e9869157c711fe11263c95d74eDavid Li# elif !defined(__amd64__) && defined(__amd64) 951591693c7b415e9869157c711fe11263c95d74eDavid Li# define __amd64__ 961591693c7b415e9869157c711fe11263c95d74eDavid Li# elif !defined(__sparc__) && defined(__sparc) 971591693c7b415e9869157c711fe11263c95d74eDavid Li# define __sparc__ 981591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 991591693c7b415e9869157c711fe11263c95d74eDavid Li# if !defined(__volatile) 1001591693c7b415e9869157c711fe11263c95d74eDavid Li# define __volatile volatile 1011591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 1021591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1031591693c7b415e9869157c711fe11263c95d74eDavid Li 1041591693c7b415e9869157c711fe11263c95d74eDavid Li 1051591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1061591693c7b415e9869157c711fe11263c95d74eDavid Li * finite macro. 1071591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1081591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(_MSC_VER) 1091591693c7b415e9869157c711fe11263c95d74eDavid Li# define finite _finite 1101591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__WATCOMC__) 1111591693c7b415e9869157c711fe11263c95d74eDavid Li# define finite _finite 1121591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1131591693c7b415e9869157c711fe11263c95d74eDavid Li 1141591693c7b415e9869157c711fe11263c95d74eDavid Li 1151591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1161591693c7b415e9869157c711fe11263c95d74eDavid Li * Disable assorted warnings 1171591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1181591693c7b415e9869157c711fe11263c95d74eDavid Li#if !defined(OPENSTEP) && (defined(__WIN32__) && !defined(__CYGWIN__)) && !defined(BUILD_FOR_SNAP) 1191591693c7b415e9869157c711fe11263c95d74eDavid Li# if !defined(__GNUC__) /* mingw environment */ 1201591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4068 ) /* unknown pragma */ 1211591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4710 ) /* function 'foo' not inlined */ 1221591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4711 ) /* function 'foo' selected for automatic inline expansion */ 1231591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4127 ) /* conditional expression is constant */ 1241591693c7b415e9869157c711fe11263c95d74eDavid Li# if defined(MESA_MINWARN) 1251591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4244 ) /* '=' : conversion from 'const double ' to 'float ', possible loss of data */ 1261591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4018 ) /* '<' : signed/unsigned mismatch */ 1271591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4305 ) /* '=' : truncation from 'const double ' to 'float ' */ 1281591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4550 ) /* 'function' undefined; assuming extern returning int */ 1291591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma warning( disable : 4761 ) /* integral size mismatch in argument; conversion supplied */ 1301591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 1311591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 1321591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1331591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__WATCOMC__) 1341591693c7b415e9869157c711fe11263c95d74eDavid Li# pragma disable_message(201) /* Disable unreachable code warnings */ 1351591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1361591693c7b415e9869157c711fe11263c95d74eDavid Li 1371591693c7b415e9869157c711fe11263c95d74eDavid Li 1381591693c7b415e9869157c711fe11263c95d74eDavid Li 1391591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1401591693c7b415e9869157c711fe11263c95d74eDavid Li * Function inlining 1411591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1421591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__GNUC__) 1431591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE __inline__ 1441591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__MSC__) 1451591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE __inline 1461591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(_MSC_VER) 1471591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE __inline 1481591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__ICL) 1491591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE __inline 1501591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__INTEL_COMPILER) 1511591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE inline 1521591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100) 1531591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE __inline 1541591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__SUNPRO_C) && defined(__C99FEATURES__) 1551591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE inline 1561591693c7b415e9869157c711fe11263c95d74eDavid Li# define __inline inline 1571591693c7b415e9869157c711fe11263c95d74eDavid Li# define __inline__ inline 1581591693c7b415e9869157c711fe11263c95d74eDavid Li#elif (__STDC_VERSION__ >= 199901L) /* C99 */ 1591591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE inline 1601591693c7b415e9869157c711fe11263c95d74eDavid Li#else 1611591693c7b415e9869157c711fe11263c95d74eDavid Li# define INLINE 1621591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1631591693c7b415e9869157c711fe11263c95d74eDavid Li 1641591693c7b415e9869157c711fe11263c95d74eDavid Li 1651591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1661591693c7b415e9869157c711fe11263c95d74eDavid Li * PUBLIC/USED macros 1671591693c7b415e9869157c711fe11263c95d74eDavid Li * 1681591693c7b415e9869157c711fe11263c95d74eDavid Li * If we build the library with gcc's -fvisibility=hidden flag, we'll 1691591693c7b415e9869157c711fe11263c95d74eDavid Li * use the PUBLIC macro to mark functions that are to be exported. 1701591693c7b415e9869157c711fe11263c95d74eDavid Li * 1711591693c7b415e9869157c711fe11263c95d74eDavid Li * We also need to define a USED attribute, so the optimizer doesn't 1721591693c7b415e9869157c711fe11263c95d74eDavid Li * inline a static function that we later use in an alias. - ajax 1731591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1741591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) 1751591693c7b415e9869157c711fe11263c95d74eDavid Li# define PUBLIC __attribute__((visibility("default"))) 1761591693c7b415e9869157c711fe11263c95d74eDavid Li# define USED __attribute__((used)) 1771591693c7b415e9869157c711fe11263c95d74eDavid Li#else 1781591693c7b415e9869157c711fe11263c95d74eDavid Li# define PUBLIC 1791591693c7b415e9869157c711fe11263c95d74eDavid Li# define USED 1801591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1811591693c7b415e9869157c711fe11263c95d74eDavid Li 1821591693c7b415e9869157c711fe11263c95d74eDavid Li 1831591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1841591693c7b415e9869157c711fe11263c95d74eDavid Li * Some compilers don't like some of Mesa's const usage. In those places use 1851591693c7b415e9869157c711fe11263c95d74eDavid Li * CONST instead of const. Pass -DNO_CONST to compilers where this matters. 1861591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1871591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef NO_CONST 1881591693c7b415e9869157c711fe11263c95d74eDavid Li# define CONST 1891591693c7b415e9869157c711fe11263c95d74eDavid Li#else 1901591693c7b415e9869157c711fe11263c95d74eDavid Li# define CONST const 1911591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 1921591693c7b415e9869157c711fe11263c95d74eDavid Li 1931591693c7b415e9869157c711fe11263c95d74eDavid Li 1941591693c7b415e9869157c711fe11263c95d74eDavid Li/** 1951591693c7b415e9869157c711fe11263c95d74eDavid Li * __builtin_expect macros 1961591693c7b415e9869157c711fe11263c95d74eDavid Li */ 1971591693c7b415e9869157c711fe11263c95d74eDavid Li#if !defined(__GNUC__) 1981591693c7b415e9869157c711fe11263c95d74eDavid Li# define __builtin_expect(x, y) x 1991591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2001591693c7b415e9869157c711fe11263c95d74eDavid Li 2011591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef __GNUC__ 2021591693c7b415e9869157c711fe11263c95d74eDavid Li#define likely(x) __builtin_expect(!!(x), 1) 2031591693c7b415e9869157c711fe11263c95d74eDavid Li#define unlikely(x) __builtin_expect(!!(x), 0) 2041591693c7b415e9869157c711fe11263c95d74eDavid Li#else 2051591693c7b415e9869157c711fe11263c95d74eDavid Li#define likely(x) !!(x) 2061591693c7b415e9869157c711fe11263c95d74eDavid Li#define unlikely(x) !!(x) 2071591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2081591693c7b415e9869157c711fe11263c95d74eDavid Li 2091591693c7b415e9869157c711fe11263c95d74eDavid Li/** 2101591693c7b415e9869157c711fe11263c95d74eDavid Li * The __FUNCTION__ gcc variable is generally only used for debugging. 2111591693c7b415e9869157c711fe11263c95d74eDavid Li * If we're not using gcc, define __FUNCTION__ as a cpp symbol here. 2121591693c7b415e9869157c711fe11263c95d74eDavid Li * Don't define it if using a newer Windows compiler. 2131591693c7b415e9869157c711fe11263c95d74eDavid Li */ 2141591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef __FUNCTION__ 2151591693c7b415e9869157c711fe11263c95d74eDavid Li# if defined(__VMS) 2161591693c7b415e9869157c711fe11263c95d74eDavid Li# define __FUNCTION__ "VMS$NL:" 2171591693c7b415e9869157c711fe11263c95d74eDavid Li# elif !defined(__GNUC__) && !defined(__xlC__) && \ 2181591693c7b415e9869157c711fe11263c95d74eDavid Li (!defined(_MSC_VER) || _MSC_VER < 1300) 2191591693c7b415e9869157c711fe11263c95d74eDavid Li# if (__STDC_VERSION__ >= 199901L) /* C99 */ || \ 2201591693c7b415e9869157c711fe11263c95d74eDavid Li (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 2211591693c7b415e9869157c711fe11263c95d74eDavid Li# define __FUNCTION__ __func__ 2221591693c7b415e9869157c711fe11263c95d74eDavid Li# else 2231591693c7b415e9869157c711fe11263c95d74eDavid Li# define __FUNCTION__ "<unknown>" 2241591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 2251591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 2261591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2271591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef __func__ 2281591693c7b415e9869157c711fe11263c95d74eDavid Li# if (__STDC_VERSION__ >= 199901L) || \ 2291591693c7b415e9869157c711fe11263c95d74eDavid Li (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 2301591693c7b415e9869157c711fe11263c95d74eDavid Li /* __func__ is part of C99 */ 2311591693c7b415e9869157c711fe11263c95d74eDavid Li# elif defined(_MSC_VER) 2321591693c7b415e9869157c711fe11263c95d74eDavid Li# if _MSC_VER >= 1300 2331591693c7b415e9869157c711fe11263c95d74eDavid Li# define __func__ __FUNCTION__ 2341591693c7b415e9869157c711fe11263c95d74eDavid Li# else 2351591693c7b415e9869157c711fe11263c95d74eDavid Li# define __func__ "<unknown>" 2361591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 2371591693c7b415e9869157c711fe11263c95d74eDavid Li# endif 2381591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2391591693c7b415e9869157c711fe11263c95d74eDavid Li 2401591693c7b415e9869157c711fe11263c95d74eDavid Li 2411591693c7b415e9869157c711fe11263c95d74eDavid Li/** 2421591693c7b415e9869157c711fe11263c95d74eDavid Li * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32. 2431591693c7b415e9869157c711fe11263c95d74eDavid Li * Do not use these unless absolutely necessary! 2441591693c7b415e9869157c711fe11263c95d74eDavid Li * Try to use a runtime test instead. 2451591693c7b415e9869157c711fe11263c95d74eDavid Li * For now, only used by some DRI hardware drivers for color/texel packing. 2461591693c7b415e9869157c711fe11263c95d74eDavid Li */ 2471591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN 2481591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__linux__) 2491591693c7b415e9869157c711fe11263c95d74eDavid Li#include <byteswap.h> 2501591693c7b415e9869157c711fe11263c95d74eDavid Li#define CPU_TO_LE32( x ) bswap_32( x ) 2511591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__APPLE__) 2521591693c7b415e9869157c711fe11263c95d74eDavid Li#include <CoreFoundation/CFByteOrder.h> 2531591693c7b415e9869157c711fe11263c95d74eDavid Li#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) 2541591693c7b415e9869157c711fe11263c95d74eDavid Li#elif (defined(_AIX) || defined(__blrts)) 2551591693c7b415e9869157c711fe11263c95d74eDavid Listatic INLINE GLuint CPU_TO_LE32(GLuint x) 2561591693c7b415e9869157c711fe11263c95d74eDavid Li{ 2571591693c7b415e9869157c711fe11263c95d74eDavid Li return (((x & 0x000000ff) << 24) | 2581591693c7b415e9869157c711fe11263c95d74eDavid Li ((x & 0x0000ff00) << 8) | 2591591693c7b415e9869157c711fe11263c95d74eDavid Li ((x & 0x00ff0000) >> 8) | 2601591693c7b415e9869157c711fe11263c95d74eDavid Li ((x & 0xff000000) >> 24)); 2611591693c7b415e9869157c711fe11263c95d74eDavid Li} 2621591693c7b415e9869157c711fe11263c95d74eDavid Li#else /*__linux__ */ 2631591693c7b415e9869157c711fe11263c95d74eDavid Li#include <sys/endian.h> 2641591693c7b415e9869157c711fe11263c95d74eDavid Li#define CPU_TO_LE32( x ) bswap32( x ) 2651591693c7b415e9869157c711fe11263c95d74eDavid Li#endif /*__linux__*/ 2661591693c7b415e9869157c711fe11263c95d74eDavid Li#define MESA_BIG_ENDIAN 1 2671591693c7b415e9869157c711fe11263c95d74eDavid Li#else 2681591693c7b415e9869157c711fe11263c95d74eDavid Li#define CPU_TO_LE32( x ) ( x ) 2691591693c7b415e9869157c711fe11263c95d74eDavid Li#define MESA_LITTLE_ENDIAN 1 2701591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2711591693c7b415e9869157c711fe11263c95d74eDavid Li#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) 2721591693c7b415e9869157c711fe11263c95d74eDavid Li 2731591693c7b415e9869157c711fe11263c95d74eDavid Li 2741591693c7b415e9869157c711fe11263c95d74eDavid Li 2751591693c7b415e9869157c711fe11263c95d74eDavid Li#if !defined(CAPI) && defined(WIN32) && !defined(BUILD_FOR_SNAP) 2761591693c7b415e9869157c711fe11263c95d74eDavid Li#define CAPI _cdecl 2771591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2781591693c7b415e9869157c711fe11263c95d74eDavid Li 2791591693c7b415e9869157c711fe11263c95d74eDavid Li 2801591693c7b415e9869157c711fe11263c95d74eDavid Li/** 2811591693c7b415e9869157c711fe11263c95d74eDavid Li * Create a macro so that asm functions can be linked into compilers other 2821591693c7b415e9869157c711fe11263c95d74eDavid Li * than GNU C 2831591693c7b415e9869157c711fe11263c95d74eDavid Li */ 2841591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef _ASMAPI 2851591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(WIN32) && !defined(BUILD_FOR_SNAP)/* was: !defined( __GNUC__ ) && !defined( VMS ) && !defined( __INTEL_COMPILER )*/ 2861591693c7b415e9869157c711fe11263c95d74eDavid Li#define _ASMAPI __cdecl 2871591693c7b415e9869157c711fe11263c95d74eDavid Li#else 2881591693c7b415e9869157c711fe11263c95d74eDavid Li#define _ASMAPI 2891591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2901591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef PTR_DECL_IN_FRONT 2911591693c7b415e9869157c711fe11263c95d74eDavid Li#define _ASMAPIP * _ASMAPI 2921591693c7b415e9869157c711fe11263c95d74eDavid Li#else 2931591693c7b415e9869157c711fe11263c95d74eDavid Li#define _ASMAPIP _ASMAPI * 2941591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2951591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 2961591693c7b415e9869157c711fe11263c95d74eDavid Li 2971591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef USE_X86_ASM 2981591693c7b415e9869157c711fe11263c95d74eDavid Li#define _NORMAPI _ASMAPI 2991591693c7b415e9869157c711fe11263c95d74eDavid Li#define _NORMAPIP _ASMAPIP 3001591693c7b415e9869157c711fe11263c95d74eDavid Li#else 3011591693c7b415e9869157c711fe11263c95d74eDavid Li#define _NORMAPI 3021591693c7b415e9869157c711fe11263c95d74eDavid Li#define _NORMAPIP * 3031591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3041591693c7b415e9869157c711fe11263c95d74eDavid Li 3051591693c7b415e9869157c711fe11263c95d74eDavid Li 3061591693c7b415e9869157c711fe11263c95d74eDavid Li/* This is a macro on IRIX */ 3071591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef _P 3081591693c7b415e9869157c711fe11263c95d74eDavid Li#undef _P 3091591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3101591693c7b415e9869157c711fe11263c95d74eDavid Li 3111591693c7b415e9869157c711fe11263c95d74eDavid Li 3121591693c7b415e9869157c711fe11263c95d74eDavid Li/* Turn off macro checking systems used by other libraries */ 3131591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef CHECK 3141591693c7b415e9869157c711fe11263c95d74eDavid Li#undef CHECK 3151591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3161591693c7b415e9869157c711fe11263c95d74eDavid Li 3171591693c7b415e9869157c711fe11263c95d74eDavid Li 3181591693c7b415e9869157c711fe11263c95d74eDavid Li/** 3191591693c7b415e9869157c711fe11263c95d74eDavid Li * ASSERT macro 3201591693c7b415e9869157c711fe11263c95d74eDavid Li */ 3211591693c7b415e9869157c711fe11263c95d74eDavid Li#if !defined(_WIN32_WCE) 3221591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(BUILD_FOR_SNAP) && defined(CHECKED) 3231591693c7b415e9869157c711fe11263c95d74eDavid Li# define ASSERT(X) _CHECK(X) 3241591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(DEBUG) 3251591693c7b415e9869157c711fe11263c95d74eDavid Li# define ASSERT(X) assert(X) 3261591693c7b415e9869157c711fe11263c95d74eDavid Li#else 3271591693c7b415e9869157c711fe11263c95d74eDavid Li# define ASSERT(X) 3281591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3291591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3301591693c7b415e9869157c711fe11263c95d74eDavid Li 3311591693c7b415e9869157c711fe11263c95d74eDavid Li#if (__GNUC__ >= 3) 3321591693c7b415e9869157c711fe11263c95d74eDavid Li#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a))) 3331591693c7b415e9869157c711fe11263c95d74eDavid Li#else 3341591693c7b415e9869157c711fe11263c95d74eDavid Li#define PRINTFLIKE(f, a) 3351591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3361591693c7b415e9869157c711fe11263c95d74eDavid Li 3371591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef NULL 3381591693c7b415e9869157c711fe11263c95d74eDavid Li#define NULL 0 3391591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3401591693c7b415e9869157c711fe11263c95d74eDavid Li 3411591693c7b415e9869157c711fe11263c95d74eDavid Li 3421591693c7b415e9869157c711fe11263c95d74eDavid Li/** 3431591693c7b415e9869157c711fe11263c95d74eDavid Li * LONGSTRING macro 3441591693c7b415e9869157c711fe11263c95d74eDavid Li * gcc -pedantic warns about long string literals, LONGSTRING silences that. 3451591693c7b415e9869157c711fe11263c95d74eDavid Li */ 3461591693c7b415e9869157c711fe11263c95d74eDavid Li#if !defined(__GNUC__) 3471591693c7b415e9869157c711fe11263c95d74eDavid Li# define LONGSTRING 3481591693c7b415e9869157c711fe11263c95d74eDavid Li#else 3491591693c7b415e9869157c711fe11263c95d74eDavid Li# define LONGSTRING __extension__ 3501591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3511591693c7b415e9869157c711fe11263c95d74eDavid Li 3521591693c7b415e9869157c711fe11263c95d74eDavid Li 3531591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef M_PI 3541591693c7b415e9869157c711fe11263c95d74eDavid Li#define M_PI (3.1415926536) 3551591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3561591693c7b415e9869157c711fe11263c95d74eDavid Li 3571591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef M_E 3581591693c7b415e9869157c711fe11263c95d74eDavid Li#define M_E (2.7182818284590452354) 3591591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3601591693c7b415e9869157c711fe11263c95d74eDavid Li 3611591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef M_LOG2E 3621591693c7b415e9869157c711fe11263c95d74eDavid Li#define M_LOG2E (1.4426950408889634074) 3631591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3641591693c7b415e9869157c711fe11263c95d74eDavid Li 3651591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef ONE_DIV_LN2 3661591693c7b415e9869157c711fe11263c95d74eDavid Li#define ONE_DIV_LN2 (1.442695040888963456) 3671591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3681591693c7b415e9869157c711fe11263c95d74eDavid Li 3691591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef ONE_DIV_SQRT_LN2 3701591693c7b415e9869157c711fe11263c95d74eDavid Li#define ONE_DIV_SQRT_LN2 (1.201122408786449815) 3711591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3721591693c7b415e9869157c711fe11263c95d74eDavid Li 3731591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef FLT_MAX_EXP 3741591693c7b415e9869157c711fe11263c95d74eDavid Li#define FLT_MAX_EXP 128 3751591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3761591693c7b415e9869157c711fe11263c95d74eDavid Li 3771591693c7b415e9869157c711fe11263c95d74eDavid Li 3781591693c7b415e9869157c711fe11263c95d74eDavid Li/** 3791591693c7b415e9869157c711fe11263c95d74eDavid Li * USE_IEEE: Determine if we're using IEEE floating point 3801591693c7b415e9869157c711fe11263c95d74eDavid Li */ 3811591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__i386__) || defined(__386__) || defined(__sparc__) || \ 3821591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__s390x__) || defined(__powerpc__) || \ 3831591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__x86_64__) || \ 3841591693c7b415e9869157c711fe11263c95d74eDavid Li defined(ia64) || defined(__ia64__) || \ 3851591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__hppa__) || defined(hpux) || \ 3861591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__mips) || defined(_MIPS_ARCH) || \ 3871591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__arm__) || \ 3881591693c7b415e9869157c711fe11263c95d74eDavid Li defined(__sh__) || defined(__m32r__) || \ 3891591693c7b415e9869157c711fe11263c95d74eDavid Li (defined(__sun) && defined(_IEEE_754)) || \ 3901591693c7b415e9869157c711fe11263c95d74eDavid Li (defined(__alpha__) && (defined(__IEEE_FLOAT) || !defined(VMS))) 3911591693c7b415e9869157c711fe11263c95d74eDavid Li#define USE_IEEE 3921591693c7b415e9869157c711fe11263c95d74eDavid Li#define IEEE_ONE 0x3f800000 3931591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 3941591693c7b415e9869157c711fe11263c95d74eDavid Li 3951591693c7b415e9869157c711fe11263c95d74eDavid Li 3961591693c7b415e9869157c711fe11263c95d74eDavid Li/** 3971591693c7b415e9869157c711fe11263c95d74eDavid Li * START/END_FAST_MATH macros: 3981591693c7b415e9869157c711fe11263c95d74eDavid Li * 3991591693c7b415e9869157c711fe11263c95d74eDavid Li * START_FAST_MATH: Set x86 FPU to faster, 32-bit precision mode (and save 4001591693c7b415e9869157c711fe11263c95d74eDavid Li * original mode to a temporary). 4011591693c7b415e9869157c711fe11263c95d74eDavid Li * END_FAST_MATH: Restore x86 FPU to original mode. 4021591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4031591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(__GNUC__) && defined(__i386__) 4041591693c7b415e9869157c711fe11263c95d74eDavid Li/* 4051591693c7b415e9869157c711fe11263c95d74eDavid Li * Set the x86 FPU control word to guarentee only 32 bits of precision 4061591693c7b415e9869157c711fe11263c95d74eDavid Li * are stored in registers. Allowing the FPU to store more introduces 4071591693c7b415e9869157c711fe11263c95d74eDavid Li * differences between situations where numbers are pulled out of memory 4081591693c7b415e9869157c711fe11263c95d74eDavid Li * vs. situations where the compiler is able to optimize register usage. 4091591693c7b415e9869157c711fe11263c95d74eDavid Li * 4101591693c7b415e9869157c711fe11263c95d74eDavid Li * In the worst case, we force the compiler to use a memory access to 4111591693c7b415e9869157c711fe11263c95d74eDavid Li * truncate the float, by specifying the 'volatile' keyword. 4121591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4131591693c7b415e9869157c711fe11263c95d74eDavid Li/* Hardware default: All exceptions masked, extended double precision, 4141591693c7b415e9869157c711fe11263c95d74eDavid Li * round to nearest (IEEE compliant): 4151591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4161591693c7b415e9869157c711fe11263c95d74eDavid Li#define DEFAULT_X86_FPU 0x037f 4171591693c7b415e9869157c711fe11263c95d74eDavid Li/* All exceptions masked, single precision, round to nearest: 4181591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4191591693c7b415e9869157c711fe11263c95d74eDavid Li#define FAST_X86_FPU 0x003f 4201591693c7b415e9869157c711fe11263c95d74eDavid Li/* The fldcw instruction will cause any pending FP exceptions to be 4211591693c7b415e9869157c711fe11263c95d74eDavid Li * raised prior to entering the block, and we clear any pending 4221591693c7b415e9869157c711fe11263c95d74eDavid Li * exceptions before exiting the block. Hence, asm code has free 4231591693c7b415e9869157c711fe11263c95d74eDavid Li * reign over the FPU while in the fast math block. 4241591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4251591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(NO_FAST_MATH) 4261591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) \ 4271591693c7b415e9869157c711fe11263c95d74eDavid Lido { \ 4281591693c7b415e9869157c711fe11263c95d74eDavid Li static GLuint mask = DEFAULT_X86_FPU; \ 4291591693c7b415e9869157c711fe11263c95d74eDavid Li __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ 4301591693c7b415e9869157c711fe11263c95d74eDavid Li __asm__ ( "fldcw %0" : : "m" (mask) ); \ 4311591693c7b415e9869157c711fe11263c95d74eDavid Li} while (0) 4321591693c7b415e9869157c711fe11263c95d74eDavid Li#else 4331591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) \ 4341591693c7b415e9869157c711fe11263c95d74eDavid Lido { \ 4351591693c7b415e9869157c711fe11263c95d74eDavid Li static GLuint mask = FAST_X86_FPU; \ 4361591693c7b415e9869157c711fe11263c95d74eDavid Li __asm__ ( "fnstcw %0" : "=m" (*&(x)) ); \ 4371591693c7b415e9869157c711fe11263c95d74eDavid Li __asm__ ( "fldcw %0" : : "m" (mask) ); \ 4381591693c7b415e9869157c711fe11263c95d74eDavid Li} while (0) 4391591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 4401591693c7b415e9869157c711fe11263c95d74eDavid Li/* Restore original FPU mode, and clear any exceptions that may have 4411591693c7b415e9869157c711fe11263c95d74eDavid Li * occurred in the FAST_MATH block. 4421591693c7b415e9869157c711fe11263c95d74eDavid Li */ 4431591693c7b415e9869157c711fe11263c95d74eDavid Li#define END_FAST_MATH(x) \ 4441591693c7b415e9869157c711fe11263c95d74eDavid Lido { \ 4451591693c7b415e9869157c711fe11263c95d74eDavid Li __asm__ ( "fnclex ; fldcw %0" : : "m" (*&(x)) ); \ 4461591693c7b415e9869157c711fe11263c95d74eDavid Li} while (0) 4471591693c7b415e9869157c711fe11263c95d74eDavid Li 4481591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(__WATCOMC__) && defined(__386__) 4491591693c7b415e9869157c711fe11263c95d74eDavid Li#define DEFAULT_X86_FPU 0x037f /* See GCC comments above */ 4501591693c7b415e9869157c711fe11263c95d74eDavid Li#define FAST_X86_FPU 0x003f /* See GCC comments above */ 4511591693c7b415e9869157c711fe11263c95d74eDavid Livoid _watcom_start_fast_math(unsigned short *x,unsigned short *mask); 4521591693c7b415e9869157c711fe11263c95d74eDavid Li#pragma aux _watcom_start_fast_math = \ 4531591693c7b415e9869157c711fe11263c95d74eDavid Li "fnstcw word ptr [eax]" \ 4541591693c7b415e9869157c711fe11263c95d74eDavid Li "fldcw word ptr [ecx]" \ 4551591693c7b415e9869157c711fe11263c95d74eDavid Li parm [eax] [ecx] \ 4561591693c7b415e9869157c711fe11263c95d74eDavid Li modify exact []; 4571591693c7b415e9869157c711fe11263c95d74eDavid Livoid _watcom_end_fast_math(unsigned short *x); 4581591693c7b415e9869157c711fe11263c95d74eDavid Li#pragma aux _watcom_end_fast_math = \ 4591591693c7b415e9869157c711fe11263c95d74eDavid Li "fnclex" \ 4601591693c7b415e9869157c711fe11263c95d74eDavid Li "fldcw word ptr [eax]" \ 4611591693c7b415e9869157c711fe11263c95d74eDavid Li parm [eax] \ 4621591693c7b415e9869157c711fe11263c95d74eDavid Li modify exact []; 4631591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(NO_FAST_MATH) 4641591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) \ 4651591693c7b415e9869157c711fe11263c95d74eDavid Lido { \ 4661591693c7b415e9869157c711fe11263c95d74eDavid Li static GLushort mask = DEFAULT_X86_FPU; \ 4671591693c7b415e9869157c711fe11263c95d74eDavid Li _watcom_start_fast_math(&x,&mask); \ 4681591693c7b415e9869157c711fe11263c95d74eDavid Li} while (0) 4691591693c7b415e9869157c711fe11263c95d74eDavid Li#else 4701591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) \ 4711591693c7b415e9869157c711fe11263c95d74eDavid Lido { \ 4721591693c7b415e9869157c711fe11263c95d74eDavid Li static GLushort mask = FAST_X86_FPU; \ 4731591693c7b415e9869157c711fe11263c95d74eDavid Li _watcom_start_fast_math(&x,&mask); \ 4741591693c7b415e9869157c711fe11263c95d74eDavid Li} while (0) 4751591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 4761591693c7b415e9869157c711fe11263c95d74eDavid Li#define END_FAST_MATH(x) _watcom_end_fast_math(&x) 4771591693c7b415e9869157c711fe11263c95d74eDavid Li 4781591693c7b415e9869157c711fe11263c95d74eDavid Li#elif defined(_MSC_VER) && defined(_M_IX86) 4791591693c7b415e9869157c711fe11263c95d74eDavid Li#define DEFAULT_X86_FPU 0x037f /* See GCC comments above */ 4801591693c7b415e9869157c711fe11263c95d74eDavid Li#define FAST_X86_FPU 0x003f /* See GCC comments above */ 4811591693c7b415e9869157c711fe11263c95d74eDavid Li#if defined(NO_FAST_MATH) 4821591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) do {\ 4831591693c7b415e9869157c711fe11263c95d74eDavid Li static GLuint mask = DEFAULT_X86_FPU;\ 4841591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fnstcw word ptr [x]\ 4851591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fldcw word ptr [mask]\ 4861591693c7b415e9869157c711fe11263c95d74eDavid Li} while(0) 4871591693c7b415e9869157c711fe11263c95d74eDavid Li#else 4881591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) do {\ 4891591693c7b415e9869157c711fe11263c95d74eDavid Li static GLuint mask = FAST_X86_FPU;\ 4901591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fnstcw word ptr [x]\ 4911591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fldcw word ptr [mask]\ 4921591693c7b415e9869157c711fe11263c95d74eDavid Li} while(0) 4931591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 4941591693c7b415e9869157c711fe11263c95d74eDavid Li#define END_FAST_MATH(x) do {\ 4951591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fnclex\ 4961591693c7b415e9869157c711fe11263c95d74eDavid Li __asm fldcw word ptr [x]\ 4971591693c7b415e9869157c711fe11263c95d74eDavid Li} while(0) 4981591693c7b415e9869157c711fe11263c95d74eDavid Li 4991591693c7b415e9869157c711fe11263c95d74eDavid Li#else 5001591693c7b415e9869157c711fe11263c95d74eDavid Li#define START_FAST_MATH(x) x = 0 5011591693c7b415e9869157c711fe11263c95d74eDavid Li#define END_FAST_MATH(x) (void)(x) 5021591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 5031591693c7b415e9869157c711fe11263c95d74eDavid Li 5041591693c7b415e9869157c711fe11263c95d74eDavid Li 5051591693c7b415e9869157c711fe11263c95d74eDavid Li#ifndef Elements 5061591693c7b415e9869157c711fe11263c95d74eDavid Li#define Elements(x) (sizeof(x)/sizeof(*(x))) 5071591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 5081591693c7b415e9869157c711fe11263c95d74eDavid Li 5091591693c7b415e9869157c711fe11263c95d74eDavid Li 5101591693c7b415e9869157c711fe11263c95d74eDavid Li 5111591693c7b415e9869157c711fe11263c95d74eDavid Li#ifdef __cplusplus 5121591693c7b415e9869157c711fe11263c95d74eDavid Li} 5131591693c7b415e9869157c711fe11263c95d74eDavid Li#endif 5141591693c7b415e9869157c711fe11263c95d74eDavid Li 5151591693c7b415e9869157c711fe11263c95d74eDavid Li 5161591693c7b415e9869157c711fe11263c95d74eDavid Li#endif /* COMPILER_H */ 517