16#include <TargetConditionals.h>
19namespace hi::inline
v1 {
21#define HI_OS_WINDOWS 'W'
22#define HI_OS_MACOS 'A'
23#define HI_OS_MOBILE 'M'
24#define HI_OS_OTHER 'O'
27#define HI_OPERATING_SYSTEM HI_OS_WINDOWS
28#elif defined(TARGET_OS_MAC) && !defined(TARGET_OS_IPHONE)
29#define HI_OPERATING_SYSTEM HI_OS_MACOS
30#elif defined(TARGET_OS_IPHONE) || defined(__ANDROID__)
31#define HI_OPERATING_SYSTEM HI_OS_MOBILE
33#define HI_OPERATING_SYSTEM HI_OS_OTHER
36enum class operating_system {
37 windows = HI_OS_WINDOWS,
39 mobile = HI_OS_MOBILE,
42 current = HI_OPERATING_SYSTEM
47#define HI_CC_CLANG 'c'
50#define HI_COMPILER HI_CC_CLANG
51#elif defined(_MSC_BUILD)
52#define HI_COMPILER HI_CC_MSVC
53#elif defined(__GNUC__)
54#define HI_COMPILER HI_CC_GCC
56#error "Could not detect the compiler."
70#define HI_CPU_ARM64 'A'
71#define HI_CPU_UNKNOWN '-'
73#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64)
74#define HI_PROCESSOR HI_CPU_X64
75#elif defined(__aarch64__) || defined(_M_ARM64)
76#define HI_PROCESSOR HI_CPU_ARM64
77#elif defined(__i386__) || defined(_M_IX86)
78#define HI_PROCESSOR HI_CPU_X86
79#elif defined(__arm__) || defined(__arm) || defeind(_ARM) || defined(_M_ARM)
80#define HI_PROCESSOR HI_CPU_ARM
82#define HI_PROCESSOR HI_CPU_UNKNOWN
90 unknown = HI_CPU_UNKNOWN,
92 current = HI_PROCESSOR
95#if HI_PROCESSOR == HI_CPU_X86
96constexpr std::size_t hardware_destructive_interference_size = 128;
97constexpr std::size_t hardware_constructive_interference_size = 64;
98#elif HI_PROCESSOR == HI_CPU_X64
99constexpr std::size_t hardware_destructive_interference_size = 128;
100constexpr std::size_t hardware_constructive_interference_size = 64;
101#elif HI_PROCESSOR == HI_CPU_ARM
102constexpr std::size_t hardware_destructive_interference_size = 128;
103constexpr std::size_t hardware_constructive_interference_size = 64;
104#elif HI_PROCESSOR == HI_CPU_ARM64
105constexpr std::size_t hardware_destructive_interference_size = 128;
106constexpr std::size_t hardware_constructive_interference_size = 64;
108#error "missing implementation for CPU specific register and cache-line sizes"
111#if defined(__AVX512BW__) && defined(__AVX512CD__) && defined(__AVX512DQ__) && defined(__AVX512F__) && defined(__AVX512VL__)
112#define HI_X86_64_V4 1
113#define HI_X86_64_V3 1
114#define HI_X86_64_V2_5 1
115#define HI_X86_64_V2 1
116#define HI_X86_64_V1 1
120#define HI_HAS_SSE4_1 1
121#define HI_HAS_SSE4_2 1
122#define HI_HAS_SSSE3 1
127#define HI_HAS_AVX512F 1
128#define HI_HAS_AVX512BW 1
129#define HI_HAS_AVX512CD 1
130#define HI_HAS_AVX512DQ 1
131#define HI_HAS_AVX512VL 1
133#elif defined(__AVX2__)
134#define HI_X86_64_V3 1
135#define HI_X86_64_V2_5 1
136#define HI_X86_64_V2 1
137#define HI_X86_64_V1 1
141#define HI_HAS_SSE4_1 1
142#define HI_HAS_SSE4_2 1
143#define HI_HAS_SSSE3 1
149#elif defined(__AVX__)
150#define HI_X86_64_V2_5 1
151#define HI_X86_64_V2 1
152#define HI_X86_64_V1 1
156#define HI_HAS_SSE4_1 1
157#define HI_HAS_SSE4_2 1
158#define HI_HAS_SSSE3 1
162#elif defined(__SSE4_2__) && defined(__SSSE3__)
163#define HI_X86_64_V2 1
164#define HI_X86_64_V1 1
168#define HI_HAS_SSE4_1 1
169#define HI_HAS_SSE4_2 1
170#define HI_HAS_SSSE3 1
172#elif HI_PROCESSOR == HI_CPU_X64
173#define HI_X86_64_V1 1
177#elif HI_PROCESSOR == HI_CPU_X86
178#elif HI_PROCESSOR == HI_CPU_ARM64
179#elif HI_PROCESSOR == HI_CPU_ARM
212#if HI_PROCESSOR == HI_CPU_X64
220#elif HI_PROCESSOR == HI_CPU_ARM
224constexpr std::size_t hardware_destructive_interference_size = 64;
229constexpr std::size_t hardware_constructive_interference_size = 64;
231#elif HI_PROCESSOR == HI_CPU_UNKNOWN
232constexpr std::size_t hardware_destructive_interference_size = 128;
233constexpr std::size_t hardware_constructive_interference_size = 64;
235#error "Missing implementation of hardware_destructive_interference_size and hardware_constructive_interference_size"
238#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
242#elif HI_OPERATING_SYSTEM == HI_OS_MACOS
244using file_handle = int;
246#elif HI_OPERATING_SYSTEM == HI_OS_LINUX
248using file_handle = int;
251#error "file_handle Not implemented."
DOXYGEN BUG.
Definition algorithm.hpp:15
void * os_handle
Minimum offset between two objects to avoid false sharing.
Definition architecture.hpp:239