Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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