1f09cf34dSArchibald Elliott //===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===// 2f09cf34dSArchibald Elliott // 3f09cf34dSArchibald Elliott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f09cf34dSArchibald Elliott // See https://llvm.org/LICENSE.txt for license information. 5f09cf34dSArchibald Elliott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f09cf34dSArchibald Elliott // 7f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===// 8f09cf34dSArchibald Elliott // 9f09cf34dSArchibald Elliott // This file implements a target parser to recognise X86 hardware features. 10f09cf34dSArchibald Elliott // 11f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===// 12f09cf34dSArchibald Elliott 13f09cf34dSArchibald Elliott #include "llvm/TargetParser/X86TargetParser.h" 144f12c0b7SCraig Topper #include "llvm/ADT/Bitset.h" 15f09cf34dSArchibald Elliott #include "llvm/ADT/StringSwitch.h" 16f09cf34dSArchibald Elliott #include <numeric> 17f09cf34dSArchibald Elliott 18f09cf34dSArchibald Elliott using namespace llvm; 19f09cf34dSArchibald Elliott using namespace llvm::X86; 20f09cf34dSArchibald Elliott 21f09cf34dSArchibald Elliott namespace { 22f09cf34dSArchibald Elliott 234f12c0b7SCraig Topper using FeatureBitset = Bitset<X86::CPU_FEATURE_MAX>; 24f09cf34dSArchibald Elliott 25f09cf34dSArchibald Elliott struct ProcInfo { 26f09cf34dSArchibald Elliott StringLiteral Name; 27f09cf34dSArchibald Elliott X86::CPUKind Kind; 28f09cf34dSArchibald Elliott unsigned KeyFeature; 29f09cf34dSArchibald Elliott FeatureBitset Features; 307717c007SFreddy Ye char Mangling; 317717c007SFreddy Ye bool OnlyForCPUDispatchSpecific; 32f09cf34dSArchibald Elliott }; 33f09cf34dSArchibald Elliott 34f09cf34dSArchibald Elliott struct FeatureInfo { 355487b67cSCraig Topper StringLiteral NameWithPlus; 36f09cf34dSArchibald Elliott FeatureBitset ImpliedFeatures; 375487b67cSCraig Topper 385487b67cSCraig Topper StringRef getName(bool WithPlus = false) const { 395487b67cSCraig Topper assert(NameWithPlus[0] == '+' && "Expected string to start with '+'"); 405487b67cSCraig Topper if (WithPlus) 415487b67cSCraig Topper return NameWithPlus; 425487b67cSCraig Topper return NameWithPlus.drop_front(); 435487b67cSCraig Topper } 44f09cf34dSArchibald Elliott }; 45f09cf34dSArchibald Elliott 46f09cf34dSArchibald Elliott } // end anonymous namespace 47f09cf34dSArchibald Elliott 48f09cf34dSArchibald Elliott #define X86_FEATURE(ENUM, STRING) \ 49f09cf34dSArchibald Elliott constexpr FeatureBitset Feature##ENUM = {X86::FEATURE_##ENUM}; 50f09cf34dSArchibald Elliott #include "llvm/TargetParser/X86TargetParser.def" 51f09cf34dSArchibald Elliott 52f09cf34dSArchibald Elliott // Pentium with MMX. 53f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPentiumMMX = 54f09cf34dSArchibald Elliott FeatureX87 | FeatureCMPXCHG8B | FeatureMMX; 55f09cf34dSArchibald Elliott 56f09cf34dSArchibald Elliott // Pentium 2 and 3. 57f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPentium2 = 58a9256a2eSFreddy Ye FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeatureFXSR | FeatureCMOV; 59f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPentium3 = FeaturesPentium2 | FeatureSSE; 60f09cf34dSArchibald Elliott 61f09cf34dSArchibald Elliott // Pentium 4 CPUs 62f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPentium4 = FeaturesPentium3 | FeatureSSE2; 63f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPrescott = FeaturesPentium4 | FeatureSSE3; 64f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesNocona = 65f09cf34dSArchibald Elliott FeaturesPrescott | Feature64BIT | FeatureCMPXCHG16B; 66f09cf34dSArchibald Elliott 67f09cf34dSArchibald Elliott // Basic 64-bit capable CPU. 68f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesX86_64 = FeaturesPentium4 | Feature64BIT; 69f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesX86_64_V2 = FeaturesX86_64 | FeatureSAHF | 70f09cf34dSArchibald Elliott FeaturePOPCNT | FeatureCRC32 | 71f09cf34dSArchibald Elliott FeatureSSE4_2 | FeatureCMPXCHG16B; 72f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesX86_64_V3 = 73f09cf34dSArchibald Elliott FeaturesX86_64_V2 | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureF16C | 74f09cf34dSArchibald Elliott FeatureFMA | FeatureLZCNT | FeatureMOVBE | FeatureXSAVE; 7524194090SPhoebe Wang constexpr FeatureBitset FeaturesX86_64_V4 = FeaturesX86_64_V3 | FeatureEVEX512 | 76f09cf34dSArchibald Elliott FeatureAVX512BW | FeatureAVX512CD | 77f09cf34dSArchibald Elliott FeatureAVX512DQ | FeatureAVX512VL; 78f09cf34dSArchibald Elliott 79f09cf34dSArchibald Elliott // Intel Core CPUs 80f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesCore2 = 81f09cf34dSArchibald Elliott FeaturesNocona | FeatureSAHF | FeatureSSSE3; 82f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesPenryn = FeaturesCore2 | FeatureSSE4_1; 83f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesNehalem = 84f09cf34dSArchibald Elliott FeaturesPenryn | FeaturePOPCNT | FeatureCRC32 | FeatureSSE4_2; 85f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesWestmere = FeaturesNehalem | FeaturePCLMUL; 86f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSandyBridge = 87f09cf34dSArchibald Elliott FeaturesWestmere | FeatureAVX | FeatureXSAVE | FeatureXSAVEOPT; 88f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesIvyBridge = 89f09cf34dSArchibald Elliott FeaturesSandyBridge | FeatureF16C | FeatureFSGSBASE | FeatureRDRND; 90f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesHaswell = 91f09cf34dSArchibald Elliott FeaturesIvyBridge | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureFMA | 92f09cf34dSArchibald Elliott FeatureINVPCID | FeatureLZCNT | FeatureMOVBE; 93f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBroadwell = 94f09cf34dSArchibald Elliott FeaturesHaswell | FeatureADX | FeaturePRFCHW | FeatureRDSEED; 95f09cf34dSArchibald Elliott 96f09cf34dSArchibald Elliott // Intel Knights Landing and Knights Mill 97f09cf34dSArchibald Elliott // Knights Landing has feature parity with Broadwell. 984def1ce1SFreddy Ye constexpr FeatureBitset FeaturesKNL = FeaturesBroadwell | FeatureAES | 994def1ce1SFreddy Ye FeatureAVX512F | FeatureEVEX512 | 1004def1ce1SFreddy Ye FeatureAVX512CD; 101f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesKNM = FeaturesKNL | FeatureAVX512VPOPCNTDQ; 102f09cf34dSArchibald Elliott 103f09cf34dSArchibald Elliott // Intel Skylake processors. 104f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSkylakeClient = 105f09cf34dSArchibald Elliott FeaturesBroadwell | FeatureAES | FeatureCLFLUSHOPT | FeatureXSAVEC | 106f09cf34dSArchibald Elliott FeatureXSAVES | FeatureSGX; 107f09cf34dSArchibald Elliott // SkylakeServer inherits all SkylakeClient features except SGX. 108f09cf34dSArchibald Elliott // FIXME: That doesn't match gcc. 109f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSkylakeServer = 11024194090SPhoebe Wang (FeaturesSkylakeClient & ~FeatureSGX) | FeatureAVX512F | FeatureEVEX512 | 11124194090SPhoebe Wang FeatureAVX512CD | FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | 11224194090SPhoebe Wang FeatureCLWB | FeaturePKU; 113f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesCascadeLake = 114f09cf34dSArchibald Elliott FeaturesSkylakeServer | FeatureAVX512VNNI; 115f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesCooperLake = 116f09cf34dSArchibald Elliott FeaturesCascadeLake | FeatureAVX512BF16; 117f09cf34dSArchibald Elliott 118f09cf34dSArchibald Elliott // Intel 10nm processors. 119f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesCannonlake = 12024194090SPhoebe Wang FeaturesSkylakeClient | FeatureAVX512F | FeatureEVEX512 | FeatureAVX512CD | 12124194090SPhoebe Wang FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA | 12224194090SPhoebe Wang FeatureAVX512VBMI | FeaturePKU | FeatureSHA; 123f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesICLClient = 124f09cf34dSArchibald Elliott FeaturesCannonlake | FeatureAVX512BITALG | FeatureAVX512VBMI2 | 125f09cf34dSArchibald Elliott FeatureAVX512VNNI | FeatureAVX512VPOPCNTDQ | FeatureGFNI | FeatureRDPID | 126f09cf34dSArchibald Elliott FeatureVAES | FeatureVPCLMULQDQ; 127f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesRocketlake = FeaturesICLClient & ~FeatureSGX; 128f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesICLServer = 129f09cf34dSArchibald Elliott FeaturesICLClient | FeatureCLWB | FeaturePCONFIG | FeatureWBNOINVD; 130f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesTigerlake = 131f09cf34dSArchibald Elliott FeaturesICLClient | FeatureAVX512VP2INTERSECT | FeatureMOVDIR64B | 132f09cf34dSArchibald Elliott FeatureCLWB | FeatureMOVDIRI | FeatureSHSTK | FeatureKL | FeatureWIDEKL; 133f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSapphireRapids = 134f09cf34dSArchibald Elliott FeaturesICLServer | FeatureAMX_BF16 | FeatureAMX_INT8 | FeatureAMX_TILE | 135f09cf34dSArchibald Elliott FeatureAVX512BF16 | FeatureAVX512FP16 | FeatureAVXVNNI | FeatureCLDEMOTE | 136f09cf34dSArchibald Elliott FeatureENQCMD | FeatureMOVDIR64B | FeatureMOVDIRI | FeaturePTWRITE | 137f09cf34dSArchibald Elliott FeatureSERIALIZE | FeatureSHSTK | FeatureTSXLDTRK | FeatureUINTR | 138f09cf34dSArchibald Elliott FeatureWAITPKG; 139f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesGraniteRapids = 1406d23a3faSFreddy Ye FeaturesSapphireRapids | FeatureAMX_FP16 | FeaturePREFETCHI; 14197836bedSFreddy Ye constexpr FeatureBitset FeaturesDiamondRapids = 14297836bedSFreddy Ye FeaturesGraniteRapids | FeatureAMX_COMPLEX | FeatureAVX10_2_512 | 14397836bedSFreddy Ye FeatureCMPCCXADD | FeatureAVXIFMA | FeatureAVXNECONVERT | 14497836bedSFreddy Ye FeatureAVXVNNIINT8 | FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 | 14597836bedSFreddy Ye FeatureSM4 | FeatureEGPR | FeatureZU | FeatureCCMP | FeaturePush2Pop2 | 14697836bedSFreddy Ye FeaturePPX | FeatureNDD | FeatureNF | FeatureCF | FeatureMOVRS | 14797836bedSFreddy Ye FeatureAMX_MOVRS | FeatureAMX_AVX512 | FeatureAMX_FP8 | FeatureAMX_TF32 | 148*90968794SPhoebe Wang FeatureAMX_TRANSPOSE | FeatureUSERMSR; 149f09cf34dSArchibald Elliott 150f09cf34dSArchibald Elliott // Intel Atom processors. 151f09cf34dSArchibald Elliott // Bonnell has feature parity with Core2 and adds MOVBE. 152f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBonnell = FeaturesCore2 | FeatureMOVBE; 153f09cf34dSArchibald Elliott // Silvermont has parity with Westmere and Bonnell plus PRFCHW and RDRND. 154f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSilvermont = 155f09cf34dSArchibald Elliott FeaturesBonnell | FeaturesWestmere | FeaturePRFCHW | FeatureRDRND; 156f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesGoldmont = 157f09cf34dSArchibald Elliott FeaturesSilvermont | FeatureAES | FeatureCLFLUSHOPT | FeatureFSGSBASE | 158f09cf34dSArchibald Elliott FeatureRDSEED | FeatureSHA | FeatureXSAVE | FeatureXSAVEC | 159f09cf34dSArchibald Elliott FeatureXSAVEOPT | FeatureXSAVES; 160f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesGoldmontPlus = 161f09cf34dSArchibald Elliott FeaturesGoldmont | FeaturePTWRITE | FeatureRDPID | FeatureSGX; 162f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesTremont = 163f09cf34dSArchibald Elliott FeaturesGoldmontPlus | FeatureCLWB | FeatureGFNI; 164f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesAlderlake = 165f09cf34dSArchibald Elliott FeaturesTremont | FeatureADX | FeatureBMI | FeatureBMI2 | FeatureF16C | 166f09cf34dSArchibald Elliott FeatureFMA | FeatureINVPCID | FeatureLZCNT | FeaturePCONFIG | FeaturePKU | 167f09cf34dSArchibald Elliott FeatureSERIALIZE | FeatureSHSTK | FeatureVAES | FeatureVPCLMULQDQ | 168f09cf34dSArchibald Elliott FeatureCLDEMOTE | FeatureMOVDIR64B | FeatureMOVDIRI | FeatureWAITPKG | 169f09cf34dSArchibald Elliott FeatureAVXVNNI | FeatureHRESET | FeatureWIDEKL; 170f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesSierraforest = 1715cc4b105SFreddy Ye FeaturesAlderlake | FeatureCMPCCXADD | FeatureAVXIFMA | FeatureUINTR | 1725cc4b105SFreddy Ye FeatureENQCMD | FeatureAVXNECONVERT | FeatureAVXVNNIINT8; 173c9d92e66SFreddy Ye constexpr FeatureBitset FeaturesArrowlakeS = FeaturesSierraforest | 174c9d92e66SFreddy Ye FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 | FeatureSM4; 175278e533eSFreddy Ye constexpr FeatureBitset FeaturesPantherlake = 176278e533eSFreddy Ye FeaturesArrowlakeS | FeaturePREFETCHI; 177278e533eSFreddy Ye constexpr FeatureBitset FeaturesClearwaterforest = 178278e533eSFreddy Ye FeaturesArrowlakeS | FeatureUSERMSR | FeaturePREFETCHI; 179f09cf34dSArchibald Elliott 180f09cf34dSArchibald Elliott // Geode Processor. 181f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesGeode = 1823c6ea7b7SJames Y Knight FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeaturePRFCHW; 183f09cf34dSArchibald Elliott 184f09cf34dSArchibald Elliott // K6 processor. 185f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesK6 = FeatureX87 | FeatureCMPXCHG8B | FeatureMMX; 186f09cf34dSArchibald Elliott 187f09cf34dSArchibald Elliott // K7 and K8 architecture processors. 188f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesAthlon = 1893c6ea7b7SJames Y Knight FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeaturePRFCHW; 190f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesAthlonXP = 191f09cf34dSArchibald Elliott FeaturesAthlon | FeatureFXSR | FeatureSSE; 192f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesK8 = 193f09cf34dSArchibald Elliott FeaturesAthlonXP | FeatureSSE2 | Feature64BIT; 194f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesK8SSE3 = FeaturesK8 | FeatureSSE3; 195f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesAMDFAM10 = 196f09cf34dSArchibald Elliott FeaturesK8SSE3 | FeatureCMPXCHG16B | FeatureLZCNT | FeaturePOPCNT | 197f09cf34dSArchibald Elliott FeaturePRFCHW | FeatureSAHF | FeatureSSE4_A; 198f09cf34dSArchibald Elliott 199f09cf34dSArchibald Elliott // Bobcat architecture processors. 200f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBTVER1 = 201f09cf34dSArchibald Elliott FeatureX87 | FeatureCMPXCHG8B | FeatureCMPXCHG16B | Feature64BIT | 202f09cf34dSArchibald Elliott FeatureFXSR | FeatureLZCNT | FeatureMMX | FeaturePOPCNT | FeaturePRFCHW | 203f09cf34dSArchibald Elliott FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_A | 204f09cf34dSArchibald Elliott FeatureSAHF; 205f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBTVER2 = 206f09cf34dSArchibald Elliott FeaturesBTVER1 | FeatureAES | FeatureAVX | FeatureBMI | FeatureCRC32 | 207f09cf34dSArchibald Elliott FeatureF16C | FeatureMOVBE | FeaturePCLMUL | FeatureXSAVE | FeatureXSAVEOPT; 208f09cf34dSArchibald Elliott 209f09cf34dSArchibald Elliott // AMD Bulldozer architecture processors. 210f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBDVER1 = 211f09cf34dSArchibald Elliott FeatureX87 | FeatureAES | FeatureAVX | FeatureCMPXCHG8B | 212f09cf34dSArchibald Elliott FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT | FeatureFMA4 | 213f09cf34dSArchibald Elliott FeatureFXSR | FeatureLWP | FeatureLZCNT | FeatureMMX | FeaturePCLMUL | 214f09cf34dSArchibald Elliott FeaturePOPCNT | FeaturePRFCHW | FeatureSAHF | FeatureSSE | FeatureSSE2 | 215f09cf34dSArchibald Elliott FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 | FeatureSSE4_2 | FeatureSSE4_A | 216f09cf34dSArchibald Elliott FeatureXOP | FeatureXSAVE; 217f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBDVER2 = 218f09cf34dSArchibald Elliott FeaturesBDVER1 | FeatureBMI | FeatureFMA | FeatureF16C | FeatureTBM; 219f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBDVER3 = 220f09cf34dSArchibald Elliott FeaturesBDVER2 | FeatureFSGSBASE | FeatureXSAVEOPT; 221f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesBDVER4 = FeaturesBDVER3 | FeatureAVX2 | 222f09cf34dSArchibald Elliott FeatureBMI2 | FeatureMOVBE | 223f09cf34dSArchibald Elliott FeatureMWAITX | FeatureRDRND; 224f09cf34dSArchibald Elliott 225f09cf34dSArchibald Elliott // AMD Zen architecture processors. 226f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesZNVER1 = 227f09cf34dSArchibald Elliott FeatureX87 | FeatureADX | FeatureAES | FeatureAVX | FeatureAVX2 | 228f09cf34dSArchibald Elliott FeatureBMI | FeatureBMI2 | FeatureCLFLUSHOPT | FeatureCLZERO | 229f09cf34dSArchibald Elliott FeatureCMPXCHG8B | FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT | 230f09cf34dSArchibald Elliott FeatureF16C | FeatureFMA | FeatureFSGSBASE | FeatureFXSR | FeatureLZCNT | 231f09cf34dSArchibald Elliott FeatureMMX | FeatureMOVBE | FeatureMWAITX | FeaturePCLMUL | FeaturePOPCNT | 232f09cf34dSArchibald Elliott FeaturePRFCHW | FeatureRDRND | FeatureRDSEED | FeatureSAHF | FeatureSHA | 233f09cf34dSArchibald Elliott FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 | 234f09cf34dSArchibald Elliott FeatureSSE4_2 | FeatureSSE4_A | FeatureXSAVE | FeatureXSAVEC | 235f09cf34dSArchibald Elliott FeatureXSAVEOPT | FeatureXSAVES; 236f09cf34dSArchibald Elliott constexpr FeatureBitset FeaturesZNVER2 = FeaturesZNVER1 | FeatureCLWB | 237f09cf34dSArchibald Elliott FeatureRDPID | FeatureRDPRU | 238f09cf34dSArchibald Elliott FeatureWBNOINVD; 239f09cf34dSArchibald Elliott static constexpr FeatureBitset FeaturesZNVER3 = FeaturesZNVER2 | 240f09cf34dSArchibald Elliott FeatureINVPCID | FeaturePKU | 241f09cf34dSArchibald Elliott FeatureVAES | FeatureVPCLMULQDQ; 242f09cf34dSArchibald Elliott static constexpr FeatureBitset FeaturesZNVER4 = 24324194090SPhoebe Wang FeaturesZNVER3 | FeatureAVX512F | FeatureEVEX512 | FeatureAVX512CD | 24424194090SPhoebe Wang FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA | 24524194090SPhoebe Wang FeatureAVX512VBMI | FeatureAVX512VBMI2 | FeatureAVX512VNNI | 24624194090SPhoebe Wang FeatureAVX512BITALG | FeatureAVX512VPOPCNTDQ | FeatureAVX512BF16 | 24724194090SPhoebe Wang FeatureGFNI | FeatureSHSTK; 248f09cf34dSArchibald Elliott 24902e4186dSGanesh static constexpr FeatureBitset FeaturesZNVER5 = 25002e4186dSGanesh FeaturesZNVER4 | FeatureAVXVNNI | FeatureMOVDIRI | FeatureMOVDIR64B | 25102e4186dSGanesh FeatureAVX512VP2INTERSECT | FeaturePREFETCHI | FeatureAVXVNNI; 25202e4186dSGanesh 2537717c007SFreddy Ye // D151696 tranplanted Mangling and OnlyForCPUDispatchSpecific from 2547717c007SFreddy Ye // X86TargetParser.def to here. They are assigned by following ways: 2557717c007SFreddy Ye // 1. Copy the mangling from the original CPU_SPEICIFC MACROs. If no, assign 2567717c007SFreddy Ye // to '\0' by default, which means not support cpu_specific/dispatch feature. 2577717c007SFreddy Ye // 2. set OnlyForCPUDispatchSpecific as true if this cpu name was not 2587717c007SFreddy Ye // listed here before, which means it doesn't support -march, -mtune and so on. 2597717c007SFreddy Ye // FIXME: Remove OnlyForCPUDispatchSpecific after all CPUs here support both 2607717c007SFreddy Ye // cpu_dispatch/specific() feature and -march, -mtune, and so on. 2617a41af86SFangrui Song // clang-format off 262f09cf34dSArchibald Elliott constexpr ProcInfo Processors[] = { 263f09cf34dSArchibald Elliott // Empty processor. Include X87 and CMPXCHG8 for backwards compatibility. 2647717c007SFreddy Ye { {""}, CK_None, ~0U, FeatureX87 | FeatureCMPXCHG8B, '\0', false }, 2657717c007SFreddy Ye { {"generic"}, CK_None, ~0U, FeatureX87 | FeatureCMPXCHG8B | Feature64BIT, 'A', true }, 266f09cf34dSArchibald Elliott // i386-generation processors. 2677717c007SFreddy Ye { {"i386"}, CK_i386, ~0U, FeatureX87, '\0', false }, 268f09cf34dSArchibald Elliott // i486-generation processors. 2697717c007SFreddy Ye { {"i486"}, CK_i486, ~0U, FeatureX87, '\0', false }, 2707717c007SFreddy Ye { {"winchip-c6"}, CK_WinChipC6, ~0U, FeaturesPentiumMMX, '\0', false }, 2713c6ea7b7SJames Y Knight { {"winchip2"}, CK_WinChip2, ~0U, FeaturesPentiumMMX | FeaturePRFCHW, '\0', false }, 2723c6ea7b7SJames Y Knight { {"c3"}, CK_C3, ~0U, FeaturesPentiumMMX | FeaturePRFCHW, '\0', false }, 273f09cf34dSArchibald Elliott // i586-generation processors, P5 microarchitecture based. 2747717c007SFreddy Ye { {"i586"}, CK_i586, ~0U, FeatureX87 | FeatureCMPXCHG8B, '\0', false }, 2757717c007SFreddy Ye { {"pentium"}, CK_Pentium, ~0U, FeatureX87 | FeatureCMPXCHG8B, 'B', false }, 2767717c007SFreddy Ye { {"pentium-mmx"}, CK_PentiumMMX, ~0U, FeaturesPentiumMMX, '\0', false }, 2777717c007SFreddy Ye { {"pentium_mmx"}, CK_PentiumMMX, ~0U, FeaturesPentiumMMX, 'D', true }, 278f09cf34dSArchibald Elliott // i686-generation processors, P6 / Pentium M microarchitecture based. 279a10dccf2SFreddy Ye { {"pentiumpro"}, CK_PentiumPro, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, 'C', false }, 2807717c007SFreddy Ye { {"pentium_pro"}, CK_PentiumPro, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, 'C', true }, 2817717c007SFreddy Ye { {"i686"}, CK_i686, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, '\0', false }, 282a10dccf2SFreddy Ye { {"pentium2"}, CK_Pentium2, ~0U, FeaturesPentium2, 'E', false }, 2837717c007SFreddy Ye { {"pentium_ii"}, CK_Pentium2, ~0U, FeaturesPentium2, 'E', true }, 284a10dccf2SFreddy Ye { {"pentium3"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', false }, 285a10dccf2SFreddy Ye { {"pentium3m"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', false }, 2867717c007SFreddy Ye { {"pentium_iii"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', true }, 2877717c007SFreddy Ye { {"pentium_iii_no_xmm_regs"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', true }, 2887717c007SFreddy Ye { {"pentium-m"}, CK_PentiumM, ~0U, FeaturesPentium4, '\0', false }, 2897717c007SFreddy Ye { {"pentium_m"}, CK_PentiumM, ~0U, FeaturesPentium4, 'K', true }, 2907717c007SFreddy Ye { {"c3-2"}, CK_C3_2, ~0U, FeaturesPentium3, '\0', false }, 291a10dccf2SFreddy Ye { {"yonah"}, CK_Yonah, ~0U, FeaturesPrescott, 'L', false }, 292f09cf34dSArchibald Elliott // Netburst microarchitecture based processors. 293a10dccf2SFreddy Ye { {"pentium4"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', false }, 294a10dccf2SFreddy Ye { {"pentium4m"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', false }, 2957717c007SFreddy Ye { {"pentium_4"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', true }, 2967717c007SFreddy Ye { {"pentium_4_sse3"}, CK_Prescott, ~0U, FeaturesPrescott, 'L', true }, 297a10dccf2SFreddy Ye { {"prescott"}, CK_Prescott, ~0U, FeaturesPrescott, 'L', false }, 298a10dccf2SFreddy Ye { {"nocona"}, CK_Nocona, ~0U, FeaturesNocona, 'L', false }, 299f09cf34dSArchibald Elliott // Core microarchitecture based processors. 300a10dccf2SFreddy Ye { {"core2"}, CK_Core2, FEATURE_SSSE3, FeaturesCore2, 'M', false }, 3017717c007SFreddy Ye { {"core_2_duo_ssse3"}, CK_Core2, ~0U, FeaturesCore2, 'M', true }, 302a10dccf2SFreddy Ye { {"penryn"}, CK_Penryn, ~0U, FeaturesPenryn, 'N', false }, 3037717c007SFreddy Ye { {"core_2_duo_sse4_1"}, CK_Penryn, ~0U, FeaturesPenryn, 'N', true }, 304f09cf34dSArchibald Elliott // Atom processors 305a10dccf2SFreddy Ye { {"bonnell"}, CK_Bonnell, FEATURE_SSSE3, FeaturesBonnell, 'O', false }, 3067717c007SFreddy Ye { {"atom"}, CK_Bonnell, FEATURE_SSSE3, FeaturesBonnell, 'O', false }, 307a10dccf2SFreddy Ye { {"silvermont"}, CK_Silvermont, FEATURE_SSE4_2, FeaturesSilvermont, 'c', false }, 308a10dccf2SFreddy Ye { {"slm"}, CK_Silvermont, FEATURE_SSE4_2, FeaturesSilvermont, 'c', false }, 3097717c007SFreddy Ye { {"atom_sse4_2"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'c', true }, 3107717c007SFreddy Ye { {"atom_sse4_2_movbe"}, CK_Goldmont, FEATURE_SSE4_2, FeaturesGoldmont, 'd', true }, 3117717c007SFreddy Ye { {"goldmont"}, CK_Goldmont, FEATURE_SSE4_2, FeaturesGoldmont, 'i', false }, 3127717c007SFreddy Ye { {"goldmont-plus"}, CK_GoldmontPlus, FEATURE_SSE4_2, FeaturesGoldmontPlus, '\0', false }, 313a10dccf2SFreddy Ye { {"goldmont_plus"}, CK_GoldmontPlus, FEATURE_SSE4_2, FeaturesGoldmontPlus, 'd', true }, 314a10dccf2SFreddy Ye { {"tremont"}, CK_Tremont, FEATURE_SSE4_2, FeaturesTremont, 'd', false }, 315f09cf34dSArchibald Elliott // Nehalem microarchitecture based processors. 316a10dccf2SFreddy Ye { {"nehalem"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', false }, 3177717c007SFreddy Ye { {"core_i7_sse4_2"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', true }, 318a10dccf2SFreddy Ye { {"corei7"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', false }, 319f09cf34dSArchibald Elliott // Westmere microarchitecture based processors. 320a10dccf2SFreddy Ye { {"westmere"}, CK_Westmere, FEATURE_PCLMUL, FeaturesWestmere, 'Q', false }, 3217717c007SFreddy Ye { {"core_aes_pclmulqdq"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'Q', true }, 322f09cf34dSArchibald Elliott // Sandy Bridge microarchitecture based processors. 3237717c007SFreddy Ye { {"sandybridge"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, 'R', false }, 3247717c007SFreddy Ye { {"core_2nd_gen_avx"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, 'R', true }, 3257717c007SFreddy Ye { {"corei7-avx"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, '\0', false }, 326f09cf34dSArchibald Elliott // Ivy Bridge microarchitecture based processors. 3277717c007SFreddy Ye { {"ivybridge"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, 'S', false }, 3287717c007SFreddy Ye { {"core_3rd_gen_avx"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, 'S', true }, 3297717c007SFreddy Ye { {"core-avx-i"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, '\0', false }, 330f09cf34dSArchibald Elliott // Haswell microarchitecture based processors. 3317717c007SFreddy Ye { {"haswell"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'V', false }, 3327717c007SFreddy Ye { {"core-avx2"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, '\0', false }, 3337717c007SFreddy Ye { {"core_4th_gen_avx"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'V', true }, 3347717c007SFreddy Ye { {"core_4th_gen_avx_tsx"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'W', true }, 335f09cf34dSArchibald Elliott // Broadwell microarchitecture based processors. 3367717c007SFreddy Ye { {"broadwell"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'X', false }, 3377717c007SFreddy Ye { {"core_5th_gen_avx"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'X', true }, 3387717c007SFreddy Ye { {"core_5th_gen_avx_tsx"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'Y', true }, 339f09cf34dSArchibald Elliott // Skylake client microarchitecture based processors. 3407717c007SFreddy Ye { {"skylake"}, CK_SkylakeClient, FEATURE_AVX2, FeaturesSkylakeClient, 'b', false }, 341f09cf34dSArchibald Elliott // Skylake server microarchitecture based processors. 3427717c007SFreddy Ye { {"skylake-avx512"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, '\0', false }, 343a10dccf2SFreddy Ye { {"skx"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, 'a', false }, 3447717c007SFreddy Ye { {"skylake_avx512"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, 'a', true }, 345f09cf34dSArchibald Elliott // Cascadelake Server microarchitecture based processors. 346a10dccf2SFreddy Ye { {"cascadelake"}, CK_Cascadelake, FEATURE_AVX512VNNI, FeaturesCascadeLake, 'o', false }, 347f09cf34dSArchibald Elliott // Cooperlake Server microarchitecture based processors. 348a10dccf2SFreddy Ye { {"cooperlake"}, CK_Cooperlake, FEATURE_AVX512BF16, FeaturesCooperLake, 'f', false }, 349f09cf34dSArchibald Elliott // Cannonlake client microarchitecture based processors. 3507717c007SFreddy Ye { {"cannonlake"}, CK_Cannonlake, FEATURE_AVX512VBMI, FeaturesCannonlake, 'e', false }, 351f09cf34dSArchibald Elliott // Icelake client microarchitecture based processors. 3527717c007SFreddy Ye { {"icelake-client"}, CK_IcelakeClient, FEATURE_AVX512VBMI2, FeaturesICLClient, '\0', false }, 353a10dccf2SFreddy Ye { {"icelake_client"}, CK_IcelakeClient, FEATURE_AVX512VBMI2, FeaturesICLClient, 'k', true }, 354f09cf34dSArchibald Elliott // Rocketlake microarchitecture based processors. 355a10dccf2SFreddy Ye { {"rocketlake"}, CK_Rocketlake, FEATURE_AVX512VBMI2, FeaturesRocketlake, 'k', false }, 356f09cf34dSArchibald Elliott // Icelake server microarchitecture based processors. 3577717c007SFreddy Ye { {"icelake-server"}, CK_IcelakeServer, FEATURE_AVX512VBMI2, FeaturesICLServer, '\0', false }, 358a10dccf2SFreddy Ye { {"icelake_server"}, CK_IcelakeServer, FEATURE_AVX512VBMI2, FeaturesICLServer, 'k', true }, 359f09cf34dSArchibald Elliott // Tigerlake microarchitecture based processors. 360a10dccf2SFreddy Ye { {"tigerlake"}, CK_Tigerlake, FEATURE_AVX512VP2INTERSECT, FeaturesTigerlake, 'l', false }, 361f09cf34dSArchibald Elliott // Sapphire Rapids microarchitecture based processors. 362f3a4de39SFreddy Ye { {"sapphirerapids"}, CK_SapphireRapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false }, 363f09cf34dSArchibald Elliott // Alderlake microarchitecture based processors. 364a10dccf2SFreddy Ye { {"alderlake"}, CK_Alderlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false }, 365f09cf34dSArchibald Elliott // Raptorlake microarchitecture based processors. 366a10dccf2SFreddy Ye { {"raptorlake"}, CK_Raptorlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false }, 367f09cf34dSArchibald Elliott // Meteorlake microarchitecture based processors. 368a10dccf2SFreddy Ye { {"meteorlake"}, CK_Meteorlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false }, 369c9d92e66SFreddy Ye // Arrowlake microarchitecture based processors. 370c9d92e66SFreddy Ye { {"arrowlake"}, CK_Arrowlake, FEATURE_AVX2, FeaturesSierraforest, 'p', false }, 371c9d92e66SFreddy Ye { {"arrowlake-s"}, CK_ArrowlakeS, FEATURE_AVX2, FeaturesArrowlakeS, '\0', false }, 372c9d92e66SFreddy Ye { {"arrowlake_s"}, CK_ArrowlakeS, FEATURE_AVX2, FeaturesArrowlakeS, 'p', true }, 373c9d92e66SFreddy Ye // Lunarlake microarchitecture based processors. 374c9d92e66SFreddy Ye { {"lunarlake"}, CK_Lunarlake, FEATURE_AVX2, FeaturesArrowlakeS, 'p', false }, 3756acff539SFreddy Ye // Gracemont microarchitecture based processors. 3766acff539SFreddy Ye { {"gracemont"}, CK_Gracemont, FEATURE_AVX2, FeaturesAlderlake, 'p', false }, 377278e533eSFreddy Ye // Pantherlake microarchitecture based processors. 378278e533eSFreddy Ye { {"pantherlake"}, CK_Lunarlake, FEATURE_AVX2, FeaturesPantherlake, 'p', false }, 379f09cf34dSArchibald Elliott // Sierraforest microarchitecture based processors. 380a10dccf2SFreddy Ye { {"sierraforest"}, CK_Sierraforest, FEATURE_AVX2, FeaturesSierraforest, 'p', false }, 381f09cf34dSArchibald Elliott // Grandridge microarchitecture based processors. 38219e78460SFreddy Ye { {"grandridge"}, CK_Grandridge, FEATURE_AVX2, FeaturesSierraforest, 'p', false }, 38327b8f54fSFreddy Ye // Granite Rapids microarchitecture based processors. 384f3a4de39SFreddy Ye { {"graniterapids"}, CK_Graniterapids, FEATURE_AVX512FP16, FeaturesGraniteRapids, 'n', false }, 3856d23a3faSFreddy Ye // Granite Rapids D microarchitecture based processors. 386f3a4de39SFreddy Ye { {"graniterapids-d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, '\0', false }, 387f3a4de39SFreddy Ye { {"graniterapids_d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, 'n', true }, 38827b8f54fSFreddy Ye // Emerald Rapids microarchitecture based processors. 389f3a4de39SFreddy Ye { {"emeraldrapids"}, CK_Emeraldrapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false }, 390278e533eSFreddy Ye // Clearwaterforest microarchitecture based processors. 391278e533eSFreddy Ye { {"clearwaterforest"}, CK_Lunarlake, FEATURE_AVX2, FeaturesClearwaterforest, 'p', false }, 39297836bedSFreddy Ye // Diamond Rapids microarchitecture based processors. 39397836bedSFreddy Ye { {"diamondrapids"}, CK_Diamondrapids, FEATURE_AVX10_2_512, FeaturesDiamondRapids, 'z', false }, 394f09cf34dSArchibald Elliott // Knights Landing processor. 3957717c007SFreddy Ye { {"knl"}, CK_KNL, FEATURE_AVX512F, FeaturesKNL, 'Z', false }, 3967717c007SFreddy Ye { {"mic_avx512"}, CK_KNL, FEATURE_AVX512F, FeaturesKNL, 'Z', true }, 397f09cf34dSArchibald Elliott // Knights Mill processor. 3987717c007SFreddy Ye { {"knm"}, CK_KNM, FEATURE_AVX5124FMAPS, FeaturesKNM, 'j', false }, 399f09cf34dSArchibald Elliott // Lakemont microarchitecture based processors. 4007717c007SFreddy Ye { {"lakemont"}, CK_Lakemont, ~0U, FeatureCMPXCHG8B, '\0', false }, 401f09cf34dSArchibald Elliott // K6 architecture processors. 4027717c007SFreddy Ye { {"k6"}, CK_K6, ~0U, FeaturesK6, '\0', false }, 4033c6ea7b7SJames Y Knight { {"k6-2"}, CK_K6_2, ~0U, FeaturesK6 | FeaturePRFCHW, '\0', false }, 4043c6ea7b7SJames Y Knight { {"k6-3"}, CK_K6_3, ~0U, FeaturesK6 | FeaturePRFCHW, '\0', false }, 405f09cf34dSArchibald Elliott // K7 architecture processors. 4067717c007SFreddy Ye { {"athlon"}, CK_Athlon, ~0U, FeaturesAthlon, '\0', false }, 4077717c007SFreddy Ye { {"athlon-tbird"}, CK_Athlon, ~0U, FeaturesAthlon, '\0', false }, 4087717c007SFreddy Ye { {"athlon-xp"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false }, 4097717c007SFreddy Ye { {"athlon-mp"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false }, 4107717c007SFreddy Ye { {"athlon-4"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false }, 411f09cf34dSArchibald Elliott // K8 architecture processors. 4127717c007SFreddy Ye { {"k8"}, CK_K8, ~0U, FeaturesK8, '\0', false }, 4137717c007SFreddy Ye { {"athlon64"}, CK_K8, ~0U, FeaturesK8, '\0', false }, 4147717c007SFreddy Ye { {"athlon-fx"}, CK_K8, ~0U, FeaturesK8, '\0', false }, 4157717c007SFreddy Ye { {"opteron"}, CK_K8, ~0U, FeaturesK8, '\0', false }, 4167717c007SFreddy Ye { {"k8-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false }, 4177717c007SFreddy Ye { {"athlon64-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false }, 4187717c007SFreddy Ye { {"opteron-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false }, 4197717c007SFreddy Ye { {"amdfam10"}, CK_AMDFAM10, FEATURE_SSE4_A, FeaturesAMDFAM10, '\0', false }, 4207717c007SFreddy Ye { {"barcelona"}, CK_AMDFAM10, FEATURE_SSE4_A, FeaturesAMDFAM10, '\0', false }, 421f09cf34dSArchibald Elliott // Bobcat architecture processors. 4227717c007SFreddy Ye { {"btver1"}, CK_BTVER1, FEATURE_SSE4_A, FeaturesBTVER1, '\0', false }, 4237717c007SFreddy Ye { {"btver2"}, CK_BTVER2, FEATURE_BMI, FeaturesBTVER2, '\0', false }, 424f09cf34dSArchibald Elliott // Bulldozer architecture processors. 4257717c007SFreddy Ye { {"bdver1"}, CK_BDVER1, FEATURE_XOP, FeaturesBDVER1, '\0', false }, 4267717c007SFreddy Ye { {"bdver2"}, CK_BDVER2, FEATURE_FMA, FeaturesBDVER2, '\0', false }, 4277717c007SFreddy Ye { {"bdver3"}, CK_BDVER3, FEATURE_FMA, FeaturesBDVER3, '\0', false }, 4287717c007SFreddy Ye { {"bdver4"}, CK_BDVER4, FEATURE_AVX2, FeaturesBDVER4, '\0', false }, 429f09cf34dSArchibald Elliott // Zen architecture processors. 4307717c007SFreddy Ye { {"znver1"}, CK_ZNVER1, FEATURE_AVX2, FeaturesZNVER1, '\0', false }, 4317717c007SFreddy Ye { {"znver2"}, CK_ZNVER2, FEATURE_AVX2, FeaturesZNVER2, '\0', false }, 4327717c007SFreddy Ye { {"znver3"}, CK_ZNVER3, FEATURE_AVX2, FeaturesZNVER3, '\0', false }, 4337717c007SFreddy Ye { {"znver4"}, CK_ZNVER4, FEATURE_AVX512VBMI2, FeaturesZNVER4, '\0', false }, 43402e4186dSGanesh { {"znver5"}, CK_ZNVER5, FEATURE_AVX512VP2INTERSECT, FeaturesZNVER5, '\0', false }, 435f09cf34dSArchibald Elliott // Generic 64-bit processor. 4367a41af86SFangrui Song { {"x86-64"}, CK_x86_64, FEATURE_SSE2 , FeaturesX86_64, '\0', false }, 4377a41af86SFangrui Song { {"x86-64-v2"}, CK_x86_64_v2, FEATURE_SSE4_2 , FeaturesX86_64_V2, '\0', false }, 4387a41af86SFangrui Song { {"x86-64-v3"}, CK_x86_64_v3, FEATURE_AVX2, FeaturesX86_64_V3, '\0', false }, 4397a41af86SFangrui Song { {"x86-64-v4"}, CK_x86_64_v4, FEATURE_AVX512VL, FeaturesX86_64_V4, '\0', false }, 440f09cf34dSArchibald Elliott // Geode processors. 4417717c007SFreddy Ye { {"geode"}, CK_Geode, ~0U, FeaturesGeode, '\0', false }, 442f09cf34dSArchibald Elliott }; 4437a41af86SFangrui Song // clang-format on 444f09cf34dSArchibald Elliott 445f09cf34dSArchibald Elliott constexpr const char *NoTuneList[] = {"x86-64-v2", "x86-64-v3", "x86-64-v4"}; 446f09cf34dSArchibald Elliott 447f09cf34dSArchibald Elliott X86::CPUKind llvm::X86::parseArchX86(StringRef CPU, bool Only64Bit) { 448f09cf34dSArchibald Elliott for (const auto &P : Processors) 4497717c007SFreddy Ye if (!P.OnlyForCPUDispatchSpecific && P.Name == CPU && 4507717c007SFreddy Ye (P.Features[FEATURE_64BIT] || !Only64Bit)) 451f09cf34dSArchibald Elliott return P.Kind; 452f09cf34dSArchibald Elliott 453f09cf34dSArchibald Elliott return CK_None; 454f09cf34dSArchibald Elliott } 455f09cf34dSArchibald Elliott 456f09cf34dSArchibald Elliott X86::CPUKind llvm::X86::parseTuneCPU(StringRef CPU, bool Only64Bit) { 457f09cf34dSArchibald Elliott if (llvm::is_contained(NoTuneList, CPU)) 458f09cf34dSArchibald Elliott return CK_None; 459f09cf34dSArchibald Elliott return parseArchX86(CPU, Only64Bit); 460f09cf34dSArchibald Elliott } 461f09cf34dSArchibald Elliott 462f09cf34dSArchibald Elliott void llvm::X86::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, 463f09cf34dSArchibald Elliott bool Only64Bit) { 464f09cf34dSArchibald Elliott for (const auto &P : Processors) 4657717c007SFreddy Ye if (!P.OnlyForCPUDispatchSpecific && !P.Name.empty() && 4667717c007SFreddy Ye (P.Features[FEATURE_64BIT] || !Only64Bit)) 467f09cf34dSArchibald Elliott Values.emplace_back(P.Name); 468f09cf34dSArchibald Elliott } 469f09cf34dSArchibald Elliott 470f09cf34dSArchibald Elliott void llvm::X86::fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values, 471f09cf34dSArchibald Elliott bool Only64Bit) { 472f09cf34dSArchibald Elliott for (const ProcInfo &P : Processors) 4737717c007SFreddy Ye if (!P.OnlyForCPUDispatchSpecific && !P.Name.empty() && 4747717c007SFreddy Ye (P.Features[FEATURE_64BIT] || !Only64Bit) && 475f09cf34dSArchibald Elliott !llvm::is_contained(NoTuneList, P.Name)) 476f09cf34dSArchibald Elliott Values.emplace_back(P.Name); 477f09cf34dSArchibald Elliott } 478f09cf34dSArchibald Elliott 479f09cf34dSArchibald Elliott ProcessorFeatures llvm::X86::getKeyFeature(X86::CPUKind Kind) { 480f09cf34dSArchibald Elliott // FIXME: Can we avoid a linear search here? The table might be sorted by 481f09cf34dSArchibald Elliott // CPUKind so we could binary search? 482f09cf34dSArchibald Elliott for (const auto &P : Processors) { 483f09cf34dSArchibald Elliott if (P.Kind == Kind) { 484f09cf34dSArchibald Elliott assert(P.KeyFeature != ~0U && "Processor does not have a key feature."); 485f09cf34dSArchibald Elliott return static_cast<ProcessorFeatures>(P.KeyFeature); 486f09cf34dSArchibald Elliott } 487f09cf34dSArchibald Elliott } 488f09cf34dSArchibald Elliott 489f09cf34dSArchibald Elliott llvm_unreachable("Unable to find CPU kind!"); 490f09cf34dSArchibald Elliott } 491f09cf34dSArchibald Elliott 492f09cf34dSArchibald Elliott // Features with no dependencies. 493f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeatures64BIT = {}; 494f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesADX = {}; 495f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesBMI = {}; 496f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesBMI2 = {}; 497f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCLDEMOTE = {}; 498f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCLFLUSHOPT = {}; 499f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCLWB = {}; 500f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCLZERO = {}; 501f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCMOV = {}; 502f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCMPXCHG16B = {}; 503f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCMPXCHG8B = {}; 504f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCRC32 = {}; 505f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesENQCMD = {}; 506f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesFSGSBASE = {}; 507f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesFXSR = {}; 508f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesINVPCID = {}; 509f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesLWP = {}; 510f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesLZCNT = {}; 5113c6ea7b7SJames Y Knight constexpr FeatureBitset ImpliedFeaturesMMX = {}; 512f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesMWAITX = {}; 513f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesMOVBE = {}; 514f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesMOVDIR64B = {}; 515f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesMOVDIRI = {}; 516f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPCONFIG = {}; 517f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPOPCNT = {}; 518f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPKU = {}; 519f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPRFCHW = {}; 520f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPTWRITE = {}; 521f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRDPID = {}; 522f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRDPRU = {}; 523f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRDRND = {}; 524f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRDSEED = {}; 525f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRTM = {}; 526f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSAHF = {}; 527f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSERIALIZE = {}; 528f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSGX = {}; 529f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSHSTK = {}; 530f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesTBM = {}; 531f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesTSXLDTRK = {}; 532f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesUINTR = {}; 533819ac45dSFreddy Ye constexpr FeatureBitset ImpliedFeaturesUSERMSR = {}; 534f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesWAITPKG = {}; 535f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesWBNOINVD = {}; 536f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesVZEROUPPER = {}; 537f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesX87 = {}; 538f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesXSAVE = {}; 5393c6ea7b7SJames Y Knight constexpr FeatureBitset ImpliedFeaturesDUMMYFEATURE1 = {}; 5403c6ea7b7SJames Y Knight constexpr FeatureBitset ImpliedFeaturesDUMMYFEATURE2 = {}; 541f09cf34dSArchibald Elliott 542f09cf34dSArchibald Elliott // Not really CPU features, but need to be in the table because clang uses 543f09cf34dSArchibald Elliott // target features to communicate them to the backend. 544f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRETPOLINE_EXTERNAL_THUNK = {}; 545f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_BRANCHES = {}; 546f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_CALLS = {}; 547f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesLVI_CFI = {}; 548f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesLVI_LOAD_HARDENING = {}; 549f09cf34dSArchibald Elliott 550f09cf34dSArchibald Elliott // XSAVE features are dependent on basic XSAVE. 551f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesXSAVEC = FeatureXSAVE; 552f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesXSAVEOPT = FeatureXSAVE; 553f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesXSAVES = FeatureXSAVE; 554f09cf34dSArchibald Elliott 555f09cf34dSArchibald Elliott // SSE/AVX/AVX512F chain. 556f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE = {}; 557f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE2 = FeatureSSE; 558f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE3 = FeatureSSE2; 559f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSSE3 = FeatureSSE3; 560f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE4_1 = FeatureSSSE3; 561f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE4_2 = FeatureSSE4_1; 562f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX = FeatureSSE4_2; 563f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX2 = FeatureAVX; 56424194090SPhoebe Wang constexpr FeatureBitset ImpliedFeaturesEVEX512 = {}; 565f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512F = 566f09cf34dSArchibald Elliott FeatureAVX2 | FeatureF16C | FeatureFMA; 567f09cf34dSArchibald Elliott 568f09cf34dSArchibald Elliott // Vector extensions that build on SSE or AVX. 569f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAES = FeatureSSE2; 570f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesF16C = FeatureAVX; 571f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesFMA = FeatureAVX; 572f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesGFNI = FeatureSSE2; 573f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPCLMUL = FeatureSSE2; 574f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSHA = FeatureSSE2; 575dc7c0181SFreddy Ye constexpr FeatureBitset ImpliedFeaturesVAES = FeatureAES | FeatureAVX2; 576f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesVPCLMULQDQ = FeatureAVX | FeaturePCLMUL; 577c6f66de2SFreddy Ye constexpr FeatureBitset ImpliedFeaturesSM3 = FeatureAVX; 578dc7c0181SFreddy Ye constexpr FeatureBitset ImpliedFeaturesSM4 = FeatureAVX2; 579f09cf34dSArchibald Elliott 580f09cf34dSArchibald Elliott // AVX512 features. 581f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512CD = FeatureAVX512F; 582f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512BW = FeatureAVX512F; 583f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512DQ = FeatureAVX512F; 584f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VL = FeatureAVX512F; 585f09cf34dSArchibald Elliott 586f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512BF16 = FeatureAVX512BW; 587f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512BITALG = FeatureAVX512BW; 588f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512IFMA = FeatureAVX512F; 589f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VNNI = FeatureAVX512F; 590f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VPOPCNTDQ = FeatureAVX512F; 591f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VBMI = FeatureAVX512BW; 592f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VBMI2 = FeatureAVX512BW; 593f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512VP2INTERSECT = FeatureAVX512F; 594f09cf34dSArchibald Elliott 595f09cf34dSArchibald Elliott // FIXME: These two aren't really implemented and just exist in the feature 596f09cf34dSArchibald Elliott // list for __builtin_cpu_supports. So omit their dependencies. 597f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX5124FMAPS = {}; 598f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX5124VNNIW = {}; 599f09cf34dSArchibald Elliott 600f09cf34dSArchibald Elliott // SSE4_A->FMA4->XOP chain. 601f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesSSE4_A = FeatureSSE3; 602f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesFMA4 = FeatureAVX | FeatureSSE4_A; 603f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesXOP = FeatureFMA4; 604f09cf34dSArchibald Elliott 605f09cf34dSArchibald Elliott // AMX Features 606f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAMX_TILE = {}; 607f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAMX_BF16 = FeatureAMX_TILE; 608f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAMX_FP16 = FeatureAMX_TILE; 609f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAMX_INT8 = FeatureAMX_TILE; 610038b7e6bSXiang1 Zhang constexpr FeatureBitset ImpliedFeaturesAMX_COMPLEX = FeatureAMX_TILE; 61181271624SFeng Zou constexpr FeatureBitset ImpliedFeaturesAMX_FP8 = FeatureAMX_TILE; 612c72a751dSPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAMX_TRANSPOSE = FeatureAMX_TILE; 613f77101eaSMalay Sanghi constexpr FeatureBitset ImpliedFeaturesAMX_MOVRS = FeatureAMX_TILE; 6148f440137SPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAMX_AVX512 = 6158f440137SPhoebe Wang FeatureAMX_TILE | FeatureAVX10_2_512; 616eddb79d5SFeng Zou constexpr FeatureBitset ImpliedFeaturesAMX_TF32 = FeatureAMX_TILE; 617f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesHRESET = {}; 618f09cf34dSArchibald Elliott 619f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesPREFETCHI = {}; 620f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesCMPCCXADD = {}; 621f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesRAOINT = {}; 6221c154bd7SFreddy Ye constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT16 = FeatureAVX2; 623f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT8 = FeatureAVX2; 624f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVXIFMA = FeatureAVX2; 625f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVXNECONVERT = FeatureAVX2; 626dc7c0181SFreddy Ye constexpr FeatureBitset ImpliedFeaturesSHA512 = FeatureAVX2; 627f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVX512FP16 = 628f09cf34dSArchibald Elliott FeatureAVX512BW | FeatureAVX512DQ | FeatureAVX512VL; 629f09cf34dSArchibald Elliott // Key Locker Features 630f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesKL = FeatureSSE2; 631f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesWIDEKL = FeatureKL; 632f09cf34dSArchibald Elliott 633f09cf34dSArchibald Elliott // AVXVNNI Features 634f09cf34dSArchibald Elliott constexpr FeatureBitset ImpliedFeaturesAVXVNNI = FeatureAVX2; 635f09cf34dSArchibald Elliott 636cfbf0a50SPhoebe Wang // AVX10 Features 637cfbf0a50SPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAVX10_1 = 638cfbf0a50SPhoebe Wang FeatureAVX512CD | FeatureAVX512VBMI | FeatureAVX512IFMA | 639cfbf0a50SPhoebe Wang FeatureAVX512VNNI | FeatureAVX512BF16 | FeatureAVX512VPOPCNTDQ | 640cfbf0a50SPhoebe Wang FeatureAVX512VBMI2 | FeatureAVX512BITALG | FeatureVAES | FeatureVPCLMULQDQ | 641cfbf0a50SPhoebe Wang FeatureAVX512FP16; 642cfbf0a50SPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAVX10_1_512 = 643cfbf0a50SPhoebe Wang FeatureAVX10_1 | FeatureEVEX512; 644259ca9eeSPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAVX10_2 = FeatureAVX10_1; 645259ca9eeSPhoebe Wang constexpr FeatureBitset ImpliedFeaturesAVX10_2_512 = 646259ca9eeSPhoebe Wang FeatureAVX10_2 | FeatureAVX10_1_512; 647cfbf0a50SPhoebe Wang 6486d6baef5SShengchen Kan // APX Features 6496d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesEGPR = {}; 6506d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesPush2Pop2 = {}; 6516d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesPPX = {}; 6526d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesNDD = {}; 6536d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesCCMP = {}; 654575177f6SShengchen Kan constexpr FeatureBitset ImpliedFeaturesNF = {}; 6556d6baef5SShengchen Kan constexpr FeatureBitset ImpliedFeaturesCF = {}; 6568ad32ce7SShengchen Kan constexpr FeatureBitset ImpliedFeaturesZU = {}; 6576d6baef5SShengchen Kan 658c4248fa3SFreddy Ye constexpr FeatureBitset ImpliedFeaturesMOVRS = {}; 659c4248fa3SFreddy Ye 660f09cf34dSArchibald Elliott constexpr FeatureInfo FeatureInfos[X86::CPU_FEATURE_MAX] = { 6617717c007SFreddy Ye #define X86_FEATURE(ENUM, STR) {{"+" STR}, ImpliedFeatures##ENUM}, 6627717c007SFreddy Ye #include "llvm/TargetParser/X86TargetParser.def" 6637717c007SFreddy Ye }; 6647717c007SFreddy Ye 665f09cf34dSArchibald Elliott void llvm::X86::getFeaturesForCPU(StringRef CPU, 6667717c007SFreddy Ye SmallVectorImpl<StringRef> &EnabledFeatures, 6675487b67cSCraig Topper bool NeedPlus) { 668f09cf34dSArchibald Elliott auto I = llvm::find_if(Processors, 669f09cf34dSArchibald Elliott [&](const ProcInfo &P) { return P.Name == CPU; }); 670f09cf34dSArchibald Elliott assert(I != std::end(Processors) && "Processor not found!"); 671f09cf34dSArchibald Elliott 672f09cf34dSArchibald Elliott FeatureBitset Bits = I->Features; 673f09cf34dSArchibald Elliott 674f09cf34dSArchibald Elliott // Remove the 64-bit feature which we only use to validate if a CPU can 675f09cf34dSArchibald Elliott // be used with 64-bit mode. 676f09cf34dSArchibald Elliott Bits &= ~Feature64BIT; 677f09cf34dSArchibald Elliott 678f09cf34dSArchibald Elliott // Add the string version of all set bits. 679f09cf34dSArchibald Elliott for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i) 6805487b67cSCraig Topper if (Bits[i] && !FeatureInfos[i].getName(NeedPlus).empty()) 6815487b67cSCraig Topper EnabledFeatures.push_back(FeatureInfos[i].getName(NeedPlus)); 682f09cf34dSArchibald Elliott } 683f09cf34dSArchibald Elliott 684f09cf34dSArchibald Elliott // For each feature that is (transitively) implied by this feature, set it. 685f09cf34dSArchibald Elliott static void getImpliedEnabledFeatures(FeatureBitset &Bits, 686f09cf34dSArchibald Elliott const FeatureBitset &Implies) { 687f09cf34dSArchibald Elliott // Fast path: Implies is often empty. 688f09cf34dSArchibald Elliott if (!Implies.any()) 689f09cf34dSArchibald Elliott return; 690f09cf34dSArchibald Elliott FeatureBitset Prev; 691f09cf34dSArchibald Elliott Bits |= Implies; 692f09cf34dSArchibald Elliott do { 693f09cf34dSArchibald Elliott Prev = Bits; 694f09cf34dSArchibald Elliott for (unsigned i = CPU_FEATURE_MAX; i;) 695f09cf34dSArchibald Elliott if (Bits[--i]) 696f09cf34dSArchibald Elliott Bits |= FeatureInfos[i].ImpliedFeatures; 697f09cf34dSArchibald Elliott } while (Prev != Bits); 698f09cf34dSArchibald Elliott } 699f09cf34dSArchibald Elliott 700f09cf34dSArchibald Elliott /// Create bit vector of features that are implied disabled if the feature 701f09cf34dSArchibald Elliott /// passed in Value is disabled. 702f09cf34dSArchibald Elliott static void getImpliedDisabledFeatures(FeatureBitset &Bits, unsigned Value) { 703f09cf34dSArchibald Elliott // Check all features looking for any dependent on this feature. If we find 704f09cf34dSArchibald Elliott // one, mark it and recursively find any feature that depend on it. 705f09cf34dSArchibald Elliott FeatureBitset Prev; 706f09cf34dSArchibald Elliott Bits.set(Value); 707f09cf34dSArchibald Elliott do { 708f09cf34dSArchibald Elliott Prev = Bits; 709f09cf34dSArchibald Elliott for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i) 710f09cf34dSArchibald Elliott if ((FeatureInfos[i].ImpliedFeatures & Bits).any()) 711f09cf34dSArchibald Elliott Bits.set(i); 712f09cf34dSArchibald Elliott } while (Prev != Bits); 713f09cf34dSArchibald Elliott } 714f09cf34dSArchibald Elliott 715f09cf34dSArchibald Elliott void llvm::X86::updateImpliedFeatures( 716f09cf34dSArchibald Elliott StringRef Feature, bool Enabled, 717f09cf34dSArchibald Elliott StringMap<bool> &Features) { 7185487b67cSCraig Topper auto I = llvm::find_if(FeatureInfos, [&](const FeatureInfo &FI) { 7195487b67cSCraig Topper return FI.getName() == Feature; 7205487b67cSCraig Topper }); 721f09cf34dSArchibald Elliott if (I == std::end(FeatureInfos)) { 722f09cf34dSArchibald Elliott // FIXME: This shouldn't happen, but may not have all features in the table 723f09cf34dSArchibald Elliott // yet. 724f09cf34dSArchibald Elliott return; 725f09cf34dSArchibald Elliott } 726f09cf34dSArchibald Elliott 727f09cf34dSArchibald Elliott FeatureBitset ImpliedBits; 728f09cf34dSArchibald Elliott if (Enabled) 729f09cf34dSArchibald Elliott getImpliedEnabledFeatures(ImpliedBits, I->ImpliedFeatures); 730f09cf34dSArchibald Elliott else 731f09cf34dSArchibald Elliott getImpliedDisabledFeatures(ImpliedBits, 732f09cf34dSArchibald Elliott std::distance(std::begin(FeatureInfos), I)); 733f09cf34dSArchibald Elliott 734f09cf34dSArchibald Elliott // Update the map entry for all implied features. 735f09cf34dSArchibald Elliott for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i) 7365487b67cSCraig Topper if (ImpliedBits[i] && !FeatureInfos[i].getName().empty()) 7375487b67cSCraig Topper Features[FeatureInfos[i].getName()] = Enabled; 738f09cf34dSArchibald Elliott } 739f09cf34dSArchibald Elliott 7407717c007SFreddy Ye char llvm::X86::getCPUDispatchMangling(StringRef CPU) { 7417717c007SFreddy Ye auto I = llvm::find_if(Processors, 7427717c007SFreddy Ye [&](const ProcInfo &P) { return P.Name == CPU; }); 7437717c007SFreddy Ye assert(I != std::end(Processors) && "Processor not found!"); 7447717c007SFreddy Ye assert(I->Mangling != '\0' && "Processor dooesn't support function multiversion!"); 7457717c007SFreddy Ye return I->Mangling; 7467717c007SFreddy Ye } 7477717c007SFreddy Ye 7487717c007SFreddy Ye bool llvm::X86::validateCPUSpecificCPUDispatch(StringRef Name) { 7497717c007SFreddy Ye auto I = llvm::find_if(Processors, 7507717c007SFreddy Ye [&](const ProcInfo &P) { return P.Name == Name; }); 7517717c007SFreddy Ye return I != std::end(Processors); 7527717c007SFreddy Ye } 7537717c007SFreddy Ye 75427da1538SFangrui Song std::array<uint32_t, 4> 75527da1538SFangrui Song llvm::X86::getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs) { 756f09cf34dSArchibald Elliott // Processor features and mapping to processor feature value. 75727da1538SFangrui Song std::array<uint32_t, 4> FeatureMask{}; 75827da1538SFangrui Song for (StringRef FeatureStr : FeatureStrs) { 759f09cf34dSArchibald Elliott unsigned Feature = StringSwitch<unsigned>(FeatureStr) 760f09cf34dSArchibald Elliott #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \ 761f09cf34dSArchibald Elliott .Case(STR, llvm::X86::FEATURE_##ENUM) 76227da1538SFangrui Song #define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) \ 76327da1538SFangrui Song .Case(STR, llvm::X86::FEATURE_##ENUM) 764f09cf34dSArchibald Elliott #include "llvm/TargetParser/X86TargetParser.def" 765f09cf34dSArchibald Elliott ; 76627da1538SFangrui Song assert(Feature / 32 < FeatureMask.size()); 76727da1538SFangrui Song FeatureMask[Feature / 32] |= 1U << (Feature % 32); 768f09cf34dSArchibald Elliott } 76927da1538SFangrui Song return FeatureMask; 770f09cf34dSArchibald Elliott } 771f09cf34dSArchibald Elliott 772f09cf34dSArchibald Elliott unsigned llvm::X86::getFeaturePriority(ProcessorFeatures Feat) { 773f09cf34dSArchibald Elliott #ifndef NDEBUG 774f09cf34dSArchibald Elliott // Check that priorities are set properly in the .def file. We expect that 775f09cf34dSArchibald Elliott // "compat" features are assigned non-duplicate consecutive priorities 7765275aed4SFreddy Ye // starting from one (1, ..., 37) and multiple zeros. 777f09cf34dSArchibald Elliott #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) PRIORITY, 778f09cf34dSArchibald Elliott unsigned Priorities[] = { 779f09cf34dSArchibald Elliott #include "llvm/TargetParser/X86TargetParser.def" 780f09cf34dSArchibald Elliott }; 781a208b684SFangrui Song std::array<unsigned, std::size(Priorities)> HelperList; 7825275aed4SFreddy Ye const size_t MaxPriority = 37; 78372105605SFreddy Ye std::iota(HelperList.begin(), HelperList.begin() + MaxPriority + 1, 0); 78472105605SFreddy Ye for (size_t i = MaxPriority + 1; i != std::size(Priorities); ++i) 78572105605SFreddy Ye HelperList[i] = 0; 786f09cf34dSArchibald Elliott assert(std::is_permutation(HelperList.begin(), HelperList.end(), 787a208b684SFangrui Song std::begin(Priorities), std::end(Priorities)) && 788f09cf34dSArchibald Elliott "Priorities don't form consecutive range!"); 789f09cf34dSArchibald Elliott #endif 790f09cf34dSArchibald Elliott 791f09cf34dSArchibald Elliott switch (Feat) { 792f09cf34dSArchibald Elliott #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \ 793f09cf34dSArchibald Elliott case X86::FEATURE_##ENUM: \ 794f09cf34dSArchibald Elliott return PRIORITY; 795f09cf34dSArchibald Elliott #include "llvm/TargetParser/X86TargetParser.def" 796f09cf34dSArchibald Elliott default: 797f09cf34dSArchibald Elliott llvm_unreachable("No Feature Priority for non-CPUSupports Features"); 798f09cf34dSArchibald Elliott } 799f09cf34dSArchibald Elliott } 800