11#ifndef ZSTD_COMPILER_H
12#define ZSTD_COMPILER_H
21#if !defined(ZSTD_NO_INLINE)
22#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
23# define INLINE_KEYWORD inline
25# define INLINE_KEYWORD
28#if defined(__GNUC__) || defined(__ICCARM__)
29# define FORCE_INLINE_ATTR __attribute__((always_inline))
30#elif defined(_MSC_VER)
31# define FORCE_INLINE_ATTR __forceinline
33# define FORCE_INLINE_ATTR
39#define FORCE_INLINE_ATTR
49# define WIN_CDECL __cdecl
59#define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR
71#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5
72# define HINT_INLINE static INLINE_KEYWORD
74# define HINT_INLINE static INLINE_KEYWORD FORCE_INLINE_ATTR
79# define UNUSED_ATTR __attribute__((unused))
86# define FORCE_NOINLINE static __declspec(noinline)
88# if defined(__GNUC__) || defined(__ICCARM__)
89# define FORCE_NOINLINE static __attribute__((__noinline__))
91# define FORCE_NOINLINE static
97#if defined(__GNUC__) || defined(__ICCARM__)
98# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target)))
100# define TARGET_ATTRIBUTE(target)
107#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2")
111#if defined(NO_PREFETCH)
112# define PREFETCH_L1(ptr) (void)(ptr)
113# define PREFETCH_L2(ptr) (void)(ptr)
115# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86))
116# include <mmintrin.h>
117# define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
118# define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
119# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )
120# define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 , 3 )
121# define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 , 2 )
122# elif defined(__aarch64__)
123# define PREFETCH_L1(ptr) __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr)))
124# define PREFETCH_L2(ptr) __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr)))
126# define PREFETCH_L1(ptr) (void)(ptr)
127# define PREFETCH_L2(ptr) (void)(ptr)
131#define CACHELINE_SIZE 64
133#define PREFETCH_AREA(p, s) { \
134 const char* const _ptr = (const char*)(p); \
135 size_t const _size = (size_t)(s); \
137 for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \
138 PREFETCH_L2(_ptr + _pos); \
145#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__)
146# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5)
147# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
149# define DONT_VECTORIZE _Pragma("GCC optimize(\"no-tree-vectorize\")")
152# define DONT_VECTORIZE
161#define LIKELY(x) (__builtin_expect((x), 1))
162#define UNLIKELY(x) (__builtin_expect((x), 0))
165#define UNLIKELY(x) (x)
168#if __has_builtin(__builtin_unreachable) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)))
169# define ZSTD_UNREACHABLE { assert(0), __builtin_unreachable(); }
171# define ZSTD_UNREACHABLE { assert(0); }
177# pragma warning(disable : 4100)
178# pragma warning(disable : 4127)
179# pragma warning(disable : 4204)
180# pragma warning(disable : 4214)
181# pragma warning(disable : 4324)
186# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86))
188# define STATIC_BMI2 1
190# elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__)
191# define STATIC_BMI2 1
196 #define STATIC_BMI2 0
200#if !defined(ZSTD_NO_INTRINSICS)
201# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2))
202# define ZSTD_ARCH_X86_SSE2
204# if defined(__ARM_NEON) || defined(_M_ARM64)
205# define ZSTD_ARCH_ARM_NEON
208# if defined(ZSTD_ARCH_X86_SSE2)
209# include <emmintrin.h>
210# elif defined(ZSTD_ARCH_ARM_NEON)
211# include <arm_neon.h>
216#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute)
217# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)
219# define ZSTD_HAS_C_ATTRIBUTE(x) 0
225#if defined(__cplusplus) && defined(__has_cpp_attribute)
226# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
228# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0
236#ifndef ZSTD_FALLTHROUGH
237# if ZSTD_HAS_C_ATTRIBUTE(fallthrough)
238# define ZSTD_FALLTHROUGH [[fallthrough]]
239# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough)
240# define ZSTD_FALLTHROUGH [[fallthrough]]
241# elif __has_attribute(__fallthrough__)
245# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__))
247# define ZSTD_FALLTHROUGH
262# if defined(__GNUC__) || defined(_MSC_VER)
266# define ZSTD_ALIGNOF(T) __alignof(T)
268# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
270# include <stdalign.h>
271# define ZSTD_ALIGNOF(T) alignof(T)
275# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T))
287#ifndef ZSTD_ASAN_DONT_POISON_WORKSPACE
288#define ZSTD_ASAN_DONT_POISON_WORKSPACE 1
290#ifndef ZSTD_MSAN_DONT_POISON_WORKSPACE
291#define ZSTD_MSAN_DONT_POISON_WORKSPACE 1
295#if ZSTD_MEMORY_SANITIZER && !defined(ZSTD_MSAN_DONT_POISON_WORKSPACE)
300#define ZSTD_DEPS_NEED_STDINT
304void __msan_unpoison(
const volatile void *
a,
size_t size);
309void __msan_poison(
const volatile void *
a,
size_t size);
313intptr_t __msan_test_shadow(
const volatile void *x,
size_t size);
317void __msan_print_shadow(
const volatile void *x,
size_t size);
320#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE)
340void __asan_poison_memory_region(
void const volatile *addr,
size_t size);
355void __asan_unpoison_memory_region(
void const volatile *addr,
size_t size);
#define a(i)
Definition sha256.c:41