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