comparison src/cpuinfo/SDL_cpuinfo.c @ 3580:951dd6a5d1a2

Implemented Windows version of SDL_GetCPUCount()
author Sam Lantinga <slouken@libsdl.org>
date Wed, 16 Dec 2009 08:17:05 +0000
parents 3427271a2d75
children 41d01d70659c
comparison
equal deleted inserted replaced
3579:3427271a2d75 3580:951dd6a5d1a2
32 #if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__)) 32 #if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
33 #include <sys/sysctl.h> /* For AltiVec check */ 33 #include <sys/sysctl.h> /* For AltiVec check */
34 #elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP 34 #elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
35 #include <signal.h> 35 #include <signal.h>
36 #include <setjmp.h> 36 #include <setjmp.h>
37 #endif
38 #ifdef __WIN32__
39 #define WIN32_LEAN_AND_MEAN
40 #include <windows.h>
37 #endif 41 #endif
38 42
39 #define CPU_HAS_RDTSC 0x00000001 43 #define CPU_HAS_RDTSC 0x00000001
40 #define CPU_HAS_MMX 0x00000002 44 #define CPU_HAS_MMX 0x00000002
41 #define CPU_HAS_MMXEXT 0x00000004 45 #define CPU_HAS_MMXEXT 0x00000004
149 /* *INDENT-ON* */ 153 /* *INDENT-ON* */
150 return has_CPUID; 154 return has_CPUID;
151 } 155 }
152 156
153 #if defined(__GNUC__) && (defined(i386) || defined(__x86_64__)) 157 #if defined(__GNUC__) && (defined(i386) || defined(__x86_64__))
154 #define cpuid(func, ax, bx, cx, dx) \ 158 #define cpuid(func, a, b, c, d) \
155 __asm__ __volatile__ ("cpuid": \ 159 __asm__ __volatile__ ("cpuid": \
156 "=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) : "a" (func)) 160 "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (func))
157 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) 161 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
158 #define cpuid(func, ax, bx, cx, dx) \ 162 #define cpuid(func, a, b, c, d) \
159 asm { \ 163 __asm { \
160 mov eax, func \ 164 __asm mov eax, func \
161 cpuid 165 __asm cpuid \
162 mov ax, eax \ 166 __asm mov a, eax \
163 mov bx, ebx \ 167 __asm mov b, ebx \
164 mov cx, ecx \ 168 __asm mov c, ecx \
165 mov dx, edx \ 169 __asm mov d, edx \
166 } 170 }
167 #else 171 #else
168 #define cpuid(func, ax, bx, cx, dx) \ 172 #define cpuid(func, a, b, c, d) \
169 ax = bx = cx = dx = 0 173 a = b = c = d = 0
170 #endif 174 #endif
171 175
172 static __inline__ int 176 static __inline__ int
173 CPU_getCPUIDFeatures(void) 177 CPU_getCPUIDFeatures(void)
174 { 178 {
175 int features = 0; 179 int features = 0;
176 int ax, bx, cx, dx; 180 int a, b, c, d;
177 181
178 cpuid(0, ax, bx, cx, dx); 182 cpuid(0, a, b, c, d);
179 if (ax >= 1) { 183 if (a >= 1) {
180 cpuid(1, ax, bx, cx, dx); 184 cpuid(1, a, b, c, d);
181 features = dx; 185 features = d;
182 } 186 }
183 return features; 187 return features;
184 } 188 }
185 189
186 static __inline__ int 190 static __inline__ int
187 CPU_getCPUIDFeaturesExt(void) 191 CPU_getCPUIDFeaturesExt(void)
188 { 192 {
189 int features = 0; 193 int features = 0;
190 int ax, bx, cx, dx; 194 int a, b, c, d;
191 195
192 cpuid(0x80000000, ax, bx, cx, dx); 196 cpuid(0x80000000, a, b, c, d);
193 if (ax >= 0x80000001) { 197 if (a >= 0x80000001) {
194 cpuid(0x80000001, ax, bx, cx, dx); 198 cpuid(0x80000001, a, b, c, d);
195 features = dx; 199 features = d;
196 } 200 }
197 return features; 201 return features;
198 } 202 }
199 203
200 static __inline__ int 204 static __inline__ int
288 int 292 int
289 SDL_GetCPUCount() 293 SDL_GetCPUCount()
290 { 294 {
291 if (!SDL_CPUCount) { 295 if (!SDL_CPUCount) {
292 #ifdef HAVE_SYSCTLBYNAME 296 #ifdef HAVE_SYSCTLBYNAME
293 size_t size = sizeof(SDL_CPUCount); 297 {
294 sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0); 298 size_t size = sizeof(SDL_CPUCount);
299 sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0);
300 }
301 #endif
302 #ifdef __WIN32__
303 {
304 SYSTEM_INFO info;
305 GetSystemInfo(&info);
306 SDL_CPUCount = info.dwNumberOfProcessors;
307 }
295 #endif 308 #endif
296 /* There has to be at least 1, right? :) */ 309 /* There has to be at least 1, right? :) */
297 if (!SDL_CPUCount) { 310 if (!SDL_CPUCount) {
298 SDL_CPUCount = 1; 311 SDL_CPUCount = 1;
299 } 312 }
307 { 320 {
308 static char SDL_CPUType[48]; 321 static char SDL_CPUType[48];
309 322
310 if (!SDL_CPUType[0]) { 323 if (!SDL_CPUType[0]) {
311 int i = 0; 324 int i = 0;
312 int ax, bx, cx, dx; 325 int a, b, c, d;
313 326
314 if (CPU_haveCPUID()) { 327 if (CPU_haveCPUID()) {
315 cpuid(0x80000000, ax, bx, cx, dx); 328 cpuid(0x80000000, a, b, c, d);
316 if (ax >= 0x80000004) { 329 if (a >= 0x80000004) {
317 cpuid(0x80000002, ax, bx, cx, dx); 330 cpuid(0x80000002, a, b, c, d);
318 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 331 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
319 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 332 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
320 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 333 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
321 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 334 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
322 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 335 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
323 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 336 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
324 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 337 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
325 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 338 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
326 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 339 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
327 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 340 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
328 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 341 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
329 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 342 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
330 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 343 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
331 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 344 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
332 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 345 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
333 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 346 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
334 cpuid(0x80000003, ax, bx, cx, dx); 347 cpuid(0x80000003, a, b, c, d);
335 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 348 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
336 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 349 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
337 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 350 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
338 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 351 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
339 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 352 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
340 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 353 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
341 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 354 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
342 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 355 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
343 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 356 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
344 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 357 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
345 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 358 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
346 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 359 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
347 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 360 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
348 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 361 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
349 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 362 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
350 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 363 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
351 cpuid(0x80000004, ax, bx, cx, dx); 364 cpuid(0x80000004, a, b, c, d);
352 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 365 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
353 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 366 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
354 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 367 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
355 SDL_CPUType[i++] = (char)(ax & 0xff); ax >>= 8; 368 SDL_CPUType[i++] = (char)(a & 0xff); a >>= 8;
356 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 369 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
357 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 370 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
358 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 371 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
359 SDL_CPUType[i++] = (char)(bx & 0xff); bx >>= 8; 372 SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
360 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 373 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
361 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 374 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
362 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 375 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
363 SDL_CPUType[i++] = (char)(cx & 0xff); cx >>= 8; 376 SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
364 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 377 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
365 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 378 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
366 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 379 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
367 SDL_CPUType[i++] = (char)(dx & 0xff); dx >>= 8; 380 SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
368 } 381 }
369 } 382 }
370 if (!SDL_CPUType[0]) { 383 if (!SDL_CPUType[0]) {
371 SDL_strlcpy(SDL_CPUType, "Unknown", sizeof(SDL_CPUType)); 384 SDL_strlcpy(SDL_CPUType, "Unknown", sizeof(SDL_CPUType));
372 } 385 }