+/*
+ * compiler-gcc.h
+ *
+ * The author dedicates this file to the public domain.
+ * You can do whatever you want with this file.
+ */
+
+#ifndef _WIMLIB_COMPILER_GCC_H
+#define _WIMLIB_COMPILER_GCC_H
+
+#ifdef __WIN32__
+# define WIMLIBAPI __declspec(dllexport)
+#else
+# define WIMLIBAPI __attribute__((visibility("default")))
+#endif
+
+#define _packed_attribute __attribute__((packed))
+#define _aligned_attribute(n) __attribute__((aligned(n)))
+#define _may_alias_attribute __attribute__((may_alias))
+#define likely(expr) __builtin_expect(!!(expr), 1)
+#define unlikely(expr) __builtin_expect(!!(expr), 0)
+#define prefetch(addr) __builtin_prefetch(addr)
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _cold_attribute __attribute__((cold))
+#endif
+#define _malloc_attribute __attribute__((malloc))
+#define inline inline __attribute__((always_inline))
+
+#define CPU_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+
+#if defined(__x86_64__) || defined(__i386__)
+# define UNALIGNED_ACCESS_SPEED 3
+#elif defined(__ARM_FEATURE_UNALIGNED) && (__ARM_FEATURE_UNALIGNED == 1)
+# define UNALIGNED_ACCESS_SPEED 2
+#else
+# define UNALIGNED_ACCESS_SPEED 0
+#endif
+
+#define typeof __typeof__
+
+#ifndef min
+# define min(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); \
+ (_a < _b) ? _a : _b; })
+#endif
+
+#ifndef max
+# define max(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); \
+ (_a > _b) ? _a : _b; })
+#endif
+
+#ifndef swap
+# define swap(a, b) ({ typeof(a) _a = (a); (a) = (b); (b) = _a; })
+#endif
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+# define compiler_bswap32 __builtin_bswap32
+# define compiler_bswap64 __builtin_bswap64
+#endif
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+# define compiler_bswap16 __builtin_bswap16
+#endif
+
+#define compiler_fls32(n) (31 - __builtin_clz(n))
+#define compiler_fls64(n) (63 - __builtin_clzll(n))
+#define compiler_ffs32(n) __builtin_ctz(n)
+#define compiler_ffs64(n) __builtin_ctzll(n)
+
+#endif /* _WIMLIB_COMPILER_GCC_H */