1/* 2 * Copyright (c) 2011 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Chris Wilson <chris@chris-wilson.co.uk> 25 * 26 */ 27 28#ifndef _SNA_COMPILER_H_ 29#define _SNA_COMPILER_H_ 30 31#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) 32#define likely(expr) (__builtin_expect (!!(expr), 1)) 33#define unlikely(expr) (__builtin_expect (!!(expr), 0)) 34#define noinline __attribute__((noinline)) 35#define force_inline inline /* __attribute__((always_inline)) */ 36#define fastcall __attribute__((regparm(3))) 37#define must_check __attribute__((warn_unused_result)) 38#define constant __attribute__((const)) 39#define pure __attribute__((pure)) 40#define tightly_packed __attribute__((__packed__)) 41#define flatten __attribute__((flatten)) 42#define nonnull __attribute__((nonnull)) 43#define page_aligned __attribute__((aligned(4096))) 44#else 45#define likely(expr) (expr) 46#define unlikely(expr) (expr) 47#define noinline 48#define force_inline inline 49#define fastcall 50#define must_check 51#define constant 52#define pure 53#define tighly_packed 54#define flatten 55#define nonnull 56#define page_aligned 57#endif 58 59#define HAS_GCC(major, minor) defined(__GNUC__) && (__GNUC__ > (major) || __GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) 60 61#if HAS_GCC(4, 5) 62#define sse2 fast __attribute__((target("sse2,fpmath=sse"))) 63#define sse4_2 fast __attribute__((target("sse4.2,sse2,fpmath=sse"))) 64#endif 65 66#if HAS_GCC(4, 6) && defined(__OPTIMIZE__) 67#define fast __attribute__((optimize("Ofast"))) 68#else 69#define fast 70#endif 71 72#if HAS_GCC(4, 7) 73#define avx2 fast __attribute__((target("avx2,avx,sse4.2,sse2,fpmath=sse"))) 74#define assume_aligned(ptr, align) __builtin_assume_aligned((ptr), (align)) 75#define assume_misaligned(ptr, align, offset) __builtin_assume_aligned((ptr), (align), (offset)) 76#else 77#define assume_aligned(ptr, align) (ptr) 78#define assume_misaligned(ptr, align, offset) (ptr) 79#endif 80 81#if HAS_GCC(4, 5) && defined(__OPTIMIZE__) 82#define fast_memcpy fast __attribute__((target("inline-all-stringops"))) 83#else 84#define fast_memcpy 85#endif 86 87#ifdef HAVE_VALGRIND 88#define VG(x) x 89#else 90#define VG(x) 91#endif 92 93#define VG_CLEAR(s) VG(memset(&s, 0, sizeof(s))) 94 95#define COMPILE_TIME_ASSERT(E) ((void)sizeof(char[1 - 2*!(E)])) 96 97#endif /* _SNA_COMPILER_H_ */ 98