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 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(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H) |
61 | #include <mm3dnow.h> |
62 | #endif |
63 | #if HAVE_IMMINTRIN_H && !defined(SDL_DISABLE_IMMINTRIN_H) |
64 | #include <immintrin.h> |
65 | #else |
66 | #if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H) |
67 | #include <mmintrin.h> |
68 | #endif |
69 | #if defined(__SSE__) && !defined(SDL_DISABLE_XMMINTRIN_H) |
70 | #include <xmmintrin.h> |
71 | #endif |
72 | #if defined(__SSE2__) && !defined(SDL_DISABLE_EMMINTRIN_H) |
73 | #include <emmintrin.h> |
74 | #endif |
75 | #if defined(__SSE3__) && !defined(SDL_DISABLE_PMMINTRIN_H) |
76 | #include <pmmintrin.h> |
77 | #endif |
78 | #endif /* HAVE_IMMINTRIN_H */ |
79 | #endif /* compiler version */ |
80 | |
81 | #include "begin_code.h" |
82 | /* Set up for C function definitions, even when using C++ */ |
83 | #ifdef __cplusplus |
84 | extern "C" { |
85 | #endif |
86 | |
87 | /* This is a guess for the cacheline size used for padding. |
88 | * Most x86 processors have a 64 byte cache line. |
89 | * The 64-bit PowerPC processors have a 128 byte cache line. |
90 | * We'll use the larger value to be generally safe. |
91 | */ |
92 | #define SDL_CACHELINE_SIZE 128 |
93 | |
94 | /** |
95 | * This function returns the number of CPU cores available. |
96 | */ |
97 | extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); |
98 | |
99 | /** |
100 | * This function returns the L1 cache line size of the CPU |
101 | * |
102 | * This is useful for determining multi-threaded structure padding |
103 | * or SIMD prefetch sizes. |
104 | */ |
105 | extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); |
106 | |
107 | /** |
108 | * This function returns true if the CPU has the RDTSC instruction. |
109 | */ |
110 | extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); |
111 | |
112 | /** |
113 | * This function returns true if the CPU has AltiVec features. |
114 | */ |
115 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); |
116 | |
117 | /** |
118 | * This function returns true if the CPU has MMX features. |
119 | */ |
120 | extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); |
121 | |
122 | /** |
123 | * This function returns true if the CPU has 3DNow! features. |
124 | */ |
125 | extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); |
126 | |
127 | /** |
128 | * This function returns true if the CPU has SSE features. |
129 | */ |
130 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); |
131 | |
132 | /** |
133 | * This function returns true if the CPU has SSE2 features. |
134 | */ |
135 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); |
136 | |
137 | /** |
138 | * This function returns true if the CPU has SSE3 features. |
139 | */ |
140 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); |
141 | |
142 | /** |
143 | * This function returns true if the CPU has SSE4.1 features. |
144 | */ |
145 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); |
146 | |
147 | /** |
148 | * This function returns true if the CPU has SSE4.2 features. |
149 | */ |
150 | extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); |
151 | |
152 | /** |
153 | * This function returns true if the CPU has AVX features. |
154 | */ |
155 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); |
156 | |
157 | /** |
158 | * This function returns true if the CPU has AVX2 features. |
159 | */ |
160 | extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); |
161 | |
162 | /** |
163 | * This function returns true if the CPU has NEON (ARM SIMD) features. |
164 | */ |
165 | extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); |
166 | |
167 | /** |
168 | * This function returns the amount of RAM configured in the system, in MB. |
169 | */ |
170 | extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); |
171 | |
172 | |
173 | /* Ends C function definitions when using C++ */ |
174 | #ifdef __cplusplus |
175 | } |
176 | #endif |
177 | #include "close_code.h" |
178 | |
179 | #endif /* SDL_cpuinfo_h_ */ |
180 | |
181 | /* vi: set ts=4 sw=4 expandtab: */ |
182 | |