Index: base/cpu.cc |
diff --git a/base/cpu.cc b/base/cpu.cc |
index ef3309dad180b4150dd39a54cd5300f6ad155fa7..edba2c21988e9a92412aecb2e9cb194de6eac25a 100644 |
--- a/base/cpu.cc |
+++ b/base/cpu.cc |
@@ -44,6 +44,7 @@ CPU::CPU() |
has_sse42_(false), |
has_avx_(false), |
has_avx_hardware_(false), |
+ has_avx2_(false), |
has_aesni_(false), |
has_non_stop_time_stamp_counter_(false), |
has_broken_neon_(false), |
@@ -72,7 +73,7 @@ void __cpuid(int cpu_info[4], int info_type) { |
void __cpuid(int cpu_info[4], int info_type) { |
__asm__ volatile ( |
- "cpuid \n\t" |
+ "cpuid\n" |
: "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) |
: "a"(info_type) |
); |
@@ -85,7 +86,8 @@ void __cpuid(int cpu_info[4], int info_type) { |
uint64 _xgetbv(uint32 xcr) { |
uint32 eax, edx; |
- __asm__ volatile ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (xcr)); |
+ __asm__ volatile ( |
+ "xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr)); |
return (static_cast<uint64>(edx) << 32) | eax; |
} |
@@ -110,7 +112,7 @@ class LazyCpuInfoValue { |
revision = 0; |
const struct { |
const char key[17]; |
- unsigned *result; |
+ unsigned int* result; |
} kUnsignedValues[] = { |
{"CPU implementer", &implementer}, |
{"CPU architecture", &architecture}, |
@@ -156,7 +158,7 @@ class LazyCpuInfoValue { |
// The string may have leading "0x" or not, so we use strtoul to |
// handle that. |
- char *endptr; |
+ char* endptr; |
std::string value(value_sp.as_string()); |
unsigned long int result = strtoul(value.c_str(), &endptr, 0); |
if (*endptr == 0 && result <= UINT_MAX) { |
@@ -211,7 +213,11 @@ void CPU::Initialize() { |
// Interpret CPU feature information. |
if (num_ids > 0) { |
+ int cpu_info7[4] = {0}; |
__cpuid(cpu_info, 1); |
+ if (num_ids >= 7) { |
+ __cpuid(cpu_info7, 7); |
+ } |
signature_ = cpu_info[0]; |
stepping_ = cpu_info[0] & 0xf; |
model_ = ((cpu_info[0] >> 4) & 0xf) + ((cpu_info[0] >> 12) & 0xf0); |
@@ -244,6 +250,7 @@ void CPU::Initialize() { |
(cpu_info[2] & 0x08000000) != 0 /* OSXSAVE */ && |
(_xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */; |
has_aesni_ = (cpu_info[2] & 0x02000000) != 0; |
+ has_avx2_ = has_avx_ && (cpu_info7[1] & 0x00000020) != 0; |
} |
// Get the brand string of the cpu. |
@@ -275,6 +282,7 @@ void CPU::Initialize() { |
} |
CPU::IntelMicroArchitecture CPU::GetIntelMicroArchitecture() const { |
+ if (has_avx2()) return AVX2; |
if (has_avx()) return AVX; |
if (has_sse42()) return SSE42; |
if (has_sse41()) return SSE41; |