4 * The author dedicates this file to the public domain.
5 * You can do whatever you want with this file.
8 #ifndef _WIMLIB_COMPILER_GCC_H
9 #define _WIMLIB_COMPILER_GCC_H
12 # define WIMLIBAPI __declspec(dllexport)
14 # define WIMLIBAPI __attribute__((visibility("default")))
17 #define _packed_attribute __attribute__((packed))
18 #define _aligned_attribute(n) __attribute__((aligned(n)))
19 #define _may_alias_attribute __attribute__((may_alias))
20 #define likely(expr) __builtin_expect(!!(expr), 1)
21 #define unlikely(expr) __builtin_expect(!!(expr), 0)
22 #define prefetch(addr) __builtin_prefetch(addr)
23 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
24 # define _cold_attribute __attribute__((cold))
26 #define _malloc_attribute __attribute__((malloc))
27 #define inline inline __attribute__((always_inline))
28 #define noinline __attribute__((noinline))
30 /* Newer gcc supports __BYTE_ORDER__. Older gcc doesn't. */
32 # define CPU_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
33 #elif defined(HAVE_CONFIG_H)
35 # ifdef WORDS_BIGENDIAN
36 # define CPU_IS_BIG_ENDIAN 1
38 # define CPU_IS_BIG_ENDIAN 0
42 #if defined(__x86_64__) || defined(__i386__)
43 # define UNALIGNED_ACCESS_SPEED 3
44 #elif defined(__ARM_FEATURE_UNALIGNED) && (__ARM_FEATURE_UNALIGNED == 1)
45 # define UNALIGNED_ACCESS_SPEED 2
47 # define UNALIGNED_ACCESS_SPEED 0
50 #define typeof __typeof__
53 # define min(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); \
54 (_a < _b) ? _a : _b; })
58 # define max(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); \
59 (_a > _b) ? _a : _b; })
63 # define swap(a, b) ({ typeof(a) _a = (a); (a) = (b); (b) = _a; })
66 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
67 # define compiler_bswap32 __builtin_bswap32
68 # define compiler_bswap64 __builtin_bswap64
71 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
72 # define compiler_bswap16 __builtin_bswap16
75 #define compiler_fls32(n) (31 - __builtin_clz(n))
76 #define compiler_fls64(n) (63 - __builtin_clzll(n))
77 #define compiler_ffs32(n) __builtin_ctz(n)
78 #define compiler_ffs64(n) __builtin_ctzll(n)
80 #endif /* _WIMLIB_COMPILER_GCC_H */