From 9cd5f5cecad0215b7496f67575befe3e0a01ea4c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 22 Feb 2014 19:10:45 -0800 Subject: [PATCH] Fixed bug 2404 - CPU detection not working with MSVC on x64 Tiemo Jung All CPU detection functions SDL_Has* will return false, even if it is supported by the CPU, if SDL is compiled with MSVC and the target is x64. The reason for this is that 'CPU_haveCPUID' will return 0 and macro 'cpuid' in SDL_cpuinfo.c is the fallback implementation, which sets all params to zero. It is safe to assume that cpuid is supported on a CPU that runs windows x64, so CPU_haveCPUID can just return 1, and the empty macro can be replaced with a small wrap around the __cpuid intrinsic. --- src/cpuinfo/SDL_cpuinfo.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index a3bde8ccd6705..6a529ae01cc2d 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -98,7 +98,7 @@ CPU_haveCPUID(void) ); #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. :) */ + CPUid by definition. But it's nice to be able to prove it. :) */ __asm__ ( " pushfq # Get original EFLAGS \n" " popq %%rax \n" @@ -131,6 +131,8 @@ CPUid by definition. But it's nice to be able to prove it. :) */ mov has_CPUID,1 ; We have CPUID support done: } +#elif defined(_MSC_VER) && defined(_M_X64) + has_CPUID = 1; #elif defined(__sun) && defined(__i386) __asm ( " pushfl \n" @@ -191,7 +193,17 @@ CPUid by definition. But it's nice to be able to prove it. :) */ __asm mov b, ebx \ __asm mov c, ecx \ __asm mov d, edx \ - } +} +#elif defined(_MSC_VER) && defined(_M_X64) +#define cpuid(func, a, b, c, d) \ +{ \ + int CPUInfo[4]; \ + __cpuid(CPUInfo, func); \ + a = CPUInfo[0]; \ + b = CPUInfo[1]; \ + c = CPUInfo[2]; \ + d = CPUInfo[3]; \ +} #else #define cpuid(func, a, b, c, d) \ a = b = c = d = 0