1
0
forked from 0ad/0ad

Fixes cpuid to work with i386 CPUs and PIE/PIC, based on old GCC cpuid.h source and patch by pstumpf, fixes #2675

This was SVN commit r15886.
This commit is contained in:
historic_bruno 2014-10-18 03:07:24 +00:00
parent 1631b8de14
commit 03eaf9b461

View File

@ -49,10 +49,21 @@ namespace x86_x64 {
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729
// VC10+ and VC9 SP1: __cpuidex is already available
#elif GCC_VERSION
# define __cpuidex(regsArray, level, index)\
__asm__ __volatile__ ("cpuid"\
: "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
: "0" (level), "2" (index));
// Adapted from GPLv2 version of GCC's cpuid.h
# if ARCH_IA32 && defined(__PIC__)
// %ebx may be the PIC register
# define __cpuidex(regsArray, level, index)\
__asm__ ("xchgl\t%%ebx, %1\n\t"\
"cpuid\n\t"\
"xchgl\t%%ebx, %1\n\t"\
: "=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"\
: "=a" ((regsArray)[0]), "=b" ((regsArray)[1]), "=c" ((regsArray)[2]), "=d" ((regsArray)[3])\
: "0" (level), "2" (index));
# endif
#else
# error "compiler not supported"
#endif