Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
539 lines (496 loc) · 15.6 KB

SDL_cpuinfo.c

File metadata and controls

539 lines (496 loc) · 15.6 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Jan 24, 2010
Jan 24, 2010
3
Copyright (C) 1997-2010 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
23
24
25
/* CPU feature detection for SDL */
Feb 16, 2006
Feb 16, 2006
26
27
#include "SDL_cpuinfo.h"
Dec 17, 2009
Dec 17, 2009
28
29
30
#ifdef HAVE_SYSCONF
#include <unistd.h>
#endif
Dec 16, 2009
Dec 16, 2009
31
32
33
34
#ifdef HAVE_SYSCTLBYNAME
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
Sep 5, 2009
Sep 5, 2009
35
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
Jul 10, 2006
Jul 10, 2006
36
#include <sys/sysctl.h> /* For AltiVec check */
Mar 9, 2006
Mar 9, 2006
37
38
39
#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
#include <signal.h>
#include <setjmp.h>
Jan 6, 2004
Jan 6, 2004
40
#endif
Dec 16, 2009
Dec 16, 2009
41
42
43
44
#ifdef __WIN32__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
Jan 6, 2004
Jan 6, 2004
45
Dec 16, 2009
Dec 16, 2009
46
47
48
49
#define CPU_HAS_RDTSC 0x00000001
#define CPU_HAS_MMX 0x00000002
#define CPU_HAS_MMXEXT 0x00000004
#define CPU_HAS_3DNOW 0x00000010
Jan 24, 2004
Jan 24, 2004
50
#define CPU_HAS_3DNOWEXT 0x00000020
Dec 16, 2009
Dec 16, 2009
51
52
53
#define CPU_HAS_SSE 0x00000040
#define CPU_HAS_SSE2 0x00000080
#define CPU_HAS_ALTIVEC 0x00000100
Mar 9, 2006
Mar 9, 2006
55
#if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__
Jan 29, 2004
Jan 29, 2004
56
57
58
59
/* This is the brute force way of detecting instruction sets...
the idea is borrowed from the libmpeg2 library - thanks!
*/
static jmp_buf jmpbuf;
Jul 10, 2006
Jul 10, 2006
60
61
static void
illegal_instruction(int sig)
Jan 29, 2004
Jan 29, 2004
62
{
Jul 10, 2006
Jul 10, 2006
63
longjmp(jmpbuf, 1);
Jan 29, 2004
Jan 29, 2004
64
}
Feb 16, 2006
Feb 16, 2006
65
#endif /* HAVE_SETJMP */
Jan 29, 2004
Jan 29, 2004
66
Jul 10, 2006
Jul 10, 2006
67
68
static __inline__ int
CPU_haveCPUID(void)
Nov 24, 2003
Nov 24, 2003
69
{
Jul 10, 2006
Jul 10, 2006
70
71
int has_CPUID = 0;
/* *INDENT-OFF* */
Nov 24, 2003
Nov 24, 2003
72
#if defined(__GNUC__) && defined(i386)
Dec 16, 2009
Dec 16, 2009
73
__asm__ (
Nov 24, 2003
Nov 24, 2003
74
75
76
77
78
79
80
81
82
83
84
85
" pushfl # Get original EFLAGS \n"
" popl %%eax \n"
" movl %%eax,%%ecx \n"
" xorl $0x200000,%%eax # Flip ID bit in EFLAGS \n"
" pushl %%eax # Save new EFLAGS value on stack \n"
" popfl # Replace current EFLAGS value \n"
" pushfl # Get new EFLAGS \n"
" popl %%eax # Store new EFLAGS in EAX \n"
" xorl %%ecx,%%eax # Can not toggle ID bit, \n"
" jz 1f # Processor=80486 \n"
" movl $1,%0 # We have CPUID support \n"
"1: \n"
Dec 16, 2009
Dec 16, 2009
86
87
88
89
: "=m" (has_CPUID)
:
: "%eax", "%ecx"
);
Apr 11, 2004
Apr 11, 2004
90
91
92
#elif defined(__GNUC__) && defined(__x86_64__)
/* Technically, if this is being compiled under __x86_64__ then it has
CPUid by definition. But it's nice to be able to prove it. :) */
Dec 16, 2009
Dec 16, 2009
93
__asm__ (
Apr 11, 2004
Apr 11, 2004
94
95
96
97
98
99
100
101
102
103
104
105
" pushfq # Get original EFLAGS \n"
" popq %%rax \n"
" movq %%rax,%%rcx \n"
" xorl $0x200000,%%eax # Flip ID bit in EFLAGS \n"
" pushq %%rax # Save new EFLAGS value on stack \n"
" popfq # Replace current EFLAGS value \n"
" pushfq # Get new EFLAGS \n"
" popq %%rax # Store new EFLAGS in EAX \n"
" xorl %%ecx,%%eax # Can not toggle ID bit, \n"
" jz 1f # Processor=80486 \n"
" movl $1,%0 # We have CPUID support \n"
"1: \n"
Dec 16, 2009
Dec 16, 2009
106
107
108
109
: "=m" (has_CPUID)
:
: "%rax", "%rcx"
);
Feb 26, 2006
Feb 26, 2006
110
#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
Dec 16, 2009
Dec 16, 2009
111
__asm {
Nov 24, 2003
Nov 24, 2003
112
113
114
115
116
117
118
119
120
121
122
123
pushfd ; Get original EFLAGS
pop eax
mov ecx, eax
xor eax, 200000h ; Flip ID bit in EFLAGS
push eax ; Save new EFLAGS value on stack
popfd ; Replace current EFLAGS value
pushfd ; Get new EFLAGS
pop eax ; Store new EFLAGS in EAX
xor eax, ecx ; Can not toggle ID bit,
jz done ; Processor=80486
mov has_CPUID,1 ; We have CPUID support
done:
Dec 16, 2009
Dec 16, 2009
124
}
Jun 20, 2006
Jun 20, 2006
125
#elif defined(__sun) && defined(__i386)
Dec 16, 2009
Dec 16, 2009
126
__asm (
Jan 5, 2006
Jan 5, 2006
127
" pushfl \n"
Dec 16, 2009
Dec 16, 2009
128
129
130
131
132
133
134
135
136
137
" popl %eax \n"
" movl %eax,%ecx \n"
" xorl $0x200000,%eax \n"
" pushl %eax \n"
" popfl \n"
" pushfl \n"
" popl %eax \n"
" xorl %ecx,%eax \n"
" jz 1f \n"
" movl $1,-8(%ebp) \n"
Jan 5, 2006
Jan 5, 2006
138
"1: \n"
Dec 16, 2009
Dec 16, 2009
139
);
Jan 5, 2006
Jan 5, 2006
140
#elif defined(__sun) && defined(__amd64)
Dec 16, 2009
Dec 16, 2009
141
__asm (
Jan 5, 2006
Jan 5, 2006
142
143
144
145
146
147
148
149
150
151
152
153
" pushfq \n"
" popq %rax \n"
" movq %rax,%rcx \n"
" xorl $0x200000,%eax \n"
" pushq %rax \n"
" popfq \n"
" pushfq \n"
" popq %rax \n"
" xorl %ecx,%eax \n"
" jz 1f \n"
" movl $1,-8(%rbp) \n"
"1: \n"
Dec 16, 2009
Dec 16, 2009
154
);
Nov 24, 2003
Nov 24, 2003
155
#endif
Jul 10, 2006
Jul 10, 2006
156
157
/* *INDENT-ON* */
return has_CPUID;
Nov 24, 2003
Nov 24, 2003
158
159
}
Dec 17, 2009
Dec 17, 2009
160
#if defined(__GNUC__) && defined(i386)
Dec 16, 2009
Dec 16, 2009
161
#define cpuid(func, a, b, c, d) \
Dec 16, 2009
Dec 16, 2009
162
163
164
165
166
167
__asm__ __volatile__ ( \
" pushl %%ebx \n" \
" cpuid \n" \
" movl %%ebx, %%esi \n" \
" popl %%ebx \n" : \
"=a" (a), "=S" (b), "=c" (c), "=d" (d) : "a" (func))
Dec 17, 2009
Dec 17, 2009
168
169
170
171
172
173
174
175
#elif defined(__GNUC__) && defined(__x86_64__)
#define cpuid(func, a, b, c, d) \
__asm__ __volatile__ ( \
" pushq %%rbx \n" \
" cpuid \n" \
" movq %%rbx, %%rsi \n" \
" popq %%rbx \n" : \
"=a" (a), "=S" (b), "=c" (c), "=d" (d) : "a" (func))
Dec 16, 2009
Dec 16, 2009
176
#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
Dec 16, 2009
Dec 16, 2009
177
178
179
180
181
182
183
184
#define cpuid(func, a, b, c, d) \
__asm { \
__asm mov eax, func \
__asm cpuid \
__asm mov a, eax \
__asm mov b, ebx \
__asm mov c, ecx \
__asm mov d, edx \
Dec 16, 2009
Dec 16, 2009
185
186
}
#else
Dec 16, 2009
Dec 16, 2009
187
188
#define cpuid(func, a, b, c, d) \
a = b = c = d = 0
Dec 16, 2009
Dec 16, 2009
189
190
#endif
Jul 10, 2006
Jul 10, 2006
191
192
static __inline__ int
CPU_getCPUIDFeatures(void)
Nov 24, 2003
Nov 24, 2003
193
{
Jul 10, 2006
Jul 10, 2006
194
int features = 0;
Dec 16, 2009
Dec 16, 2009
195
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
196
Dec 16, 2009
Dec 16, 2009
197
198
199
200
cpuid(0, a, b, c, d);
if (a >= 1) {
cpuid(1, a, b, c, d);
features = d;
Dec 16, 2009
Dec 16, 2009
201
}
Jul 10, 2006
Jul 10, 2006
202
return features;
Nov 24, 2003
Nov 24, 2003
203
204
}
Jul 10, 2006
Jul 10, 2006
205
206
static __inline__ int
CPU_getCPUIDFeaturesExt(void)
Nov 24, 2003
Nov 24, 2003
207
{
Jul 10, 2006
Jul 10, 2006
208
int features = 0;
Dec 16, 2009
Dec 16, 2009
209
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
210
Dec 16, 2009
Dec 16, 2009
211
212
213
214
cpuid(0x80000000, a, b, c, d);
if (a >= 0x80000001) {
cpuid(0x80000001, a, b, c, d);
features = d;
Dec 16, 2009
Dec 16, 2009
215
}
Jul 10, 2006
Jul 10, 2006
216
return features;
Jan 24, 2004
Jan 24, 2004
217
218
}
Jul 10, 2006
Jul 10, 2006
219
220
static __inline__ int
CPU_haveRDTSC(void)
Jan 24, 2004
Jan 24, 2004
221
{
Jul 10, 2006
Jul 10, 2006
222
223
224
225
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x00000010);
}
return 0;
Jan 24, 2004
Jan 24, 2004
226
227
}
Jul 10, 2006
Jul 10, 2006
228
229
static __inline__ int
CPU_haveMMX(void)
Jan 24, 2004
Jan 24, 2004
230
{
Jul 10, 2006
Jul 10, 2006
231
232
233
234
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x00800000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
235
236
}
Jul 10, 2006
Jul 10, 2006
237
238
static __inline__ int
CPU_haveMMXExt(void)
Jan 24, 2004
Jan 24, 2004
239
{
Jul 10, 2006
Jul 10, 2006
240
241
242
243
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x00400000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
244
245
}
Jul 10, 2006
Jul 10, 2006
246
247
static __inline__ int
CPU_have3DNow(void)
Jan 24, 2004
Jan 24, 2004
248
{
Jul 10, 2006
Jul 10, 2006
249
250
251
252
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x80000000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
253
254
}
Jul 10, 2006
Jul 10, 2006
255
256
static __inline__ int
CPU_have3DNowExt(void)
Jan 24, 2004
Jan 24, 2004
257
{
Jul 10, 2006
Jul 10, 2006
258
259
260
261
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x40000000);
}
return 0;
Nov 24, 2003
Nov 24, 2003
262
263
}
Jul 10, 2006
Jul 10, 2006
264
265
static __inline__ int
CPU_haveSSE(void)
Nov 24, 2003
Nov 24, 2003
266
{
Jul 10, 2006
Jul 10, 2006
267
268
269
270
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x02000000);
}
return 0;
Nov 24, 2003
Nov 24, 2003
271
}
Jul 10, 2006
Jul 10, 2006
273
274
static __inline__ int
CPU_haveSSE2(void)
Jan 24, 2004
Jan 24, 2004
275
{
Jul 10, 2006
Jul 10, 2006
276
277
278
279
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x04000000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
280
281
}
Jul 10, 2006
Jul 10, 2006
282
283
static __inline__ int
CPU_haveAltiVec(void)
Jan 6, 2004
Jan 6, 2004
284
{
Jul 10, 2006
Jul 10, 2006
285
volatile int altivec = 0;
Sep 5, 2009
Sep 5, 2009
286
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
Jul 10, 2006
Jul 10, 2006
287
288
289
290
291
292
int selectors[2] = { CTL_HW, HW_VECTORUNIT };
int hasVectorUnit = 0;
size_t length = sizeof(hasVectorUnit);
int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0);
if (0 == error)
altivec = (hasVectorUnit != 0);
Feb 16, 2006
Feb 16, 2006
293
#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
Jul 10, 2006
Jul 10, 2006
294
295
296
297
298
299
300
void (*handler) (int sig);
handler = signal(SIGILL, illegal_instruction);
if (setjmp(jmpbuf) == 0) {
asm volatile ("mtspr 256, %0\n\t" "vand %%v0, %%v0, %%v0"::"r" (-1));
altivec = 1;
}
signal(SIGILL, handler);
Jan 6, 2004
Jan 6, 2004
301
#endif
Jul 10, 2006
Jul 10, 2006
302
return altivec;
Jan 6, 2004
Jan 6, 2004
303
304
}
Dec 16, 2009
Dec 16, 2009
305
306
307
308
309
310
static int SDL_CPUCount = 0;
int
SDL_GetCPUCount()
{
if (!SDL_CPUCount) {
Jan 6, 2010
Jan 6, 2010
311
#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
Dec 17, 2009
Dec 17, 2009
312
313
314
315
if (SDL_CPUCount <= 0) {
SDL_CPUCount = (int)sysconf(_SC_NPROCESSORS_ONLN);
}
#endif
Dec 16, 2009
Dec 16, 2009
316
#ifdef HAVE_SYSCTLBYNAME
Dec 17, 2009
Dec 17, 2009
317
if (SDL_CPUCount <= 0) {
Dec 16, 2009
Dec 16, 2009
318
319
320
321
322
size_t size = sizeof(SDL_CPUCount);
sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0);
}
#endif
#ifdef __WIN32__
Dec 17, 2009
Dec 17, 2009
323
if (SDL_CPUCount <= 0) {
Dec 16, 2009
Dec 16, 2009
324
325
326
327
SYSTEM_INFO info;
GetSystemInfo(&info);
SDL_CPUCount = info.dwNumberOfProcessors;
}
Dec 16, 2009
Dec 16, 2009
328
329
#endif
/* There has to be at least 1, right? :) */
Dec 17, 2009
Dec 17, 2009
330
if (SDL_CPUCount <= 0) {
Dec 16, 2009
Dec 16, 2009
331
332
333
334
335
336
337
338
339
340
341
342
343
344
SDL_CPUCount = 1;
}
}
return SDL_CPUCount;
}
/* Oh, such a sweet sweet trick, just not very useful. :) */
const char *
SDL_GetCPUType()
{
static char SDL_CPUType[48];
if (!SDL_CPUType[0]) {
int i = 0;
Dec 16, 2009
Dec 16, 2009
345
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
346
347
if (CPU_haveCPUID()) {
Dec 16, 2009
Dec 16, 2009
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
cpuid(0x80000000, a, b, c, d);
if (a >= 0x80000004) {
cpuid(0x80000002, a, b, c, d);
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
cpuid(0x80000003, a, b, c, d);
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
cpuid(0x80000004, a, b, c, d);
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
Dec 16, 2009
Dec 16, 2009
401
402
403
404
405
406
407
408
409
}
}
if (!SDL_CPUType[0]) {
SDL_strlcpy(SDL_CPUType, "Unknown", sizeof(SDL_CPUType));
}
}
return SDL_CPUType;
}
410
411
static Uint32 SDL_CPUFeatures = 0xFFFFFFFF;
Jul 10, 2006
Jul 10, 2006
412
413
static Uint32
SDL_GetCPUFeatures(void)
Jul 10, 2006
Jul 10, 2006
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
if (SDL_CPUFeatures == 0xFFFFFFFF) {
SDL_CPUFeatures = 0;
if (CPU_haveRDTSC()) {
SDL_CPUFeatures |= CPU_HAS_RDTSC;
}
if (CPU_haveMMX()) {
SDL_CPUFeatures |= CPU_HAS_MMX;
}
if (CPU_haveMMXExt()) {
SDL_CPUFeatures |= CPU_HAS_MMXEXT;
}
if (CPU_have3DNow()) {
SDL_CPUFeatures |= CPU_HAS_3DNOW;
}
if (CPU_have3DNowExt()) {
SDL_CPUFeatures |= CPU_HAS_3DNOWEXT;
}
if (CPU_haveSSE()) {
SDL_CPUFeatures |= CPU_HAS_SSE;
}
if (CPU_haveSSE2()) {
SDL_CPUFeatures |= CPU_HAS_SSE2;
}
if (CPU_haveAltiVec()) {
SDL_CPUFeatures |= CPU_HAS_ALTIVEC;
}
}
return SDL_CPUFeatures;
Jul 10, 2006
Jul 10, 2006
445
446
SDL_bool
SDL_HasRDTSC(void)
Nov 24, 2003
Nov 24, 2003
447
{
Jul 10, 2006
Jul 10, 2006
448
449
450
451
if (SDL_GetCPUFeatures() & CPU_HAS_RDTSC) {
return SDL_TRUE;
}
return SDL_FALSE;
Nov 24, 2003
Nov 24, 2003
452
453
}
Jul 10, 2006
Jul 10, 2006
454
455
SDL_bool
SDL_HasMMX(void)
Jul 10, 2006
Jul 10, 2006
457
458
459
460
if (SDL_GetCPUFeatures() & CPU_HAS_MMX) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
463
464
SDL_bool
SDL_HasMMXExt(void)
Jul 10, 2006
Jul 10, 2006
466
467
468
469
if (SDL_GetCPUFeatures() & CPU_HAS_MMXEXT) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
472
473
SDL_bool
SDL_Has3DNow(void)
Jul 10, 2006
Jul 10, 2006
475
476
477
478
if (SDL_GetCPUFeatures() & CPU_HAS_3DNOW) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
481
482
SDL_bool
SDL_Has3DNowExt(void)
Jan 6, 2004
Jan 6, 2004
483
{
Jul 10, 2006
Jul 10, 2006
484
485
486
487
if (SDL_GetCPUFeatures() & CPU_HAS_3DNOWEXT) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 6, 2004
Jan 6, 2004
488
489
}
Jul 10, 2006
Jul 10, 2006
490
491
SDL_bool
SDL_HasSSE(void)
Jan 24, 2004
Jan 24, 2004
492
{
Jul 10, 2006
Jul 10, 2006
493
494
495
496
if (SDL_GetCPUFeatures() & CPU_HAS_SSE) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
497
498
}
Jul 10, 2006
Jul 10, 2006
499
500
SDL_bool
SDL_HasSSE2(void)
Jan 24, 2004
Jan 24, 2004
501
{
Jul 10, 2006
Jul 10, 2006
502
503
504
505
if (SDL_GetCPUFeatures() & CPU_HAS_SSE2) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
506
507
}
Jul 10, 2006
Jul 10, 2006
508
509
SDL_bool
SDL_HasAltiVec(void)
Jan 24, 2004
Jan 24, 2004
510
{
Jul 10, 2006
Jul 10, 2006
511
512
513
514
if (SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
515
516
}
517
518
519
520
#ifdef TEST_MAIN
#include <stdio.h>
Jul 10, 2006
Jul 10, 2006
521
522
int
main()
Dec 16, 2009
Dec 16, 2009
524
525
printf("CPU count: %d\n", SDL_GetCPUCount());
printf("CPU name: %s\n", SDL_GetCPUType());
Jul 10, 2006
Jul 10, 2006
526
527
528
529
530
531
532
533
534
printf("RDTSC: %d\n", SDL_HasRDTSC());
printf("MMX: %d\n", SDL_HasMMX());
printf("MMXExt: %d\n", SDL_HasMMXExt());
printf("3DNow: %d\n", SDL_Has3DNow());
printf("3DNowExt: %d\n", SDL_Has3DNowExt());
printf("SSE: %d\n", SDL_HasSSE());
printf("SSE2: %d\n", SDL_HasSSE2());
printf("AltiVec: %d\n", SDL_HasAltiVec());
return 0;
535
536
537
}
#endif /* TEST_MAIN */
Jul 10, 2006
Jul 10, 2006
538
539
/* vi: set ts=4 sw=4 expandtab: */