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
96using intreg_t = int32_t;
97using uintreg_t = uint32_t;
98constexpr std::size_t hardware_destructive_interference_size = 128;
99constexpr std::size_t hardware_constructive_interference_size = 64;
100#elif HI_PROCESSOR == HI_CPU_X64
101using intreg_t = int64_t;
102using uintreg_t = uint64_t;
103constexpr std::size_t hardware_destructive_interference_size = 128;
104constexpr std::size_t hardware_constructive_interference_size = 64;
105#elif HI_PROCESSOR == HI_CPU_ARM
106using intreg_t = int32_t;
107using uintreg_t = uint32_t;
108constexpr std::size_t hardware_destructive_interference_size = 128;
109constexpr std::size_t hardware_constructive_interference_size = 64;
110#elif HI_PROCESSOR == HI_CPU_ARM64
111using intreg_t = int64_t;
112using uintreg_t = uint64_t;
113constexpr std::size_t hardware_destructive_interference_size = 128;
114constexpr std::size_t hardware_constructive_interference_size = 64;
116#error "missing implementation for CPU specific register and cache-line sizes"
119#if defined(__AVX512BW__) && defined(__AVX512CD__) && defined(__AVX512DQ__) && defined(__AVX512F__) && defined(__AVX512VL__)
120#define HI_X86_64_V4 1
121#define HI_X86_64_V3 1
122#define HI_X86_64_V2_5 1
123#define HI_X86_64_V2 1
124#define HI_X86_64_V1 1
128#define HI_HAS_SSE4_1 1
129#define HI_HAS_SSE4_2 1
130#define HI_HAS_SSSE3 1
135#define HI_HAS_AVX512F 1
136#define HI_HAS_AVX512BW 1
137#define HI_HAS_AVX512CD 1
138#define HI_HAS_AVX512DQ 1
139#define HI_HAS_AVX512VL 1
141#elif defined(__AVX2__)
142#define HI_X86_64_V3 1
143#define HI_X86_64_V2_5 1
144#define HI_X86_64_V2 1
145#define HI_X86_64_V1 1
149#define HI_HAS_SSE4_1 1
150#define HI_HAS_SSE4_2 1
151#define HI_HAS_SSSE3 1
157#elif defined(__AVX__)
158#define HI_X86_64_V2_5 1
159#define HI_X86_64_V2 1
160#define HI_X86_64_V1 1
164#define HI_HAS_SSE4_1 1
165#define HI_HAS_SSE4_2 1
166#define HI_HAS_SSSE3 1
170#elif defined(__SSE4_2__) && defined(__SSSE3__)
171#define HI_X86_64_V2 1
172#define HI_X86_64_V1 1
176#define HI_HAS_SSE4_1 1
177#define HI_HAS_SSE4_2 1
178#define HI_HAS_SSSE3 1
180#elif HI_PROCESSOR == HI_CPU_X64
181#define HI_X86_64_V1 1
185#elif HI_PROCESSOR == HI_CPU_X86
186#elif HI_PROCESSOR == HI_CPU_ARM64
187#elif HI_PROCESSOR == HI_CPU_ARM
220#if HI_PROCESSOR == HI_CPU_X64
228#elif HI_PROCESSOR == HI_CPU_ARM
232constexpr std::size_t hardware_destructive_interference_size = 64;
237constexpr std::size_t hardware_constructive_interference_size = 64;
239#elif HI_PROCESSOR == HI_CPU_UNKNOWN
240constexpr std::size_t hardware_destructive_interference_size = 128;
241constexpr std::size_t hardware_constructive_interference_size = 64;
243#error "Missing implementation of hardware_destructive_interference_size and hardware_constructive_interference_size"
246#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
250#elif HI_OPERATING_SYSTEM == HI_OS_MACOS
252using file_handle = int;
254#elif HI_OPERATING_SYSTEM == HI_OS_LINUX
256using file_handle = int;
259#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:247