From: Craig Topper Date: Thu, 27 Jul 2017 03:26:52 +0000 (+0000) Subject: [X86] Improve the unknown stepping support for Intel CPUs in getHostCPUName X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e5b5e82eb6e232579f0c1e42f005e6b0ace1e16;p=llvm [X86] Improve the unknown stepping support for Intel CPUs in getHostCPUName This patch improves our guessing of unknown Intel CPUs to support Goldmont and skylake-avx512. Differential Revision: https://reviews.llvm.org/D35161 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309246 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp index 5cf0316d4d7..ac2af7ba567 100644 --- a/lib/Support/Host.cpp +++ b/lib/Support/Host.cpp @@ -380,7 +380,9 @@ enum ProcessorFeatures { // Only one bit free left in the first 32 features. FEATURE_MOVBE = 32, FEATURE_ADX, - FEATURE_EM64T + FEATURE_EM64T, + FEATURE_CLFLUSHOPT, + FEATURE_SHA, }; // The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max). @@ -714,7 +716,21 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, default: // Unknown family 6 CPU, try to guess. if (Features & (1 << FEATURE_AVX512F)) { - *Type = INTEL_KNL; // knl + if (Features & (1 << FEATURE_AVX512VL)) { + *Type = INTEL_COREI7; + *Subtype = INTEL_COREI7_SKYLAKE_AVX512; + } else { + *Type = INTEL_KNL; // knl + } + break; + } + if (Features2 & (1 << (FEATURE_CLFLUSHOPT - 32))) { + if (Features2 & (1 << (FEATURE_SHA - 32))) { + *Type = INTEL_GOLDMONT; + } else { + *Type = INTEL_COREI7; + *Subtype = INTEL_COREI7_SKYLAKE; + } break; } if (Features2 & (1 << (FEATURE_ADX - 32))) { @@ -974,12 +990,16 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf, Features2 |= 1 << (FEATURE_ADX - 32); if (HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save) Features |= 1 << FEATURE_AVX512IFMA; + if (HasLeaf7 && ((EBX >> 23) & 1)) + Features2 |= 1 << (FEATURE_CLFLUSHOPT - 32); if (HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save) Features |= 1 << FEATURE_AVX512PF; if (HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save) Features |= 1 << FEATURE_AVX512ER; if (HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save) Features |= 1 << FEATURE_AVX512CD; + if (HasLeaf7 && ((EBX >> 29) & 1)) + Features2 |= 1 << (FEATURE_SHA - 32); if (HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save) Features |= 1 << FEATURE_AVX512BW; if (HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save)