| Index: src/cpu.cc
|
| diff --git a/src/cpu.cc b/src/cpu.cc
|
| index 1bae0016d63aecc2b000f48d58006577d072e608..06a03115bbe8692d4d56e8298d423f8b3b647b44 100644
|
| --- a/src/cpu.cc
|
| +++ b/src/cpu.cc
|
| @@ -27,6 +27,10 @@
|
|
|
| #include "cpu.h"
|
|
|
| +#if V8_CC_MSVC
|
| +#include <intrin.h> // __cpuid()
|
| +#endif
|
| +
|
| #include <algorithm>
|
| #include <cctype>
|
| #include <cstdio>
|
| @@ -40,33 +44,30 @@ namespace internal {
|
|
|
| #if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64
|
|
|
| -#if V8_CC_MSVC
|
| -
|
| -#include <intrin.h> // NOLINT
|
| -
|
| -#elif defined(__i386__) && defined(__pic__)
|
| +// Define __cpuid() for non-MSVC compilers.
|
| +#if !V8_CC_MSVC
|
|
|
| static V8_INLINE(void __cpuid(int cpu_info[4], int info_type)) {
|
| +#if defined(__i386__) && defined(__pic__)
|
| + // Make sure to preserve ebx, which contains the pointer
|
| + // to the GOT in case we're generating PIC.
|
| __asm__ volatile (
|
| - "mov %%ebx, %%edi\n"
|
| - "cpuid\n"
|
| - "xchg %%edi, %%ebx\n"
|
| + "mov %%ebx, %%edi\n\t"
|
| + "cpuid\n\t"
|
| + "xchg %%edi, %%ebx\n\t"
|
| : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
|
| : "a"(info_type)
|
| );
|
| -}
|
| -
|
| -#else // !V8_CC_MSVC || (!defined(__i386__) && !defined(__pic__))
|
| -
|
| -static V8_INLINE(void __cpuid(int cpu_info[4], int info_type)) {
|
| +#else
|
| __asm__ volatile (
|
| "cpuid \n\t"
|
| : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
|
| : "a"(info_type)
|
| );
|
| +#endif // defined(__i386__) && defined(__pic__)
|
| }
|
|
|
| -#endif
|
| +#endif // !V8_CC_MSVC
|
|
|
| #elif V8_HOST_ARCH_ARM || V8_HOST_ARCH_MIPS
|
|
|
|
|