diff --git a/source/lib/sysdep/arch/x86_x64/x86_x64.cpp b/source/lib/sysdep/arch/x86_x64/x86_x64.cpp index 5cca3d0ac9..aa13e8ee4f 100644 --- a/source/lib/sysdep/arch/x86_x64/x86_x64.cpp +++ b/source/lib/sysdep/arch/x86_x64/x86_x64.cpp @@ -49,18 +49,17 @@ namespace x86_x64 { #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729 // VC10+ and VC9 SP1: __cpuidex is already available #elif GCC_VERSION -// Adapted from GPLv2 version of GCC's cpuid.h -# if ARCH_IA32 && defined(__PIC__) -// %ebx may be the PIC register +# if defined(__i386__) && defined(__PIC__) # define __cpuidex(regsArray, level, index)\ - __asm__ ("xchgl\t%%ebx, %1\n\t"\ - "cpuid\n\t"\ - "xchgl\t%%ebx, %1\n\t"\ + __asm__ __volatile__ ("pushl %%ebx\n"\ + "cpuid\n"\ + "mov %%ebx,%1\n"\ + "popl %%ebx"\ : "=a" ((regsArray)[0]), "=r" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\ : "0" (level), "2" (index)); # else # define __cpuidex(regsArray, level, index)\ - __asm__ ("cpuid\n\t"\ + __asm__ __volatile__ ("cpuid"\ : "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\ : "0" (level), "2" (index)); # endif