aboutsummaryrefslogtreecommitdiffstats
path: root/util/system/platform.h
blob: b085cf5b1bf06e762972f18fcd3c2d84a6a486d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#pragma once

// ya style breaks indentation in ifdef's and code becomes unreadable
// clang-format off

// What OS ?
// our definition has the form _{osname}_

#if defined(_WIN64)
    #define _win64_
    #define _win32_
#elif defined(__WIN32__) || defined(_WIN32) // _WIN32 is also defined by the 64-bit compiler for backward compatibility
    #define _win32_
#else
    #define _unix_

    #if defined(__sun__) || defined(sun) || defined(sparc) || defined(__sparc)
        #define _sun_
    #endif

    #if defined(__hpux__)
        #define _hpux_
    #endif

    #if defined(__linux__)
        // Stands for "Linux" in the means of Linux kernel (i. e. Android is included)
        #define _linux_
    #endif

    #if defined(__FreeBSD__)
        #define _freebsd_
    #endif

    #if defined(__CYGWIN__)
        #define _cygwin_
    #endif

    #if defined(__APPLE__)
        #define _darwin_
    #endif

    #if defined(__ANDROID__)
        #define _android_
    #endif
#endif

#if defined(__IOS__)
    #define _ios_
#endif

#if defined(_linux_)
    #if defined(_musl_)
        // nothing to do
    #elif defined(_android_)
        // Please do not mix with android-based systems.
        // This definition describes Standard Library (libc) type.
        #define _bionic_
    #else
        #define _glibc_
    #endif
#endif

#if defined(_darwin_)
    #define unix
    #define __unix__
#endif

#if defined(_win32_) || defined(_win64_)
    #define _win_
#endif

#if defined(__arm__) || defined(__ARM__) || defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM)
    #if defined(__arm64) || defined(__arm64__) || defined(__aarch64__)
        #define _arm64_
    #else
        #define _arm32_
    #endif
#endif

#if defined(_arm64_) || defined(_arm32_)
    #define _arm_
#endif

/* __ia64__ and __x86_64__      - defined by GNU C.
 * _M_IA64, _M_X64, _M_AMD64    - defined by Visual Studio.
 *
 * Microsoft can define _M_IX86, _M_AMD64 (before Visual Studio 8)
 * or _M_X64 (starting in Visual Studio 8).
 */
#if defined(__x86_64__) || defined(_M_X64)
    #define _x86_64_
#endif

#if defined(__i386__) || defined(_M_IX86)
    #define _i386_
#endif

#if defined(__ia64__) || defined(_M_IA64)
    #define _ia64_
#endif

#if defined(__powerpc__)
    #define _ppc_
#endif

#if defined(__powerpc64__)
    #define _ppc64_
#endif

#if !defined(sparc) && !defined(__sparc) && !defined(__hpux__) && !defined(__alpha__) && !defined(_ia64_) && !defined(_x86_64_) && !defined(_arm_) && !defined(_i386_) && !defined(_ppc_) && !defined(_ppc64_)
    #error "platform not defined, please, define one"
#endif

#if defined(_x86_64_) || defined(_i386_)
    #define _x86_
#endif

#if defined(__MIC__)
    #define _mic_
    #define _k1om_
#endif

// stdio or MessageBox
#if defined(__CONSOLE__) || defined(_CONSOLE)
    #define _console_
#endif
#if (defined(_win_) && !defined(_console_))
    #define _windows_
#elif !defined(_console_)
    #define _console_
#endif

#if defined(__SSE__) || defined(SSE_ENABLED)
    #define _sse_
#endif

#if defined(__SSE2__) || defined(SSE2_ENABLED)
    #define _sse2_
#endif

#if defined(__SSE3__) || defined(SSE3_ENABLED)
    #define _sse3_
#endif

#if defined(__SSSE3__) || defined(SSSE3_ENABLED)
    #define _ssse3_
#endif

#if defined(__SSE4_1__) || defined(SSE41_ENABLED)
    #define _sse4_1_
#endif

#if defined(__SSE4_2__) || defined(SSE42_ENABLED)
    #define _sse4_2_
#endif

#if defined(__POPCNT__) || defined(POPCNT_ENABLED)
    #define _popcnt_
#endif

#if defined(__PCLMUL__) || defined(PCLMUL_ENABLED)
    #define _pclmul_
#endif

#if defined(__AES__) || defined(AES_ENABLED)
    #define _aes_
#endif

#if defined(__AVX__) || defined(AVX_ENABLED)
    #define _avx_
#endif

#if defined(__AVX2__) || defined(AVX2_ENABLED)
    #define _avx2_
#endif

#if defined(__FMA__) || defined(FMA_ENABLED)
    #define _fma_
#endif

#if defined(__DLL__) || defined(_DLL)
    #define _dll_
#endif

// 16, 32 or 64
#if defined(__sparc_v9__) || defined(_x86_64_) || defined(_ia64_) || defined(_arm64_) || defined(_ppc64_)
    #define _64_
#else
    #define _32_
#endif

/* All modern 64-bit Unix systems use scheme LP64 (long, pointers are 64-bit).
 * Microsoft uses a different scheme: LLP64 (long long, pointers are 64-bit).
 *
 * Scheme          LP64   LLP64
 * char              8      8
 * short            16     16
 * int              32     32
 * long             64     32
 * long long        64     64
 * pointer          64     64
 */

#if defined(_32_)
    #define SIZEOF_PTR 4
#elif defined(_64_)
    #define SIZEOF_PTR 8
#endif

#define PLATFORM_DATA_ALIGN SIZEOF_PTR

#if !defined(SIZEOF_PTR)
    #error todo
#endif

#define SIZEOF_CHAR 1
#define SIZEOF_UNSIGNED_CHAR 1
#define SIZEOF_SHORT 2
#define SIZEOF_UNSIGNED_SHORT 2
#define SIZEOF_INT 4
#define SIZEOF_UNSIGNED_INT 4

#if defined(_32_)
    #define SIZEOF_LONG 4
    #define SIZEOF_UNSIGNED_LONG 4
#elif defined(_64_)
    #if defined(_win_)
        #define SIZEOF_LONG 4
        #define SIZEOF_UNSIGNED_LONG 4
    #else
        #define SIZEOF_LONG 8
        #define SIZEOF_UNSIGNED_LONG 8
    #endif // _win_
#endif // _32_

#if !defined(SIZEOF_LONG)
    #error todo
#endif

#define SIZEOF_LONG_LONG 8
#define SIZEOF_UNSIGNED_LONG_LONG 8

// clang-format on