HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
architecture.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2019-2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
10#pragma once
11
12#include <exception>
13#include <cstddef>
14#include <type_traits>
15#if defined(__APPLE__)
16#include <TargetConditionals.h>
17#endif
18
19namespace hi::inline v1 {
20
21#define HI_OS_WINDOWS 'W'
22#define HI_OS_MACOS 'A'
23#define HI_OS_MOBILE 'M'
24#define HI_OS_OTHER 'O'
25
26#if defined(_WIN32)
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
32#else
33#define HI_OPERATING_SYSTEM HI_OS_OTHER
34#endif
35
36enum class operating_system {
37 windows = HI_OS_WINDOWS,
38 macos = HI_OS_MACOS,
39 mobile = HI_OS_MOBILE,
40 other = HI_OS_OTHER,
41
42 current = HI_OPERATING_SYSTEM
43};
44
45#define HI_CC_MSVC 'm'
46#define HI_CC_GCC 'g'
47#define HI_CC_CLANG 'c'
48
49#if defined(__clang__)
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
55#else
56#error "Could not detect the compiler."
57#endif
58
59enum class compiler {
60 msvc = HI_CC_MSVC,
61 gcc = HI_CC_GCC,
62 clang = HI_CC_CLANG,
63
64 current = HI_COMPILER
65};
66
67#define HI_CPU_X86 'i'
68#define HI_CPU_X64 'I'
69#define HI_CPU_ARM 'a'
70#define HI_CPU_ARM64 'A'
71#define HI_CPU_UNKNOWN '-'
72
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
81#else
82#define HI_PROCESSOR HI_CPU_UNKNOWN
83#endif
84
85enum class processor {
86 x86 = HI_CPU_X86,
87 x64 = HI_CPU_X64,
88 arm = HI_CPU_ARM,
89 arm64 = HI_CPU_ARM64,
90 unknown = HI_CPU_UNKNOWN,
91
92 current = HI_PROCESSOR
93};
94
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;
98using intreg_t = int32_t;
99using uintreg_t = uint32_t;
100#elif HI_PROCESSOR == HI_CPU_X64
101constexpr std::size_t hardware_destructive_interference_size = 128;
102constexpr std::size_t hardware_constructive_interference_size = 64;
103using intreg_t = int64_t;
104using uintreg_t = uint64_t;
105#elif HI_PROCESSOR == HI_CPU_ARM
106constexpr std::size_t hardware_destructive_interference_size = 128;
107constexpr std::size_t hardware_constructive_interference_size = 64;
108using intreg_t = int32_t;
109using uintreg_t = uint32_t;
110#elif HI_PROCESSOR == HI_CPU_ARM64
111constexpr std::size_t hardware_destructive_interference_size = 128;
112constexpr std::size_t hardware_constructive_interference_size = 64;
113using intreg_t = int64_t;
114using uintreg_t = uint64_t;
115#else
116#error "missing implementation for CPU specific register and cache-line sizes"
117#endif
118
119#if defined(__AVX512BW__) && defined(__AVX512CD__) && defined(__AVX512DQ__) && defined(__AVX512F__) && defined(__AVX512VL__)
120#define HI_X86_64_LEVEL 4
121#elif defined(__AVX2__)
122#define HI_X86_64_LEVEL 3
123#elif defined(__SSE4_2__) && defined(__SSSE3__)
124#define HI_X86_64_LEVEL 2
125#elif HI_PROCESSOR == HI_CPU_X64
126#define HI_X86_64_LEVEL 1
127#endif
128
129#if defined(HI_X86_64_MAX_LEVEL) && defined(HI_X86_64_LEVEL) && HI_X86_64_MAX_LEVEL < HI_X86_64_LEVEL
130#undef HI_X86_64_LEVEL
131#define HI_X86_64_LEVEL HI_X86_64_MAX_LEVEL
132#endif
133
134#if defined(HI_X86_64_LEVEL) && HI_X86_64_LEVEL >= 4
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
140#endif
141
142#if defined(HI_X86_64_LEVEL) && HI_X86_64_LEVEL >= 3
143#define HI_HAS_AVX 1
144#define HI_HAS_AVX2 1
145#define HI_HAS_BMI1 1
146#define HI_HAS_BMI2 1
147#define HI_HAS_F16C 1
148#define HI_HAS_FMA 1
149#define HI_HAS_LZCNT 1
150#define HI_HAS_MOVBE 1
151#define HI_HAS_OSXSAVE 1
152#endif
153
154#if defined(HI_X86_64_LEVEL) && HI_X86_64_LEVEL >= 2
155#define HI_HAS_CMPXCHG16B 1
156#define HI_HAS_LAHF_SAHF 1
157#define HI_HAS_POPCNT 1
158#define HI_HAS_SSE3 1
159#define HI_HAS_SSE4_1 1
160#define HI_HAS_SSE4_2 1
161#define HI_HAS_SSSE3 1
162#endif
163
164#if defined(HI_X86_64_LEVEL) && HI_X86_64_LEVEL >= 1
165#define HI_HAS_CMOV 1
166#define HI_HAS_CX8 1
167#define HI_HAS_FPU 1
168#define HI_HAS_FXSR 1
169#define HI_HAS_MMX 1
170#define HI_HAS_OSFXSR 1
171#define HI_HAS_SCE 1
172#define HI_HAS_SSE 1
173#define HI_HAS_SSE2 1
174#endif
175
176#if (HI_COMPILER == HI_CC_GCC || HI_COMPILER == HI_CC_CLANG) && (HI_PROCESSOR == HI_CPU_X64 || HI_PROCESSOR == HI_CPU_ARM64)
177#define HI_HAS_INT128 1
180using int128_t = __int128;
181
184using uint128_t = unsigned __int128;
185
186#endif
187
188#if HI_OPERATING_SYSTEM == HI_OS_WINDOWS
189using os_handle = void *;
190using file_handle = os_handle;
191
192#elif HI_OPERATING_SYSTEM == HI_OS_MACOS
193using os_handle = int;
194using file_handle = int;
195
196#elif HI_OPERATING_SYSTEM == HI_OS_LINUX
197using os_handle = int;
198using file_handle = int;
199
200#else
201#error "file_handle Not implemented."
202#endif
203
204} // namespace hi::inline v1
@ current
Continue from the current position.
@ other
The gui_event does not have associated data.
DOXYGEN BUG.
Definition algorithm.hpp:13
__int128 int128_t
Signed 128 bit integer.
Definition architecture.hpp:180
unsigned __int128 uint128_t
Unsigned 128 bit integer.
Definition architecture.hpp:184