p_compiler.h revision a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579d
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)
7055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned int       uint;
7155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned short     ushort;
72c6c44bf48124dd5b4661014a8d58482c5a54557faljen#endif
73c6c44bf48124dd5b4661014a8d58482c5a54557faljentypedef unsigned char      ubyte;
7455d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca
7555d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonsecatypedef unsigned char boolean;
7655d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef TRUE
7755d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define TRUE  true
7855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif
7955d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#ifndef FALSE
8055d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#define FALSE false
8155d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca#endif
8276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
839960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#ifndef va_copy
849960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#ifdef __va_copy
859960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#define va_copy(dest, src) __va_copy((dest), (src))
869960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#else
879960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#define va_copy(dest, src) (dest) = (src)
889960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#endif
899960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri#endif
909960200d5eef97e38d5565cfc1775e3d8f7800a2Luca Barbieri
9176818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell/* Function inlining */
92b3b7c757a9873007ee033693b06647b378301075José Fonseca#ifndef INLINE
93b3b7c757a9873007ee033693b06647b378301075José Fonseca#  ifdef __cplusplus
94b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE inline
95b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__GNUC__)
96b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline__
97b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(_MSC_VER)
98b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
99b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__ICL)
100b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
101b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__INTEL_COMPILER)
102b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE inline
103b3b7c757a9873007ee033693b06647b378301075José Fonseca#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
104b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE __inline
105ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
106ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#    define INLINE inline
107ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  elif (__STDC_VERSION__ >= 199901L) /* C99 */
108ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#    define INLINE inline
109b3b7c757a9873007ee033693b06647b378301075José Fonseca#  else
110b3b7c757a9873007ee033693b06647b378301075José Fonseca#    define INLINE
111b3b7c757a9873007ee033693b06647b378301075José Fonseca#  endif
11276818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif
11376818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
1146f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri/* Forced function inlining */
1156f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#ifndef ALWAYS_INLINE
1166f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#  ifdef __GNUC__
1176f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#    define ALWAYS_INLINE inline __attribute__((always_inline))
1186f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#  elif defined(_MSC_VER)
1196f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#    define ALWAYS_INLINE __forceinline
1206f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#  else
1216f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#    define ALWAYS_INLINE INLINE
1226f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#  endif
1236f3c4819ecf397cf9efee0213e628e15c1bc704dLuca Barbieri#endif
124108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
125108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu/* Function visibility */
126108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#ifndef PUBLIC
127016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick#  if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
128108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#    define PUBLIC __attribute__((visibility("default")))
129ba26631d0d936523c7a8f002cf469e569aa6d7a3Chia-I Wu#  elif defined(_MSC_VER)
130ba26631d0d936523c7a8f002cf469e569aa6d7a3Chia-I Wu#    define PUBLIC __declspec(dllexport)
131108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#  else
132108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#    define PUBLIC
133108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#  endif
134108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu#endif
135108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
136108c2bf5ab9228843d21c188d8819a54b1201d07Chia-I Wu
137ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith/* The __FUNCTION__ gcc variable is generally only used for debugging.
138ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
139ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith */
140ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#ifndef __FUNCTION__
141016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick# if !defined(__GNUC__)
142ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
143ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
144ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#   define __FUNCTION__ __func__
145ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  else
146ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#   define __FUNCTION__ "<unknown>"
147ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#  endif
148ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith# endif
149aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca# if defined(_MSC_VER) && _MSC_VER < 1300
150aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca#  define __FUNCTION__ "<unknown>"
151aa8b49c9ca6b446e335bda4945e48107e5e4128aJosé Fonseca# endif
152ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith#endif
153ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith
154ad11107206ff4954366d77f334431b637ee256faAlan Coopersmith
15576818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell
1569343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell/* This should match linux gcc cdecl semantics everywhere, so that we
1579343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell * just codegen one calling convention on all platforms.
1589343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell */
159e0860518dfb5a5c6ba6584e3c1b5d7b203277dacJosé Fonseca#ifdef _MSC_VER
1609343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL __cdecl
1619343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#else
1629343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#define PIPE_CDECL
1639343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell#endif
1649343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
1659343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
1669343779a8c800cf72e38b09b6f5087a0df258c08Keith Whitwell
167016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick#if defined(__GNUC__)
168b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#define PIPE_DEPRECATED  __attribute__((__deprecated__))
169b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#else
170b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#define PIPE_DEPRECATED
171b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca#endif
172b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca
173b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca
174b7b7ea9532055a189eb1d276301937eae39f4168José Fonseca
17586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* Macros for data alignment. */
176a7aaf052f935cb51b7b616a7a764c57fc01b2821Alan Coopersmith#if defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
17786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
17886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Type-Attributes.html */
17986bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) _type __attribute__((aligned(_alignment)))
18086bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
18186bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Variable-Attributes.html */
1825dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __attribute__((aligned(_alignment)))
18386bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
184818fd6b10182931a0727819f275f7f1686df09f5José Fonseca#if (__GNUC__ > 4 || (__GNUC__ == 4 &&__GNUC_MINOR__>1)) && !defined(PIPE_ARCH_X86_64)
18526c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK __attribute__((force_align_arg_pointer))
18668edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#else
18726c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK
18868edb4eac55457796ed5c5e4f1c702af749fd543José Fonseca#endif
18986bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
19086bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#elif defined(_MSC_VER)
19186bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
19286bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca/* See http://msdn.microsoft.com/en-us/library/83ythb65.aspx */
19386bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#define PIPE_ALIGN_TYPE(_alignment, _type) __declspec(align(_alignment)) _type
1945dfd5ed5e7d23d4ee8572669af2673c3a1315763José Fonseca#define PIPE_ALIGN_VAR(_alignment) __declspec(align(_alignment))
19586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
19626c78a4968a3c10ca006699d240150e6aa4b4250José Fonseca#define PIPE_ALIGN_STACK
19786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
198876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#elif defined(SWIG)
199876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz
200876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_TYPE(_alignment, _type) _type
201876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_VAR(_alignment)
202876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz
203876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz#define PIPE_ALIGN_STACK
204876a6b4865a5ab422b6d80d6248cf66a42869172Jakob Bornecrantz
20586bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#else
20686bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
20786bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca#error "Unsupported compiler"
20886bfe974b880dc2cbf40b91ba0fde34e8a9c756eJosé Fonseca
2093772441c498b997947f68e98830f72649bbc8442Brian#endif
2103772441c498b997947f68e98830f72649bbc8442Brian
211c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
212c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#if defined(__GNUC__)
213c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
214c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() __asm__("":::"memory")
215c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
216c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#elif defined(_MSC_VER)
217c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
218c6c62164c369eefe1cac06190a87050977c376c1José Fonsecavoid _ReadWriteBarrier(void);
219c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#pragma intrinsic(_ReadWriteBarrier)
220c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() _ReadWriteBarrier()
221c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
222c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#else
223c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
224c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#warning "Unsupported compiler"
225c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#define PIPE_READ_WRITE_BARRIER() /* */
226c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
227c6c62164c369eefe1cac06190a87050977c376c1José Fonseca#endif
228c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
229c6c62164c369eefe1cac06190a87050977c376c1José Fonseca
2305df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri/* You should use these macros to mark if blocks where the if condition
2315df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * is either likely to be true, or unlikely to be true.
2325df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2335df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * This will inform human readers of this fact, and will also inform
2345df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the compiler, who will in turn inform the CPU.
2355df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2365df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * CPUs often start executing code inside the if or the else blocks
2375df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * without knowing whether the condition is true or not, and will have
2385df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * to throw the work away if they find out later they executed the
2395df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * wrong part of the if.
2405df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2415df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * If these macros are used, the CPU is more likely to correctly predict
2425df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the right path, and will avoid speculatively executing the wrong branch,
2435df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * thus not throwing away work, resulting in better performance.
2445df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2455df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * In light of this, it is also a good idea to mark as "likely" a path
2465df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * which is not necessarily always more likely, but that will benefit much
2475df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * more from performance improvements since it is already much faster than
2485df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * the other path, or viceversa with "unlikely".
2495df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2505df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * Example usage:
2515df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * if(unlikely(do_we_need_a_software_fallback()))
2525df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *    do_software_fallback();
2535df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * else
2545df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *    render_with_gpu();
2555df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2565df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * The macros follow the Linux kernel convention, and more examples can
2575df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * be found there.
2585df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri *
2595df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * Note that profile guided optimization can offer better results, but
2605df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri * needs an appropriate coverage suite and does not inform human readers.
2615df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri */
2625df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#ifdef __GNUC__
2635df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#define likely(x) __builtin_expect(!!(x), 1)
2645df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#define unlikely(x) __builtin_expect(!!(x), 0)
2655df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#else
2665df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#define likely(x) !!(x)
2675df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#define unlikely(x) !!(x)
2685df6c430619d7652a5d0c0fb6c87332407b5330eLuca Barbieri#endif
2693772441c498b997947f68e98830f72649bbc8442Brian
270467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca
271467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#if defined(__cplusplus)
272467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca}
273467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca#endif
274467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca
275467928c6e01d66ea83d90df9903c2a8f0e675240José Fonseca
27676818b67092579585d9fcb7df1a8c133e6c94a6cKeith Whitwell#endif /* P_COMPILER_H */
277