1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | /** |
23 | * \file SDL_cpuinfo.h |
24 | * |
25 | * CPU feature detection for SDL. |
26 | */ |
27 | |
28 | #ifndef SDL_cpuinfo_h_ |
29 | #define SDL_cpuinfo_h_ |
30 | |
31 | #include "SDL_stdinc.h" |
32 | |
33 | /* Need to do this here because intrin.h has C++ code in it */ |
34 | /* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ |
35 | #if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64)) |
36 | #ifdef __clang__ |
37 | /* Many of the intrinsics SDL uses are not implemented by clang with Visual Studio */ |
38 | #undef __MMX__ |
39 | #undef __SSE__ |
40 | #undef __SSE2__ |
41 | #else |
42 | #include <intrin.h> |
43 | #ifndef _WIN64 |
44 | #define __MMX__ |
45 | #define __3dNOW__ |
46 | #endif |
47 | #define __SSE__ |
48 | #define __SSE2__ |
49 | #endif /* __clang__ */ |
50 | #elif defined(__MINGW64_VERSION_MAJOR) |
51 | #include <intrin.h> |
52 | #else |
53 | #ifdef __ALTIVEC__ |
54 | #if defined(HAVE_ALTIVEC_H) && !defined(__APPLE_ALTIVEC__) && !defined(SDL_DISABLE_ALTIVEC_H) |
55 | #include <altivec.h> |
56 | #undef pixel |
57 | #undef bool |
58 | #endif |
59 | #endif |
60 | #if defined(__ARM_NEON__) && !defined(SDL_DISABLE_ARM_NEON_H) |
61 | #include <arm_neon.h> |
62 | #endif |
63 | #if defined(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H) |
64 | #include <mm3dnow.h> |
65 | #endif |
66 | #if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) |
67 | #include <immintrin.h> |
68 | #else |
69 | #if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H) |
70 | #include <mmintrin.h> |
71 | #endif |
72 | #if defined(__SSE__) && !defined(SDL_DISABLE_XMMINTRIN_H) |
73 | #include <xmmintrin.h> |
74 | #endif |
75 | #if defined(__SSE2__) && !defined(SDL_DISABLE_EMMINTRIN_H) |
76 | #include <emmintrin.h> |
77 | #endif |
78 | #if defined(__SSE3__) && !defined(SDL_DISABLE_PMMINTRIN_H) |
79 | #include <pmmintrin.h> |
80 | #endif |
81 | #endif /* HAVE_IMMINTRIN_H */ |
82 | #endif /* compiler version */ |
83 | |
84 | #include "begin_code.h" |
85 | /* Set up for C function definitions, even when using C++ */ |
86 | #ifdef __cplusplus |
87 | extern "C" { |
88 | #endif |
89 | |
90 | /* This is a guess for the cacheline size used for padding. |
91 | * Most x86 processors have a 64 byte cache line. |
92 | * The 64-bit PowerPC processors have a 128 byte cache line. |
93 | * We'll use the larger value to be generally safe. |
94 | */ |
95 | #define SDL_CACHELINE_SIZE 128 |
96 | |
97 | /** |
98 | * This function returns the number of CPU cores available. |
99 | */ |
100 | extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); |
101 | |
102 | /** |
103 | * This function returns the L1 cache line size of the CPU |
104 | * |
105 | * This is useful for determining multi-threaded structure padding |
106 | * or SIMD prefetch sizes. |
107 | */ |
108 | extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); |
109 | |
110 | /** |
111 | * This function returns true if the CPU has the RDTSC instruction. |
112 | */ |
113 | extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); |
114 | |
115 | /** |
116 | * This function returns true if the CPU has AltiVec features. |
117 | */ |
118 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); |
119 | |
120 | /** |
121 | * This function returns true if the CPU has MMX features. |
122 | */ |
123 | extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); |
124 | |
125 | /** |
126 | * This function returns true if the CPU has 3DNow! features. |
127 | */ |
128 | extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); |
129 | |
130 | /** |
131 | * This function returns true if the CPU has SSE features. |
132 | */ |
133 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); |
134 | |
135 | /** |
136 | * This function returns true if the CPU has SSE2 features. |
137 | */ |
138 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); |
139 | |
140 | /** |
141 | * This function returns true if the CPU has SSE3 features. |
142 | */ |
143 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); |
144 | |
145 | /** |
146 | * This function returns true if the CPU has SSE4.1 features. |
147 | */ |
148 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); |
149 | |
150 | /** |
151 | * This function returns true if the CPU has SSE4.2 features. |
152 | */ |
153 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); |
154 | |
155 | /** |
156 | * This function returns true if the CPU has AVX features. |
157 | */ |
158 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); |
159 | |
160 | /** |
161 | * This function returns true if the CPU has AVX2 features. |
162 | */ |
163 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); |
164 | |
165 | /** |
166 | * This function returns true if the CPU has AVX-512F (foundation) features. |
167 | */ |
168 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); |
169 | |
170 | /** |
171 | * This function returns true if the CPU has NEON (ARM SIMD) features. |
172 | */ |
173 | extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); |
174 | |
175 | /** |
176 | * This function returns the amount of RAM configured in the system, in MB. |
177 | */ |
178 | extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); |
179 | |
180 | /* Ends C function definitions when using C++ */ |
181 | #ifdef __cplusplus |
182 | } |
183 | #endif |
184 | #include "close_code.h" |
185 | |
186 | #endif /* SDL_cpuinfo_h_ */ |
187 | |
188 | /* vi: set ts=4 sw=4 expandtab: */ |
189 | |