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

Latest commit

 

History

History
523 lines (480 loc) · 15.1 KB

SDL_cpuinfo.c

File metadata and controls

523 lines (480 loc) · 15.1 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 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 16, 2009
Dec 16, 2009
28
29
30
31
#ifdef HAVE_SYSCTLBYNAME
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
Sep 5, 2009
Sep 5, 2009
32
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
Jul 10, 2006
Jul 10, 2006
33
#include <sys/sysctl.h> /* For AltiVec check */
Mar 9, 2006
Mar 9, 2006
34
35
36
#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
#include <signal.h>
#include <setjmp.h>
Jan 6, 2004
Jan 6, 2004
37
#endif
Dec 16, 2009
Dec 16, 2009
38
39
40
41
#ifdef __WIN32__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
Jan 6, 2004
Jan 6, 2004
42
Dec 16, 2009
Dec 16, 2009
43
44
45
46
#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
47
#define CPU_HAS_3DNOWEXT 0x00000020
Dec 16, 2009
Dec 16, 2009
48
49
50
#define CPU_HAS_SSE 0x00000040
#define CPU_HAS_SSE2 0x00000080
#define CPU_HAS_ALTIVEC 0x00000100
Mar 9, 2006
Mar 9, 2006
52
#if SDL_ALTIVEC_BLITTERS && HAVE_SETJMP && !__MACOSX__
Jan 29, 2004
Jan 29, 2004
53
54
55
56
/* 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
57
58
static void
illegal_instruction(int sig)
Jan 29, 2004
Jan 29, 2004
59
{
Jul 10, 2006
Jul 10, 2006
60
longjmp(jmpbuf, 1);
Jan 29, 2004
Jan 29, 2004
61
}
Feb 16, 2006
Feb 16, 2006
62
#endif /* HAVE_SETJMP */
Jan 29, 2004
Jan 29, 2004
63
Jul 10, 2006
Jul 10, 2006
64
65
static __inline__ int
CPU_haveCPUID(void)
Nov 24, 2003
Nov 24, 2003
66
{
Jul 10, 2006
Jul 10, 2006
67
68
int has_CPUID = 0;
/* *INDENT-OFF* */
Nov 24, 2003
Nov 24, 2003
69
#if defined(__GNUC__) && defined(i386)
Dec 16, 2009
Dec 16, 2009
70
__asm__ (
Nov 24, 2003
Nov 24, 2003
71
72
73
74
75
76
77
78
79
80
81
82
" 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
83
84
85
86
: "=m" (has_CPUID)
:
: "%eax", "%ecx"
);
Apr 11, 2004
Apr 11, 2004
87
88
89
#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
90
__asm__ (
Apr 11, 2004
Apr 11, 2004
91
92
93
94
95
96
97
98
99
100
101
102
" 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
103
104
105
106
: "=m" (has_CPUID)
:
: "%rax", "%rcx"
);
Feb 26, 2006
Feb 26, 2006
107
#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
Dec 16, 2009
Dec 16, 2009
108
__asm {
Nov 24, 2003
Nov 24, 2003
109
110
111
112
113
114
115
116
117
118
119
120
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
121
}
Jun 20, 2006
Jun 20, 2006
122
#elif defined(__sun) && defined(__i386)
Dec 16, 2009
Dec 16, 2009
123
__asm (
Jan 5, 2006
Jan 5, 2006
124
" pushfl \n"
Dec 16, 2009
Dec 16, 2009
125
126
127
128
129
130
131
132
133
134
" 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
135
"1: \n"
Dec 16, 2009
Dec 16, 2009
136
);
Jan 5, 2006
Jan 5, 2006
137
#elif defined(__sun) && defined(__amd64)
Dec 16, 2009
Dec 16, 2009
138
__asm (
Jan 5, 2006
Jan 5, 2006
139
140
141
142
143
144
145
146
147
148
149
150
" 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
151
);
Nov 24, 2003
Nov 24, 2003
152
#endif
Jul 10, 2006
Jul 10, 2006
153
154
/* *INDENT-ON* */
return has_CPUID;
Nov 24, 2003
Nov 24, 2003
155
156
}
Dec 16, 2009
Dec 16, 2009
157
#if defined(__GNUC__) && (defined(i386) || defined(__x86_64__))
Dec 16, 2009
Dec 16, 2009
158
#define cpuid(func, a, b, c, d) \
Dec 16, 2009
Dec 16, 2009
159
160
161
162
163
164
__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 16, 2009
Dec 16, 2009
165
#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
Dec 16, 2009
Dec 16, 2009
166
167
168
169
170
171
172
173
#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
174
175
}
#else
Dec 16, 2009
Dec 16, 2009
176
177
#define cpuid(func, a, b, c, d) \
a = b = c = d = 0
Dec 16, 2009
Dec 16, 2009
178
179
#endif
Jul 10, 2006
Jul 10, 2006
180
181
static __inline__ int
CPU_getCPUIDFeatures(void)
Nov 24, 2003
Nov 24, 2003
182
{
Jul 10, 2006
Jul 10, 2006
183
int features = 0;
Dec 16, 2009
Dec 16, 2009
184
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
185
Dec 16, 2009
Dec 16, 2009
186
187
188
189
cpuid(0, a, b, c, d);
if (a >= 1) {
cpuid(1, a, b, c, d);
features = d;
Dec 16, 2009
Dec 16, 2009
190
}
Jul 10, 2006
Jul 10, 2006
191
return features;
Nov 24, 2003
Nov 24, 2003
192
193
}
Jul 10, 2006
Jul 10, 2006
194
195
static __inline__ int
CPU_getCPUIDFeaturesExt(void)
Nov 24, 2003
Nov 24, 2003
196
{
Jul 10, 2006
Jul 10, 2006
197
int features = 0;
Dec 16, 2009
Dec 16, 2009
198
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
199
Dec 16, 2009
Dec 16, 2009
200
201
202
203
cpuid(0x80000000, a, b, c, d);
if (a >= 0x80000001) {
cpuid(0x80000001, a, b, c, d);
features = d;
Dec 16, 2009
Dec 16, 2009
204
}
Jul 10, 2006
Jul 10, 2006
205
return features;
Jan 24, 2004
Jan 24, 2004
206
207
}
Jul 10, 2006
Jul 10, 2006
208
209
static __inline__ int
CPU_haveRDTSC(void)
Jan 24, 2004
Jan 24, 2004
210
{
Jul 10, 2006
Jul 10, 2006
211
212
213
214
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x00000010);
}
return 0;
Jan 24, 2004
Jan 24, 2004
215
216
}
Jul 10, 2006
Jul 10, 2006
217
218
static __inline__ int
CPU_haveMMX(void)
Jan 24, 2004
Jan 24, 2004
219
{
Jul 10, 2006
Jul 10, 2006
220
221
222
223
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x00800000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
224
225
}
Jul 10, 2006
Jul 10, 2006
226
227
static __inline__ int
CPU_haveMMXExt(void)
Jan 24, 2004
Jan 24, 2004
228
{
Jul 10, 2006
Jul 10, 2006
229
230
231
232
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x00400000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
233
234
}
Jul 10, 2006
Jul 10, 2006
235
236
static __inline__ int
CPU_have3DNow(void)
Jan 24, 2004
Jan 24, 2004
237
{
Jul 10, 2006
Jul 10, 2006
238
239
240
241
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x80000000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
242
243
}
Jul 10, 2006
Jul 10, 2006
244
245
static __inline__ int
CPU_have3DNowExt(void)
Jan 24, 2004
Jan 24, 2004
246
{
Jul 10, 2006
Jul 10, 2006
247
248
249
250
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeaturesExt() & 0x40000000);
}
return 0;
Nov 24, 2003
Nov 24, 2003
251
252
}
Jul 10, 2006
Jul 10, 2006
253
254
static __inline__ int
CPU_haveSSE(void)
Nov 24, 2003
Nov 24, 2003
255
{
Jul 10, 2006
Jul 10, 2006
256
257
258
259
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x02000000);
}
return 0;
Nov 24, 2003
Nov 24, 2003
260
}
Jul 10, 2006
Jul 10, 2006
262
263
static __inline__ int
CPU_haveSSE2(void)
Jan 24, 2004
Jan 24, 2004
264
{
Jul 10, 2006
Jul 10, 2006
265
266
267
268
if (CPU_haveCPUID()) {
return (CPU_getCPUIDFeatures() & 0x04000000);
}
return 0;
Jan 24, 2004
Jan 24, 2004
269
270
}
Jul 10, 2006
Jul 10, 2006
271
272
static __inline__ int
CPU_haveAltiVec(void)
Jan 6, 2004
Jan 6, 2004
273
{
Jul 10, 2006
Jul 10, 2006
274
volatile int altivec = 0;
Sep 5, 2009
Sep 5, 2009
275
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
Jul 10, 2006
Jul 10, 2006
276
277
278
279
280
281
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
282
#elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
Jul 10, 2006
Jul 10, 2006
283
284
285
286
287
288
289
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
290
#endif
Jul 10, 2006
Jul 10, 2006
291
return altivec;
Jan 6, 2004
Jan 6, 2004
292
293
}
Dec 16, 2009
Dec 16, 2009
294
295
296
297
298
299
300
static int SDL_CPUCount = 0;
int
SDL_GetCPUCount()
{
if (!SDL_CPUCount) {
#ifdef HAVE_SYSCTLBYNAME
Dec 16, 2009
Dec 16, 2009
301
302
303
304
305
306
307
308
309
310
311
{
size_t size = sizeof(SDL_CPUCount);
sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0);
}
#endif
#ifdef __WIN32__
{
SYSTEM_INFO info;
GetSystemInfo(&info);
SDL_CPUCount = info.dwNumberOfProcessors;
}
Dec 16, 2009
Dec 16, 2009
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
#endif
/* There has to be at least 1, right? :) */
if (!SDL_CPUCount) {
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
329
int a, b, c, d;
Dec 16, 2009
Dec 16, 2009
330
331
if (CPU_haveCPUID()) {
Dec 16, 2009
Dec 16, 2009
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
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
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
385
386
387
388
389
390
391
392
393
}
}
if (!SDL_CPUType[0]) {
SDL_strlcpy(SDL_CPUType, "Unknown", sizeof(SDL_CPUType));
}
}
return SDL_CPUType;
}
394
395
static Uint32 SDL_CPUFeatures = 0xFFFFFFFF;
Jul 10, 2006
Jul 10, 2006
396
397
static Uint32
SDL_GetCPUFeatures(void)
Jul 10, 2006
Jul 10, 2006
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
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
429
430
SDL_bool
SDL_HasRDTSC(void)
Nov 24, 2003
Nov 24, 2003
431
{
Jul 10, 2006
Jul 10, 2006
432
433
434
435
if (SDL_GetCPUFeatures() & CPU_HAS_RDTSC) {
return SDL_TRUE;
}
return SDL_FALSE;
Nov 24, 2003
Nov 24, 2003
436
437
}
Jul 10, 2006
Jul 10, 2006
438
439
SDL_bool
SDL_HasMMX(void)
Jul 10, 2006
Jul 10, 2006
441
442
443
444
if (SDL_GetCPUFeatures() & CPU_HAS_MMX) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
447
448
SDL_bool
SDL_HasMMXExt(void)
Jul 10, 2006
Jul 10, 2006
450
451
452
453
if (SDL_GetCPUFeatures() & CPU_HAS_MMXEXT) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
456
457
SDL_bool
SDL_Has3DNow(void)
Jul 10, 2006
Jul 10, 2006
459
460
461
462
if (SDL_GetCPUFeatures() & CPU_HAS_3DNOW) {
return SDL_TRUE;
}
return SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
465
466
SDL_bool
SDL_Has3DNowExt(void)
Jan 6, 2004
Jan 6, 2004
467
{
Jul 10, 2006
Jul 10, 2006
468
469
470
471
if (SDL_GetCPUFeatures() & CPU_HAS_3DNOWEXT) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 6, 2004
Jan 6, 2004
472
473
}
Jul 10, 2006
Jul 10, 2006
474
475
SDL_bool
SDL_HasSSE(void)
Jan 24, 2004
Jan 24, 2004
476
{
Jul 10, 2006
Jul 10, 2006
477
478
479
480
if (SDL_GetCPUFeatures() & CPU_HAS_SSE) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
481
482
}
Jul 10, 2006
Jul 10, 2006
483
484
SDL_bool
SDL_HasSSE2(void)
Jan 24, 2004
Jan 24, 2004
485
{
Jul 10, 2006
Jul 10, 2006
486
487
488
489
if (SDL_GetCPUFeatures() & CPU_HAS_SSE2) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
490
491
}
Jul 10, 2006
Jul 10, 2006
492
493
SDL_bool
SDL_HasAltiVec(void)
Jan 24, 2004
Jan 24, 2004
494
{
Jul 10, 2006
Jul 10, 2006
495
496
497
498
if (SDL_GetCPUFeatures() & CPU_HAS_ALTIVEC) {
return SDL_TRUE;
}
return SDL_FALSE;
Jan 24, 2004
Jan 24, 2004
499
500
}
501
502
503
504
#ifdef TEST_MAIN
#include <stdio.h>
Jul 10, 2006
Jul 10, 2006
505
506
int
main()
Dec 16, 2009
Dec 16, 2009
508
509
printf("CPU count: %d\n", SDL_GetCPUCount());
printf("CPU name: %s\n", SDL_GetCPUType());
Jul 10, 2006
Jul 10, 2006
510
511
512
513
514
515
516
517
518
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;
519
520
521
}
#endif /* TEST_MAIN */
Jul 10, 2006
Jul 10, 2006
522
523
/* vi: set ts=4 sw=4 expandtab: */