176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell/************************************************************************** 276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * 36f238275c7c19f7e287b47276e6b4060c270599fMichal Krol * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * All Rights Reserved. 576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * 676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * copy of this software and associated documentation files (the 876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * "Software"), to deal in the Software without restriction, including 976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 1076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 1176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 1276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * the following conditions: 1376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * 1476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * The above copyright notice and this permission notice (including the 1576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 1676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * of the Software. 1776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * 1876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell * 2676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell **************************************************************************/ 2776818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 2876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#ifndef P_COMPILER_H 2976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#define P_COMPILER_H 3076818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 319791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca 32dacfef158943665fc0d11035867d14ff1f5db332José Fonseca#include "p_config.h" 33dacfef158943665fc0d11035867d14ff1f5db332José Fonseca 3476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#include <stdlib.h> 3576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#include <string.h> 361776e738fb6f41954542bce064e4e5e59a4aa530José Fonseca#include <stddef.h> 37aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca#include <stdarg.h> 38a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri#include <limits.h> 3976818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 40bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal 41bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#if defined(_WIN32) && !defined(__WIN32__) 42bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#define __WIN32__ 43bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal#endif 44bef9b40c3904fdffea6cc426c5c82ed3ab70a902michal 45e8b52b3f5682c969e58077d42f5aebdad5d32e89José Fonseca#if defined(_MSC_VER) 46e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca 47e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca/* Avoid 'expression is always true' warning */ 48e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca#pragma warning(disable: 4296) 49e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca 50e8b52b3f5682c969e58077d42f5aebdad5d32e89José Fonseca#endif /* _MSC_VER */ 51e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca 52e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca 53dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca/* 54dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca * Alternative stdint.h and stdbool.h headers are supplied in include/c99 for 55dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca * systems that lack it. 56dc6bcc92ee78e09bb1b5baec84e229817dfed7f4José Fonseca */ 57ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#ifndef __STDC_LIMIT_MACROS 58ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#define __STDC_LIMIT_MACROS 1 59ae10775b731c8c58aa42f8046b6b557b4659cb7cJosé Fonseca#endif 60271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca#include <stdint.h> 6155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#include <stdbool.h> 62271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca 63271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca 64467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#ifdef __cplusplus 65467928c6e01d66ea83d90df9903c2a8f0e675240José Fonsecaextern "C" { 66467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#endif 67467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca 68467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca 6946f453b29890afebb49daa04e0dbeadc45e662c2Alan Hourihane#if !defined(__HAIKU__) && !defined(__USE_MISC) 70cd893ccba9b7e4bafbdbbb71f79d1b40bcef01a8Chia-I Wu#if !defined(PIPE_OS_ANDROID) 7155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned int uint; 72cd893ccba9b7e4bafbdbbb71f79d1b40bcef01a8Chia-I Wu#endif 7355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned short ushort; 74c6c44bf48124dd5b4661014a8d58482c5a54557faljen#endif 75c6c44bf48124dd5b4661014a8d58482c5a54557faljentypedef unsigned char ubyte; 7655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca 7755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned char boolean; 7855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef TRUE 7955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define TRUE true 8055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif 8155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef FALSE 8255d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define FALSE false 8355d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif 8476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 859960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#ifndef va_copy 869960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#ifdef __va_copy 879960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#define va_copy(dest, src) __va_copy((dest), (src)) 889960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#else 899960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#define va_copy(dest, src) (dest) = (src) 909960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#endif 919960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#endif 929960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri 9376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell/* Function inlining */ 941cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca#ifndef inline 95b3b7c757a9873007ee033693b06647b378301075José Fonseca# ifdef __cplusplus 961cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca /* C++ supports inline keyword */ 97b3b7c757a9873007ee033693b06647b378301075José Fonseca# elif defined(__GNUC__) 981cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define inline __inline__ 99b3b7c757a9873007ee033693b06647b378301075José Fonseca# elif defined(_MSC_VER) 1001cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define inline __inline 101b3b7c757a9873007ee033693b06647b378301075José Fonseca# elif defined(__ICL) 1021cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define inline __inline 103b3b7c757a9873007ee033693b06647b378301075José Fonseca# elif defined(__INTEL_COMPILER) 1041cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca /* Intel compiler supports inline keyword */ 105b3b7c757a9873007ee033693b06647b378301075José Fonseca# elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100) 1061cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define inline __inline 107ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) 1081cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca /* C99 supports inline keyword */ 1091cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# elif (__STDC_VERSION__ >= 199901L) 1101cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca /* C99 supports inline keyword */ 111b3b7c757a9873007ee033693b06647b378301075José Fonseca# else 1121cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define inline 113b3b7c757a9873007ee033693b06647b378301075José Fonseca# endif 11476818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif 1151cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca#ifndef INLINE 1161cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca# define INLINE inline 1171cf808c86e7e88b173a5ca0ec6fef562ecae16b3José Fonseca#endif 11876818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 1196f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri/* Forced function inlining */ 1206f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#ifndef ALWAYS_INLINE 1216f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# ifdef __GNUC__ 1226f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# define ALWAYS_INLINE inline __attribute__((always_inline)) 1236f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# elif defined(_MSC_VER) 1246f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# define ALWAYS_INLINE __forceinline 1256f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# else 1266f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# define ALWAYS_INLINE INLINE 1276f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri# endif 1286f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#endif 129108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu 1306c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca/* 1316c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca * Define the C99 restrict keyword. 1326c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca * 1336c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca * See also: 1346c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca * - http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html 1356c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca */ 1366c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca#ifndef restrict 1376c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# if (__STDC_VERSION__ >= 199901L) 1386c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca /* C99 */ 1396c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# elif defined(__SUNPRO_C) && defined(__C99FEATURES__) 1406c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca /* C99 */ 1416c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# elif defined(__GNUC__) 1426c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# define restrict __restrict__ 1436c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# elif defined(_MSC_VER) 1446c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# define restrict __restrict 1456c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# else 1466c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# define restrict /* */ 1476c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca# endif 1486c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca#endif 1496c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca 1506c1aa4fd49dab7af21902726d274e0a5a7fea8dfJosé Fonseca 151108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu/* Function visibility */ 152108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#ifndef PUBLIC 153016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick# if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) 154108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu# define PUBLIC __attribute__((visibility("default"))) 155ba26631d0d936523c7a8f002cf469e569aa6d7a3Chia-I Wu# elif defined(_MSC_VER) 156ba26631d0d936523c7a8f002cf469e569aa6d7a3Chia-I Wu# define PUBLIC __declspec(dllexport) 157108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu# else 158108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu# define PUBLIC 159108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu# endif 160108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#endif 161108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu 162108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu 163ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith/* The __FUNCTION__ gcc variable is generally only used for debugging. 164ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith * If we're not using gcc, define __FUNCTION__ as a cpp symbol here. 165ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith */ 166ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#ifndef __FUNCTION__ 167016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick# if !defined(__GNUC__) 168ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# if (__STDC_VERSION__ >= 199901L) /* C99 */ || \ 169ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 170ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# define __FUNCTION__ __func__ 171ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# else 172ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# define __FUNCTION__ "<unknown>" 173ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# endif 174ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# endif 175aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca# if defined(_MSC_VER) && _MSC_VER < 1300 176aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca# define __FUNCTION__ "<unknown>" 177aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca# endif 178ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#endif 179d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca#ifndef __func__ 180d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# if (__STDC_VERSION__ >= 199901L) || \ 181d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca (defined(__SUNPRO_C) && defined(__C99FEATURES__)) 182d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca /* __func__ is part of C99 */ 183d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# elif defined(_MSC_VER) 184d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# if _MSC_VER >= 1300 185d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# define __func__ __FUNCTION__ 186d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# else 187d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# define __func__ "<unknown>" 188d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# endif 189d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca# endif 190d40b868db5b82529cbe07598b2ebef23cc31a7faJosé Fonseca#endif 191ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith 192ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith 19376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell 1949343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell/* This should match linux gcc cdecl semantics everywhere, so that we 1959343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell * just codegen one calling convention on all platforms. 1969343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell */ 197e0860518dfb5a5c6ba6584e3c1b5d7b203277dacJosé Fonseca#ifdef _MSC_VER 1989343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL __cdecl 1999343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#else 2009343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL 2019343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#endif 2029343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell 2039343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell 2049343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell 205016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick#if defined(__GNUC__) 206b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#define PIPE_DEPRECATED __attribute__((__deprecated__)) 207b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#else 208b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#define PIPE_DEPRECATED 209b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#endif 210b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca 211b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca 212b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca 21386bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* Macros for data alignment. */ 214cd62960a2e2ab43482cc8ee19c19e2856795bc12Vinson Lee#if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) || defined(__SUNPRO_CC) 21586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 21686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Type-Attributes.html */ 21786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) _type __attribute__((aligned(_alignment))) 21886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 21986bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Variable-Attributes.html */ 2205dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __attribute__((aligned(_alignment))) 22186bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 222818fd6b10182931a0727819f275f7f1686df09f5José Fonseca#if (__GNUC__ > 4 || (__GNUC__ == 4 &&__GNUC_MINOR__>1)) && !defined(PIPE_ARCH_X86_64) 22326c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK __attribute__((force_align_arg_pointer)) 22468edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#else 22526c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK 22668edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#endif 22786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 22886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#elif defined(_MSC_VER) 22986bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 23086bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://msdn.microsoft.com/en-us/library/83ythb65.aspx */ 23186bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) __declspec(align(_alignment)) _type 2325dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __declspec(align(_alignment)) 23386bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 23426c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK 23586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 236876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#elif defined(SWIG) 237876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz 238876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_TYPE(_alignment, _type) _type 239876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_VAR(_alignment) 240876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz 241876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_STACK 242876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz 24386bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#else 24486bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 24586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#error "Unsupported compiler" 24686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca 2473772441c498b997947f68e98830f72649bbc8442Brian#endif 2483772441c498b997947f68e98830f72649bbc8442Brian 249c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 250c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#if defined(__GNUC__) 251c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 252c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() __asm__("":::"memory") 253c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 254c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#elif defined(_MSC_VER) 255c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 256c6c62164c369eefe1cac06190a87050977c376c1José Fonsecavoid _ReadWriteBarrier(void); 257c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#pragma intrinsic(_ReadWriteBarrier) 258c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() _ReadWriteBarrier() 259c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 260cd62960a2e2ab43482cc8ee19c19e2856795bc12Vinson Lee#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) 261cd62960a2e2ab43482cc8ee19c19e2856795bc12Vinson Lee 262cd62960a2e2ab43482cc8ee19c19e2856795bc12Vinson Lee#define PIPE_READ_WRITE_BARRIER() __machine_rw_barrier() 263cd62960a2e2ab43482cc8ee19c19e2856795bc12Vinson Lee 264c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#else 265c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 266c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#warning "Unsupported compiler" 267c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() /* */ 268c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 269c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#endif 270c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 271c6c62164c369eefe1cac06190a87050977c376c1José Fonseca 2725df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri/* You should use these macros to mark if blocks where the if condition 2735df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * is either likely to be true, or unlikely to be true. 2745df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2755df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * This will inform human readers of this fact, and will also inform 2765df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the compiler, who will in turn inform the CPU. 2775df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2785df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * CPUs often start executing code inside the if or the else blocks 2795df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * without knowing whether the condition is true or not, and will have 2805df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * to throw the work away if they find out later they executed the 2815df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * wrong part of the if. 2825df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2835df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * If these macros are used, the CPU is more likely to correctly predict 2845df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the right path, and will avoid speculatively executing the wrong branch, 2855df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * thus not throwing away work, resulting in better performance. 2865df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2875df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * In light of this, it is also a good idea to mark as "likely" a path 2885df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * which is not necessarily always more likely, but that will benefit much 2895df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * more from performance improvements since it is already much faster than 2905df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the other path, or viceversa with "unlikely". 2915df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2925df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * Example usage: 2935df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * if(unlikely(do_we_need_a_software_fallback())) 2945df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * do_software_fallback(); 2955df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * else 2965df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * render_with_gpu(); 2975df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 2985df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * The macros follow the Linux kernel convention, and more examples can 2995df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * be found there. 3005df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * 3015df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * Note that profile guided optimization can offer better results, but 3025df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * needs an appropriate coverage suite and does not inform human readers. 3035df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri */ 3045858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca#ifndef likely 3055858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# if defined(__GNUC__) 3065858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# define likely(x) __builtin_expect(!!(x), 1) 3075858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# define unlikely(x) __builtin_expect(!!(x), 0) 3085858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# else 3095858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# define likely(x) (x) 3105858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# define unlikely(x) (x) 3115858abec6efd01d6d190d9116ff803c096bc279bJosé Fonseca# endif 3125df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#endif 3133772441c498b997947f68e98830f72649bbc8442Brian 314467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca 315188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul/** 316188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul * Static (compile-time) assertion. 317188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul * Basically, use COND to dimension an array. If COND is false/zero the 318188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul * array size will be -1 and we'll get a compilation error. 319188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul */ 320188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul#define STATIC_ASSERT(COND) \ 321188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul do { \ 322188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul typedef int static_assertion_failed[(!!(COND))*2-1]; \ 323188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul } while (0) 324188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul 325188aca34923d109323e0e1a882c69f2b422b5caeBrian Paul 326467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#if defined(__cplusplus) 327467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca} 328467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#endif 329467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca 330467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca 33176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif /* P_COMPILER_H */ 332