00001
00006
00007
00008
00009
00010
00011
00012
00013 #include "host.h"
00014 #include "generic.h"
00015
00321 #if defined(VL_ARCH_IX86) || defined(VL_ARCH_IA64)
00322 #define HAS_CPUID
00323 #endif
00324
00325 #if defined(HAS_CPUID) & defined(VL_COMPILER_MSC)
00326 #include <intrin.h>
00327 VL_INLINE
00328 void _vl_cpuid (vl_int32* info, int function)
00329 {
00330 __cpuid(info, function) ;
00331 }
00332 #endif
00333
00334 #if defined(HAS_CPUID) & defined(VL_COMPILER_GNUC)
00335 VL_INLINE
00336 void _vl_cpuid (vl_int32* info, int function)
00337 {
00338
00339 __asm__ __volatile__
00340 ("pushl %%ebx \n\t"
00341 "cpuid \n\t"
00342 "movl %%ebx, %1 \n\t"
00343 "popl %%ebx \n\t"
00344 : "=a"(info[0]), "=r"(info[1]), "=c"(info[2]), "=d"(info[3])
00345 : "a"(function)
00346 : "cc") ;
00347 }
00348 #endif
00349
00350 #ifdef HAS_CPUID
00351 struct x86cpu_
00352 {
00353 char vendor_string [0x20] ;
00354 vl_bool has_sse42 ;
00355 vl_bool has_sse41 ;
00356 vl_bool has_sse3 ;
00357 vl_bool has_sse2 ;
00358 vl_bool has_sse ;
00359 vl_bool has_mmx ;
00360 } x86cpu ;
00361
00362 vl_bool x86cpu_initialized = 0 ;
00363
00364 void _vl_x86cpu_init ()
00365 {
00366 vl_int32 info [4] ;
00367 int max_func = 0 ;
00368 _vl_cpuid(info, 0) ;
00369 max_func = info[0] ;
00370 *((vl_int32*)x86cpu.vendor_string+0) = info[1] ;
00371 *((vl_int32*)x86cpu.vendor_string+1) = info[3] ;
00372 *((vl_int32*)x86cpu.vendor_string+2) = info[2] ;
00373
00374 if (max_func >= 1) {
00375 _vl_cpuid(info, 1) ;
00376 x86cpu.has_mmx = info[3] & (1 << 23) ;
00377 x86cpu.has_sse = info[3] & (1 << 25) ;
00378 x86cpu.has_sse2 = info[3] & (1 << 26) ;
00379 x86cpu.has_sse3 = info[2] & (1 << 0) ;
00380 x86cpu.has_sse41 = info[2] & (1 << 19) ;
00381 x86cpu.has_sse42 = info[2] & (1 << 20) ;
00382 }
00383 }
00384
00385 VL_INLINE
00386 struct x86cpu_ const* _vl_x86cpu_get()
00387 {
00388 if (!x86cpu_initialized) _vl_x86cpu_init() ;
00389 return &x86cpu ;
00390 }
00391 #endif
00392
00395 vl_bool simd_enabled = 1 ;
00396
00405 void vl_set_simd_enabled (vl_bool x)
00406 {
00407 simd_enabled = x ;
00408 }
00409
00413 vl_bool vl_get_simd_enabled ()
00414 {
00415 return simd_enabled ;
00416 }
00417
00421 vl_bool vl_cpu_has_sse3 ()
00422 {
00423 #ifdef HAS_CPUID
00424 return _vl_x86cpu_get()->has_sse3 ;
00425 #else
00426 return 0 ;
00427 #endif
00428 }
00429
00433 vl_bool vl_cpu_has_sse2 ()
00434 {
00435 #ifdef HAS_CPUID
00436 return _vl_x86cpu_get()->has_sse2 ;
00437 #else
00438 return 0 ;
00439 #endif
00440 }
00441
00446 void vl_print_host_info ()
00447 {
00448 char const *arch = 0, *endian = 0, *comp = 0, *dm = 0 ;
00449 int compver ;
00450 #ifdef VL_ARCH_IA6
00451 arch = "IA64" ;
00452 #endif
00453 #ifdef VL_ARCH_IX86
00454 arch = "IX86" ;
00455 #endif
00456 #ifdef VL_ARCH_PPC
00457 arch = "PPC" ;
00458 #endif
00459
00460 #ifdef VL_ARCH_BIN_ENDIAN
00461 endian = "big endian" ;
00462 #endif
00463 #ifdef VL_ARCH_LITTLE_ENDIAN
00464 endian = "little endian" ;
00465 #endif
00466
00467 #ifdef VL_COMPILER_MSC
00468 comp = "Microsoft Visual C++" ;
00469 compver = VL_COMPILER_MSC ;
00470 #endif
00471 #ifdef VL_COMPILER_GNUC
00472 comp = "GNU C" ;
00473 compver = VL_COMPILER_GNUC ;
00474 #endif
00475
00476 #ifdef VL_COMPILER_LP64
00477 dm = "LP64" ;
00478 #endif
00479 #ifdef VL_COMPILER_LLP64
00480 dm = "LP64" ;
00481 #endif
00482 #ifdef VL_COMPILER_ILP32
00483 dm = "ILP32" ;
00484 #endif
00485
00486 #define YESNO(x) ((x)?"yes":"no")
00487
00488 VL_PRINTF("Host: Compiler: %s %d\n", comp, compver) ;
00489 VL_PRINTF(" Compiler data model: %s\n", dm) ;
00490 VL_PRINTF(" CPU architecture: %s\n", arch) ;
00491 VL_PRINTF(" CPU endianness: %s\n", endian) ;
00492
00493 #ifdef HAS_CPUID
00494 {
00495 struct x86cpu_ const* c = _vl_x86cpu_get() ;
00496 VL_PRINTF(" CPU vendor string: %s\n", c->vendor_string) ;
00497 VL_PRINTF(" CPU has MMX: %s\n", YESNO(c->has_mmx)) ;
00498 VL_PRINTF(" CPU has SSE: %s\n", YESNO(c->has_sse)) ;
00499 VL_PRINTF(" CPU has SSE2: %s\n", YESNO(c->has_sse2)) ;
00500 VL_PRINTF(" CPU has SSE3: %s\n", YESNO(c->has_sse3)) ;
00501 VL_PRINTF(" CPU has SSE4.1: %s\n", YESNO(c->has_sse41)) ;
00502 VL_PRINTF(" CPU has SSE4.2: %s\n", YESNO(c->has_sse42)) ;
00503 VL_PRINTF("VLFeat uses SIMD: %s\n", YESNO(vl_get_simd_enabled())) ;
00504 }
00505 #endif
00506 }
00507
00508
00509