| Index: base/cpu.cc
|
| diff --git a/base/cpu.cc b/base/cpu.cc
|
| index 1761529e046edf2531d2d4612ca6d78c9b96289a..7ea212ef64b205d6025bc8855f784f0ba2ea4f7f 100644
|
| --- a/base/cpu.cc
|
| +++ b/base/cpu.cc
|
| @@ -33,6 +33,7 @@ CPU::CPU()
|
| has_ssse3_(false),
|
| has_sse41_(false),
|
| has_sse42_(false),
|
| + has_avx_(false),
|
| has_non_stop_time_stamp_counter_(false),
|
| cpu_vendor_("unknown") {
|
| Initialize();
|
| @@ -82,6 +83,17 @@ void __cpuidex(int cpu_info[4], int info_type, int info_index) {
|
| }
|
|
|
| #endif
|
| +
|
| +unsigned long long _xgetbv(unsigned int xcr) {
|
| + unsigned int eax, edx;
|
| + __asm__ volatile (
|
| + ".byte 0x0f, 0x01, 0xd0"
|
| + : "=a"(eax), "=d"(edx)
|
| + : "c" (xcr)
|
| + );
|
| + return static_cast<unsigned long long>(eax) ^
|
| + static_cast<unsigned long long>(edx) << 32;
|
| +}
|
| #endif // _MSC_VER
|
| #endif // ARCH_CPU_X86_FAMILY
|
|
|
| @@ -120,7 +132,7 @@ void CPU::Initialize() {
|
| has_ssse3_ = (cpu_info[2] & 0x00000200) != 0;
|
| has_sse41_ = (cpu_info[2] & 0x00080000) != 0;
|
| has_sse42_ = (cpu_info[2] & 0x00100000) != 0;
|
| - has_avx_ = (cpu_info[2] & 0x10000000) != 0;
|
| + has_avx_ = (cpu_info[2] & 0x10000000) != 0 && (_xgetbv(0) & 6) == 6;
|
| }
|
|
|
| // Get the brand string of the cpu.
|
|
|