LLVM 23.0.0git
X86TargetParser.cpp
Go to the documentation of this file.
1//===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements a target parser to recognise X86 hardware features.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/Bitset.h"
16#include <numeric>
17
18using namespace llvm;
19using namespace llvm::X86;
20
21namespace {
22
24
25struct ProcInfo {
26 StringLiteral Name;
27 X86::CPUKind Kind;
28 unsigned KeyFeature;
29 FeatureBitset Features;
30 char Mangling;
31 bool OnlyForCPUDispatchSpecific;
32};
33
34struct FeatureInfo {
35 StringLiteral NameWithPlus;
36 FeatureBitset ImpliedFeatures;
37
38 StringRef getName(bool WithPlus = false) const {
39 assert(NameWithPlus[0] == '+' && "Expected string to start with '+'");
40 if (WithPlus)
41 return NameWithPlus;
42 return NameWithPlus.drop_front();
43 }
44};
45
46} // end anonymous namespace
47
48#define X86_FEATURE(ENUM, STRING) \
49 constexpr FeatureBitset Feature##ENUM = {X86::FEATURE_##ENUM};
50#include "llvm/TargetParser/X86TargetParser.def"
51
52// Pentium with MMX.
54 FeatureX87 | FeatureCMPXCHG8B | FeatureMMX;
55
56// Pentium 2 and 3.
58 FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeatureFXSR | FeatureCMOV;
60
61// Pentium 4 CPUs
65 FeaturesPrescott | Feature64BIT | FeatureCMPXCHG16B;
66
67// Basic 64-bit capable CPU.
70 FeaturePOPCNT | FeatureCRC32 |
71 FeatureSSE4_2 | FeatureCMPXCHG16B;
73 FeaturesX86_64_V2 | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureF16C |
74 FeatureFMA | FeatureLZCNT | FeatureMOVBE | FeatureXSAVE;
76 FeatureAVX512BW | FeatureAVX512CD |
77 FeatureAVX512DQ | FeatureAVX512VL;
78
79// Intel Core CPUs
81 FeaturesNocona | FeatureSAHF | FeatureSSSE3;
82constexpr FeatureBitset FeaturesPenryn = FeaturesCore2 | FeatureSSE4_1;
84 FeaturesPenryn | FeaturePOPCNT | FeatureCRC32 | FeatureSSE4_2;
87 FeaturesWestmere | FeatureAVX | FeatureXSAVE | FeatureXSAVEOPT;
89 FeaturesSandyBridge | FeatureF16C | FeatureFSGSBASE | FeatureRDRND;
91 FeaturesIvyBridge | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureFMA |
92 FeatureINVPCID | FeatureLZCNT | FeatureMOVBE;
94 FeaturesHaswell | FeatureADX | FeaturePRFCHW | FeatureRDSEED;
95
96// Intel Knights Landing and Knights Mill
97// Knights Landing has feature parity with Broadwell.
99 FeaturesBroadwell | FeatureAES | FeatureAVX512F | FeatureAVX512CD;
100constexpr FeatureBitset FeaturesKNM = FeaturesKNL | FeatureAVX512VPOPCNTDQ;
101
102// Intel Skylake processors.
104 FeaturesBroadwell | FeatureAES | FeatureCLFLUSHOPT | FeatureXSAVEC |
105 FeatureXSAVES | FeatureSGX;
106// SkylakeServer inherits all SkylakeClient features except SGX.
107// FIXME: That doesn't match gcc.
109 (FeaturesSkylakeClient & ~FeatureSGX) | FeatureAVX512F | FeatureAVX512CD |
110 FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | FeatureCLWB |
111 FeaturePKU;
113 FeaturesSkylakeServer | FeatureAVX512VNNI;
115 FeaturesCascadeLake | FeatureAVX512BF16;
116
117// Intel 10nm processors.
119 FeaturesSkylakeClient | FeatureAVX512F | FeatureAVX512CD | FeatureAVX512DQ |
120 FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA | FeatureAVX512VBMI |
121 FeaturePKU | FeatureSHA;
123 FeaturesCannonlake | FeatureAVX512BITALG | FeatureAVX512VBMI2 |
124 FeatureAVX512VNNI | FeatureAVX512VPOPCNTDQ | FeatureGFNI | FeatureRDPID |
125 FeatureVAES | FeatureVPCLMULQDQ;
128 FeaturesICLClient | FeatureCLWB | FeaturePCONFIG | FeatureWBNOINVD;
130 FeaturesICLClient | FeatureAVX512VP2INTERSECT | FeatureMOVDIR64B |
131 FeatureCLWB | FeatureMOVDIRI | FeatureSHSTK | FeatureKL | FeatureWIDEKL;
133 FeaturesICLServer | FeatureAMX_BF16 | FeatureAMX_INT8 | FeatureAMX_TILE |
134 FeatureAVX512BF16 | FeatureAVX512FP16 | FeatureAVXVNNI | FeatureCLDEMOTE |
135 FeatureENQCMD | FeatureMOVDIR64B | FeatureMOVDIRI | FeaturePTWRITE |
136 FeatureSERIALIZE | FeatureSHSTK | FeatureTSXLDTRK | FeatureUINTR |
137 FeatureWAITPKG | FeatureAVX512DQ | FeatureAVX512VL;
139 FeaturesSapphireRapids | FeatureAMX_FP16 | FeaturePREFETCHI;
141 FeaturesGraniteRapids | FeatureAMX_COMPLEX | FeatureAVX10_2 |
142 FeatureCMPCCXADD | FeatureAVXIFMA | FeatureAVXNECONVERT |
143 FeatureAVXVNNIINT8 | FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 |
144 FeatureSM4 | FeatureEGPR | FeatureZU | FeatureCCMP | FeaturePush2Pop2 |
145 FeaturePPX | FeatureNDD | FeatureNF | FeatureJMPABS | FeatureMOVRS |
146 FeatureAMX_MOVRS | FeatureAMX_AVX512 | FeatureAMX_FP8 | FeatureAMX_TF32;
147
148// Intel Atom processors.
149// Bonnell has feature parity with Core2 and adds MOVBE.
150constexpr FeatureBitset FeaturesBonnell = FeaturesCore2 | FeatureMOVBE;
151// Silvermont has parity with Westmere and Bonnell plus PRFCHW and RDRND.
153 FeaturesBonnell | FeaturesWestmere | FeaturePRFCHW | FeatureRDRND;
155 FeaturesSilvermont | FeatureAES | FeatureCLFLUSHOPT | FeatureFSGSBASE |
156 FeatureRDSEED | FeatureSHA | FeatureXSAVE | FeatureXSAVEC |
157 FeatureXSAVEOPT | FeatureXSAVES;
159 FeaturesGoldmont | FeaturePTWRITE | FeatureRDPID | FeatureSGX;
161 FeaturesGoldmontPlus | FeatureCLWB | FeatureGFNI;
163 FeaturesTremont | FeatureADX | FeatureBMI | FeatureBMI2 | FeatureF16C |
164 FeatureFMA | FeatureINVPCID | FeatureLZCNT | FeaturePCONFIG | FeaturePKU |
165 FeatureSERIALIZE | FeatureSHSTK | FeatureVAES | FeatureVPCLMULQDQ |
166 FeatureMOVDIR64B | FeatureMOVDIRI | FeatureWAITPKG | FeatureAVXVNNI |
167 FeatureHRESET | FeatureWIDEKL;
169 FeaturesAlderlake | FeatureCMPCCXADD | FeatureAVXIFMA | FeatureUINTR |
170 FeatureENQCMD | FeatureAVXNECONVERT | FeatureAVXVNNIINT8;
172 FeaturesArrowlake | FeatureCLDEMOTE;
174 FeaturesArrowlake | FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 |
175 FeatureSM4;
177 (FeaturesArrowlakeS ^ FeatureWIDEKL);
179 FeaturesPantherlake | FeaturePREFETCHI | FeatureAVX10_2 | FeatureMOVRS |
180 FeatureEGPR | FeatureZU | FeatureCCMP | FeaturePush2Pop2 | FeaturePPX |
181 FeatureNDD | FeatureNF | FeatureJMPABS;
183 (FeaturesSierraforest ^ FeatureWIDEKL) | FeatureAVXVNNIINT16 |
184 FeatureSHA512 | FeatureSM3 | FeatureSM4 | FeaturePREFETCHI | FeatureUSERMSR;
185
186// Geode Processor.
188 FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeaturePRFCHW;
189
190// K6 processor.
191constexpr FeatureBitset FeaturesK6 = FeatureX87 | FeatureCMPXCHG8B | FeatureMMX;
192
193// K7 and K8 architecture processors.
195 FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeaturePRFCHW;
197 FeaturesAthlon | FeatureFXSR | FeatureSSE;
199 FeaturesAthlonXP | FeatureSSE2 | Feature64BIT;
200constexpr FeatureBitset FeaturesK8SSE3 = FeaturesK8 | FeatureSSE3;
202 FeaturesK8SSE3 | FeatureCMPXCHG16B | FeatureLZCNT | FeaturePOPCNT |
203 FeaturePRFCHW | FeatureSAHF | FeatureSSE4_A;
204
205// Bobcat architecture processors.
207 FeatureX87 | FeatureCMPXCHG8B | FeatureCMPXCHG16B | Feature64BIT |
208 FeatureFXSR | FeatureLZCNT | FeatureMMX | FeaturePOPCNT | FeaturePRFCHW |
209 FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_A |
210 FeatureSAHF;
212 FeaturesBTVER1 | FeatureAES | FeatureAVX | FeatureBMI | FeatureCRC32 |
213 FeatureF16C | FeatureMOVBE | FeaturePCLMUL | FeatureXSAVE | FeatureXSAVEOPT;
214
215// AMD Bulldozer architecture processors.
217 FeatureX87 | FeatureAES | FeatureAVX | FeatureCMPXCHG8B |
218 FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT | FeatureFMA4 |
219 FeatureFXSR | FeatureLWP | FeatureLZCNT | FeatureMMX | FeaturePCLMUL |
220 FeaturePOPCNT | FeaturePRFCHW | FeatureSAHF | FeatureSSE | FeatureSSE2 |
221 FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 | FeatureSSE4_2 | FeatureSSE4_A |
222 FeatureXOP | FeatureXSAVE;
224 FeaturesBDVER1 | FeatureBMI | FeatureFMA | FeatureF16C | FeatureTBM;
226 FeaturesBDVER2 | FeatureFSGSBASE | FeatureXSAVEOPT;
227constexpr FeatureBitset FeaturesBDVER4 = FeaturesBDVER3 | FeatureAVX2 |
228 FeatureBMI2 | FeatureMOVBE |
229 FeatureMWAITX | FeatureRDRND;
230
231// AMD Zen architecture processors.
233 FeatureX87 | FeatureADX | FeatureAES | FeatureAVX | FeatureAVX2 |
234 FeatureBMI | FeatureBMI2 | FeatureCLFLUSHOPT | FeatureCLZERO |
235 FeatureCMPXCHG8B | FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT |
236 FeatureF16C | FeatureFMA | FeatureFSGSBASE | FeatureFXSR | FeatureLZCNT |
237 FeatureMMX | FeatureMOVBE | FeatureMWAITX | FeaturePCLMUL | FeaturePOPCNT |
238 FeaturePRFCHW | FeatureRDRND | FeatureRDSEED | FeatureSAHF | FeatureSHA |
239 FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 |
240 FeatureSSE4_2 | FeatureSSE4_A | FeatureXSAVE | FeatureXSAVEC |
241 FeatureXSAVEOPT | FeatureXSAVES;
242constexpr FeatureBitset FeaturesZNVER2 = FeaturesZNVER1 | FeatureCLWB |
243 FeatureRDPID | FeatureRDPRU |
244 FeatureWBNOINVD;
246 FeatureINVPCID | FeaturePKU |
247 FeatureVAES | FeatureVPCLMULQDQ;
249 FeaturesZNVER3 | FeatureAVX512F | FeatureAVX512CD | FeatureAVX512DQ |
250 FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA | FeatureAVX512VBMI |
251 FeatureAVX512VBMI2 | FeatureAVX512VNNI | FeatureAVX512BITALG |
252 FeatureAVX512VPOPCNTDQ | FeatureAVX512BF16 | FeatureGFNI | FeatureSHSTK;
253
255 FeaturesZNVER4 | FeatureAVXVNNI | FeatureMOVDIRI | FeatureMOVDIR64B |
256 FeatureAVX512VP2INTERSECT | FeaturePREFETCHI | FeatureAVXVNNI;
257
259 FeaturesZNVER5 | FeatureAVXVNNIINT8 | FeatureAVX512FP16 | FeatureAVXIFMA |
260 FeatureAVXNECONVERT;
261
262// Hygon architecture processors.
264 FeatureX87 | FeatureADX | FeatureAES | FeatureAVX | FeatureAVX2 |
265 FeatureBMI | FeatureBMI2 | FeatureCLFLUSHOPT | FeatureCLZERO |
266 FeatureCMPXCHG8B | FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT |
267 FeatureF16C | FeatureFMA | FeatureFSGSBASE | FeatureFXSR | FeatureLZCNT |
268 FeatureMMX | FeatureMOVBE | FeatureMWAITX | FeaturePCLMUL | FeaturePOPCNT |
269 FeaturePRFCHW | FeatureRDRND | FeatureRDSEED | FeatureSAHF | FeatureSHA |
270 FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 |
271 FeatureSSE4_2 | FeatureSSE4_A | FeatureXSAVE | FeatureXSAVEC |
272 FeatureXSAVEOPT | FeatureXSAVES;
273
275
277 FeaturesC86_4G_M4 | FeatureAVX512BF16 | FeatureAVX512BITALG |
278 FeatureAVX512BW | FeatureAVX512CD | FeatureAVX512DQ | FeatureAVX512F |
279 FeatureAVX512IFMA | FeatureAVX512VBMI | FeatureAVX512VBMI2 |
280 FeatureAVX512VL | FeatureAVX512VNNI | FeatureAVX512VPOPCNTDQ | FeatureCLWB |
281 FeatureCMOV | FeatureGFNI | FeatureVAES | FeatureVPCLMULQDQ |
282 FeatureWBNOINVD;
283
284// D151696 tranplanted Mangling and OnlyForCPUDispatchSpecific from
285// X86TargetParser.def to here. They are assigned by following ways:
286// 1. Copy the mangling from the original CPU_SPEICIFC MACROs. If no, assign
287// to '\0' by default, which means not support cpu_specific/dispatch feature.
288// 2. set OnlyForCPUDispatchSpecific as true if this cpu name was not
289// listed here before, which means it doesn't support -march, -mtune and so on.
290// FIXME: Remove OnlyForCPUDispatchSpecific after all CPUs here support both
291// cpu_dispatch/specific() feature and -march, -mtune, and so on.
292// clang-format off
293constexpr ProcInfo Processors[] = {
294 // Empty processor. Include X87 and CMPXCHG8 for backwards compatibility.
295 { {""}, CK_None, ~0U, FeatureX87 | FeatureCMPXCHG8B, '\0', false },
296 { {"generic"}, CK_None, ~0U, FeatureX87 | FeatureCMPXCHG8B | Feature64BIT, 'A', true },
297 // i386-generation processors.
298 { {"i386"}, CK_i386, ~0U, FeatureX87, '\0', false },
299 // i486-generation processors.
300 { {"i486"}, CK_i486, ~0U, FeatureX87, '\0', false },
301 { {"winchip-c6"}, CK_WinChipC6, ~0U, FeaturesPentiumMMX, '\0', false },
302 { {"winchip2"}, CK_WinChip2, ~0U, FeaturesPentiumMMX | FeaturePRFCHW, '\0', false },
303 { {"c3"}, CK_C3, ~0U, FeaturesPentiumMMX | FeaturePRFCHW, '\0', false },
304 // i586-generation processors, P5 microarchitecture based.
305 { {"i586"}, CK_i586, ~0U, FeatureX87 | FeatureCMPXCHG8B, '\0', false },
306 { {"pentium"}, CK_Pentium, ~0U, FeatureX87 | FeatureCMPXCHG8B, 'B', false },
307 { {"pentium-mmx"}, CK_PentiumMMX, ~0U, FeaturesPentiumMMX, '\0', false },
308 { {"pentium_mmx"}, CK_PentiumMMX, ~0U, FeaturesPentiumMMX, 'D', true },
309 // i686-generation processors, P6 / Pentium M microarchitecture based.
310 { {"pentiumpro"}, CK_PentiumPro, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, 'C', false },
311 { {"pentium_pro"}, CK_PentiumPro, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, 'C', true },
312 { {"i686"}, CK_i686, ~0U, FeatureCMOV | FeatureX87 | FeatureCMPXCHG8B, '\0', false },
313 { {"pentium2"}, CK_Pentium2, ~0U, FeaturesPentium2, 'E', false },
314 { {"pentium_ii"}, CK_Pentium2, ~0U, FeaturesPentium2, 'E', true },
315 { {"pentium3"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', false },
316 { {"pentium3m"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', false },
317 { {"pentium_iii"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', true },
318 { {"pentium_iii_no_xmm_regs"}, CK_Pentium3, ~0U, FeaturesPentium3, 'H', true },
319 { {"pentium-m"}, CK_PentiumM, ~0U, FeaturesPentium4, '\0', false },
320 { {"pentium_m"}, CK_PentiumM, ~0U, FeaturesPentium4, 'K', true },
321 { {"c3-2"}, CK_C3_2, ~0U, FeaturesPentium3, '\0', false },
322 { {"yonah"}, CK_Yonah, ~0U, FeaturesPrescott, 'L', false },
323 // Netburst microarchitecture based processors.
324 { {"pentium4"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', false },
325 { {"pentium4m"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', false },
326 { {"pentium_4"}, CK_Pentium4, ~0U, FeaturesPentium4, 'J', true },
327 { {"pentium_4_sse3"}, CK_Prescott, ~0U, FeaturesPrescott, 'L', true },
328 { {"prescott"}, CK_Prescott, ~0U, FeaturesPrescott, 'L', false },
329 { {"nocona"}, CK_Nocona, ~0U, FeaturesNocona, 'L', false },
330 // Core microarchitecture based processors.
331 { {"core2"}, CK_Core2, FEATURE_SSSE3, FeaturesCore2, 'M', false },
332 { {"core_2_duo_ssse3"}, CK_Core2, ~0U, FeaturesCore2, 'M', true },
333 { {"penryn"}, CK_Penryn, ~0U, FeaturesPenryn, 'N', false },
334 { {"core_2_duo_sse4_1"}, CK_Penryn, ~0U, FeaturesPenryn, 'N', true },
335 // Atom processors
336 { {"bonnell"}, CK_Bonnell, FEATURE_SSSE3, FeaturesBonnell, 'O', false },
337 { {"atom"}, CK_Bonnell, FEATURE_SSSE3, FeaturesBonnell, 'O', false },
338 { {"silvermont"}, CK_Silvermont, FEATURE_SSE4_2, FeaturesSilvermont, 'c', false },
339 { {"slm"}, CK_Silvermont, FEATURE_SSE4_2, FeaturesSilvermont, 'c', false },
340 { {"atom_sse4_2"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'c', true },
341 { {"atom_sse4_2_movbe"}, CK_Goldmont, FEATURE_SSE4_2, FeaturesGoldmont, 'd', true },
342 { {"goldmont"}, CK_Goldmont, FEATURE_SSE4_2, FeaturesGoldmont, 'i', false },
343 { {"goldmont-plus"}, CK_GoldmontPlus, FEATURE_SSE4_2, FeaturesGoldmontPlus, '\0', false },
344 { {"goldmont_plus"}, CK_GoldmontPlus, FEATURE_SSE4_2, FeaturesGoldmontPlus, 'd', true },
345 { {"tremont"}, CK_Tremont, FEATURE_SSE4_2, FeaturesTremont, 'd', false },
346 // Nehalem microarchitecture based processors.
347 { {"nehalem"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', false },
348 { {"core_i7_sse4_2"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', true },
349 { {"corei7"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'P', false },
350 // Westmere microarchitecture based processors.
351 { {"westmere"}, CK_Westmere, FEATURE_PCLMUL, FeaturesWestmere, 'Q', false },
352 { {"core_aes_pclmulqdq"}, CK_Nehalem, FEATURE_SSE4_2, FeaturesNehalem, 'Q', true },
353 // Sandy Bridge microarchitecture based processors.
354 { {"sandybridge"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, 'R', false },
355 { {"core_2nd_gen_avx"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, 'R', true },
356 { {"corei7-avx"}, CK_SandyBridge, FEATURE_AVX, FeaturesSandyBridge, '\0', false },
357 // Ivy Bridge microarchitecture based processors.
358 { {"ivybridge"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, 'S', false },
359 { {"core_3rd_gen_avx"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, 'S', true },
360 { {"core-avx-i"}, CK_IvyBridge, FEATURE_AVX, FeaturesIvyBridge, '\0', false },
361 // Haswell microarchitecture based processors.
362 { {"haswell"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'V', false },
363 { {"core-avx2"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, '\0', false },
364 { {"core_4th_gen_avx"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'V', true },
365 { {"core_4th_gen_avx_tsx"}, CK_Haswell, FEATURE_AVX2, FeaturesHaswell, 'W', true },
366 // Broadwell microarchitecture based processors.
367 { {"broadwell"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'X', false },
368 { {"core_5th_gen_avx"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'X', true },
369 { {"core_5th_gen_avx_tsx"}, CK_Broadwell, FEATURE_AVX2, FeaturesBroadwell, 'Y', true },
370 // Skylake client microarchitecture based processors.
371 { {"skylake"}, CK_SkylakeClient, FEATURE_AVX2, FeaturesSkylakeClient, 'b', false },
372 // Skylake server microarchitecture based processors.
373 { {"skylake-avx512"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, '\0', false },
374 { {"skx"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, 'a', false },
375 { {"skylake_avx512"}, CK_SkylakeServer, FEATURE_AVX512F, FeaturesSkylakeServer, 'a', true },
376 // Cascadelake Server microarchitecture based processors.
377 { {"cascadelake"}, CK_Cascadelake, FEATURE_AVX512VNNI, FeaturesCascadeLake, 'o', false },
378 // Cooperlake Server microarchitecture based processors.
379 { {"cooperlake"}, CK_Cooperlake, FEATURE_AVX512BF16, FeaturesCooperLake, 'f', false },
380 // Cannonlake client microarchitecture based processors.
381 { {"cannonlake"}, CK_Cannonlake, FEATURE_AVX512VBMI, FeaturesCannonlake, 'e', false },
382 // Icelake client microarchitecture based processors.
383 { {"icelake-client"}, CK_IcelakeClient, FEATURE_AVX512VBMI2, FeaturesICLClient, '\0', false },
384 { {"icelake_client"}, CK_IcelakeClient, FEATURE_AVX512VBMI2, FeaturesICLClient, 'k', true },
385 // Rocketlake microarchitecture based processors.
386 { {"rocketlake"}, CK_Rocketlake, FEATURE_AVX512VBMI2, FeaturesRocketlake, 'k', false },
387 // Icelake server microarchitecture based processors.
388 { {"icelake-server"}, CK_IcelakeServer, FEATURE_AVX512VBMI2, FeaturesICLServer, '\0', false },
389 { {"icelake_server"}, CK_IcelakeServer, FEATURE_AVX512VBMI2, FeaturesICLServer, 'k', true },
390 // Tigerlake microarchitecture based processors.
391 { {"tigerlake"}, CK_Tigerlake, FEATURE_AVX512VP2INTERSECT, FeaturesTigerlake, 'l', false },
392 // Sapphire Rapids microarchitecture based processors.
393 { {"sapphirerapids"}, CK_SapphireRapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false },
394 // Alderlake microarchitecture based processors.
395 { {"alderlake"}, CK_Alderlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false },
396 // Raptorlake microarchitecture based processors.
397 { {"raptorlake"}, CK_Raptorlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false },
398 // Meteorlake microarchitecture based processors.
399 { {"meteorlake"}, CK_Meteorlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false },
400 // Arrowlake microarchitecture based processors.
401 { {"arrowlake"}, CK_Arrowlake, FEATURE_AVX2, FeaturesArrowlake, 'p', false },
402 { {"arrowlake-s"}, CK_ArrowlakeS, FEATURE_AVX2, FeaturesArrowlakeS, '\0', false },
403 { {"arrowlake_s"}, CK_ArrowlakeS, FEATURE_AVX2, FeaturesArrowlakeS, 'p', true },
404 // Lunarlake microarchitecture based processors.
405 { {"lunarlake"}, CK_Lunarlake, FEATURE_AVX2, FeaturesArrowlakeS, 'p', false },
406 // Gracemont microarchitecture based processors.
407 { {"gracemont"}, CK_Gracemont, FEATURE_AVX2, FeaturesAlderlake, 'p', false },
408 // Pantherlake microarchitecture based processors.
409 { {"pantherlake"}, CK_Lunarlake, FEATURE_AVX2, FeaturesPantherlake, 'p', false },
410 { {"wildcatlake"}, CK_Lunarlake, FEATURE_AVX2, FeaturesPantherlake, 'p', false },
411 // Novalake microarchitecture based processors.
412 { {"novalake"}, CK_Novalake, FEATURE_AVX2, FeaturesNovalake, 'r', false },
413 // Sierraforest microarchitecture based processors.
414 { {"sierraforest"}, CK_Sierraforest, FEATURE_AVX2, FeaturesSierraforest, 'p', false },
415 // Grandridge microarchitecture based processors.
416 { {"grandridge"}, CK_Grandridge, FEATURE_AVX2, FeaturesSierraforest, 'p', false },
417 // Granite Rapids microarchitecture based processors.
418 { {"graniterapids"}, CK_Graniterapids, FEATURE_AVX512FP16, FeaturesGraniteRapids, 'n', false },
419 // Granite Rapids D microarchitecture based processors.
420 { {"graniterapids-d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, '\0', false },
421 { {"graniterapids_d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, 'n', true },
422 // Emerald Rapids microarchitecture based processors.
423 { {"emeraldrapids"}, CK_Emeraldrapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false },
424 // Clearwaterforest microarchitecture based processors.
425 { {"clearwaterforest"}, CK_Lunarlake, FEATURE_AVX2, FeaturesClearwaterforest, 'p', false },
426 // Diamond Rapids microarchitecture based processors.
427 { {"diamondrapids"}, CK_Diamondrapids, FEATURE_AVX10_2, FeaturesDiamondRapids, 'z', false },
428 // Knights Landing processor.
429 { {"knl"}, CK_KNL, FEATURE_AVX512F, FeaturesKNL, 'Z', false },
430 { {"mic_avx512"}, CK_KNL, FEATURE_AVX512F, FeaturesKNL, 'Z', true },
431 // Knights Mill processor.
432 { {"knm"}, CK_KNM, FEATURE_AVX5124FMAPS, FeaturesKNM, 'j', false },
433 // Lakemont microarchitecture based processors.
434 { {"lakemont"}, CK_Lakemont, ~0U, FeatureCMPXCHG8B, '\0', false },
435 // K6 architecture processors.
436 { {"k6"}, CK_K6, ~0U, FeaturesK6, '\0', false },
437 { {"k6-2"}, CK_K6_2, ~0U, FeaturesK6 | FeaturePRFCHW, '\0', false },
438 { {"k6-3"}, CK_K6_3, ~0U, FeaturesK6 | FeaturePRFCHW, '\0', false },
439 // K7 architecture processors.
440 { {"athlon"}, CK_Athlon, ~0U, FeaturesAthlon, '\0', false },
441 { {"athlon-tbird"}, CK_Athlon, ~0U, FeaturesAthlon, '\0', false },
442 { {"athlon-xp"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false },
443 { {"athlon-mp"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false },
444 { {"athlon-4"}, CK_AthlonXP, ~0U, FeaturesAthlonXP, '\0', false },
445 // K8 architecture processors.
446 { {"k8"}, CK_K8, ~0U, FeaturesK8, '\0', false },
447 { {"athlon64"}, CK_K8, ~0U, FeaturesK8, '\0', false },
448 { {"athlon-fx"}, CK_K8, ~0U, FeaturesK8, '\0', false },
449 { {"opteron"}, CK_K8, ~0U, FeaturesK8, '\0', false },
450 { {"k8-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false },
451 { {"athlon64-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false },
452 { {"opteron-sse3"}, CK_K8SSE3, ~0U, FeaturesK8SSE3, '\0', false },
453 { {"amdfam10"}, CK_AMDFAM10, FEATURE_SSE4_A, FeaturesAMDFAM10, '\0', false },
454 { {"barcelona"}, CK_AMDFAM10, FEATURE_SSE4_A, FeaturesAMDFAM10, '\0', false },
455 // Bobcat architecture processors.
456 { {"btver1"}, CK_BTVER1, FEATURE_SSE4_A, FeaturesBTVER1, '\0', false },
457 { {"btver2"}, CK_BTVER2, FEATURE_BMI, FeaturesBTVER2, '\0', false },
458 // Bulldozer architecture processors.
459 { {"bdver1"}, CK_BDVER1, FEATURE_XOP, FeaturesBDVER1, '\0', false },
460 { {"bdver2"}, CK_BDVER2, FEATURE_FMA, FeaturesBDVER2, '\0', false },
461 { {"bdver3"}, CK_BDVER3, FEATURE_FMA, FeaturesBDVER3, '\0', false },
462 { {"bdver4"}, CK_BDVER4, FEATURE_AVX2, FeaturesBDVER4, '\0', false },
463 // Zen architecture processors.
464 { {"znver1"}, CK_ZNVER1, FEATURE_AVX2, FeaturesZNVER1, '\0', false },
465 { {"znver2"}, CK_ZNVER2, FEATURE_AVX2, FeaturesZNVER2, '\0', false },
466 { {"znver3"}, CK_ZNVER3, FEATURE_AVX2, FeaturesZNVER3, '\0', false },
467 { {"znver4"}, CK_ZNVER4, FEATURE_AVX512VBMI2, FeaturesZNVER4, '\0', false },
468 { {"znver5"}, CK_ZNVER5, FEATURE_AVX512VP2INTERSECT, FeaturesZNVER5, '\0', false },
469 { {"znver6"}, CK_ZNVER6, FEATURE_AVX512FP16, FeaturesZNVER6, '\0', false },
470 // Hygon processors.
471 { {"c86-4g-m4"}, CK_C86_4G_M4, FEATURE_AVX2, FeaturesC86_4G_M4 , '\0', false },
472 { {"c86-4g-m6"}, CK_C86_4G_M6, FEATURE_AVX2, FeaturesC86_4G_M6 , '\0', false },
473 { {"c86-4g-m7"}, CK_C86_4G_M7, FEATURE_AVX512VBMI2, FeaturesC86_4G_M7 , '\0', false },
474 // Generic 64-bit processor.
475 { {"x86-64"}, CK_x86_64, FEATURE_SSE2 , FeaturesX86_64, '\0', false },
476 { {"x86-64-v2"}, CK_x86_64_v2, FEATURE_SSE4_2 , FeaturesX86_64_V2, '\0', false },
477 { {"x86-64-v3"}, CK_x86_64_v3, FEATURE_AVX2, FeaturesX86_64_V3, '\0', false },
478 { {"x86-64-v4"}, CK_x86_64_v4, FEATURE_AVX512VL, FeaturesX86_64_V4, '\0', false },
479 // Geode processors.
480 { {"geode"}, CK_Geode, ~0U, FeaturesGeode, '\0', false },
481};
482// clang-format on
483
484constexpr const char *NoTuneList[] = {"x86-64-v2", "x86-64-v3", "x86-64-v4"};
485
487 for (const auto &P : Processors)
488 if (!P.OnlyForCPUDispatchSpecific && P.Name == CPU &&
489 (P.Features[FEATURE_64BIT] || !Only64Bit))
490 return P.Kind;
491
492 return CK_None;
493}
494
497 return CK_None;
498 return parseArchX86(CPU, Only64Bit);
499}
500
502 bool Only64Bit) {
503 for (const auto &P : Processors)
504 if (!P.OnlyForCPUDispatchSpecific && !P.Name.empty() &&
505 (P.Features[FEATURE_64BIT] || !Only64Bit))
506 Values.emplace_back(P.Name);
507}
508
510 bool Only64Bit) {
511 for (const ProcInfo &P : Processors)
512 if (!P.OnlyForCPUDispatchSpecific && !P.Name.empty() &&
513 (P.Features[FEATURE_64BIT] || !Only64Bit) &&
515 Values.emplace_back(P.Name);
516}
517
519 // FIXME: Can we avoid a linear search here? The table might be sorted by
520 // CPUKind so we could binary search?
521 for (const auto &P : Processors) {
522 if (P.Kind == Kind) {
523 assert(P.KeyFeature != ~0U && "Processor does not have a key feature.");
524 return static_cast<ProcessorFeatures>(P.KeyFeature);
525 }
526 }
527
528 llvm_unreachable("Unable to find CPU kind!");
529}
530
531// Features with no dependencies.
578
579// Not really CPU features, but need to be in the table because clang uses
580// target features to communicate them to the backend.
586
587// XSAVE features are dependent on basic XSAVE.
588constexpr FeatureBitset ImpliedFeaturesXSAVEC = FeatureXSAVE;
589constexpr FeatureBitset ImpliedFeaturesXSAVEOPT = FeatureXSAVE;
590constexpr FeatureBitset ImpliedFeaturesXSAVES = FeatureXSAVE;
591
592// SSE/AVX/AVX512F chain.
594constexpr FeatureBitset ImpliedFeaturesSSE2 = FeatureSSE;
595constexpr FeatureBitset ImpliedFeaturesSSE3 = FeatureSSE2;
596constexpr FeatureBitset ImpliedFeaturesSSSE3 = FeatureSSE3;
597constexpr FeatureBitset ImpliedFeaturesSSE4_1 = FeatureSSSE3;
598constexpr FeatureBitset ImpliedFeaturesSSE4_2 = FeatureSSE4_1;
599constexpr FeatureBitset ImpliedFeaturesAVX = FeatureSSE4_2;
600constexpr FeatureBitset ImpliedFeaturesAVX2 = FeatureAVX;
603 FeatureAVX2 | FeatureF16C | FeatureFMA;
604
605// Vector extensions that build on SSE or AVX.
606constexpr FeatureBitset ImpliedFeaturesAES = FeatureSSE2;
607constexpr FeatureBitset ImpliedFeaturesF16C = FeatureAVX;
608constexpr FeatureBitset ImpliedFeaturesFMA = FeatureAVX;
609constexpr FeatureBitset ImpliedFeaturesGFNI = FeatureSSE2;
610constexpr FeatureBitset ImpliedFeaturesPCLMUL = FeatureSSE2;
611constexpr FeatureBitset ImpliedFeaturesSHA = FeatureSSE2;
612constexpr FeatureBitset ImpliedFeaturesVAES = FeatureAES | FeatureAVX2;
613constexpr FeatureBitset ImpliedFeaturesVPCLMULQDQ = FeatureAVX | FeaturePCLMUL;
614constexpr FeatureBitset ImpliedFeaturesSM3 = FeatureAVX;
615constexpr FeatureBitset ImpliedFeaturesSM4 = FeatureAVX2;
616
617// AVX512 features.
618constexpr FeatureBitset ImpliedFeaturesAVX512CD = FeatureAVX512F;
619constexpr FeatureBitset ImpliedFeaturesAVX512BW = FeatureAVX512F;
620constexpr FeatureBitset ImpliedFeaturesAVX512DQ = FeatureAVX512F;
621constexpr FeatureBitset ImpliedFeaturesAVX512VL = FeatureAVX512F;
622
623constexpr FeatureBitset ImpliedFeaturesAVX512BF16 = FeatureAVX512BW;
624constexpr FeatureBitset ImpliedFeaturesAVX512BITALG = FeatureAVX512BW;
625constexpr FeatureBitset ImpliedFeaturesAVX512IFMA = FeatureAVX512F;
626constexpr FeatureBitset ImpliedFeaturesAVX512VNNI = FeatureAVX512F;
628constexpr FeatureBitset ImpliedFeaturesAVX512VBMI = FeatureAVX512BW;
629constexpr FeatureBitset ImpliedFeaturesAVX512VBMI2 = FeatureAVX512BW;
631
632// FIXME: These two aren't really implemented and just exist in the feature
633// list for __builtin_cpu_supports. So omit their dependencies.
636
637// SSE4_A->FMA4->XOP chain.
638constexpr FeatureBitset ImpliedFeaturesSSE4_A = FeatureSSE3;
639constexpr FeatureBitset ImpliedFeaturesFMA4 = FeatureAVX | FeatureSSE4_A;
640constexpr FeatureBitset ImpliedFeaturesXOP = FeatureFMA4;
641
642// AMX Features
644constexpr FeatureBitset ImpliedFeaturesAMX_BF16 = FeatureAMX_TILE;
645constexpr FeatureBitset ImpliedFeaturesAMX_FP16 = FeatureAMX_TILE;
646constexpr FeatureBitset ImpliedFeaturesAMX_INT8 = FeatureAMX_TILE;
647constexpr FeatureBitset ImpliedFeaturesAMX_COMPLEX = FeatureAMX_TILE;
648constexpr FeatureBitset ImpliedFeaturesAMX_FP8 = FeatureAMX_TILE;
649constexpr FeatureBitset ImpliedFeaturesAMX_MOVRS = FeatureAMX_TILE;
651 FeatureAMX_TILE | FeatureAVX10_2;
652constexpr FeatureBitset ImpliedFeaturesAMX_TF32 = FeatureAMX_TILE;
654
660constexpr FeatureBitset ImpliedFeaturesAVXIFMA = FeatureAVX2;
662constexpr FeatureBitset ImpliedFeaturesSHA512 = FeatureAVX2;
663constexpr FeatureBitset ImpliedFeaturesAVX512FP16 = FeatureAVX512BW;
664// Key Locker Features
665constexpr FeatureBitset ImpliedFeaturesKL = FeatureSSE2;
667
668// AVXVNNI Features
669constexpr FeatureBitset ImpliedFeaturesAVXVNNI = FeatureAVX2;
670
671// AVX10 Features
673 FeatureAVX512CD | FeatureAVX512VBMI | FeatureAVX512IFMA |
674 FeatureAVX512VNNI | FeatureAVX512BF16 | FeatureAVX512VPOPCNTDQ |
675 FeatureAVX512VBMI2 | FeatureAVX512BITALG | FeatureAVX512FP16 |
676 FeatureAVX512DQ | FeatureAVX512VL;
677constexpr FeatureBitset ImpliedFeaturesAVX10_2 = FeatureAVX10_1;
678
679// APX Features
689
694
696
697constexpr FeatureInfo FeatureInfos[] = {
698#define X86_FEATURE(ENUM, STR) {{"+" STR}, ImpliedFeatures##ENUM},
699#include "llvm/TargetParser/X86TargetParser.def"
700};
701
703 SmallVectorImpl<StringRef> &EnabledFeatures,
704 bool NeedPlus) {
706 [&](const ProcInfo &P) { return P.Name == CPU; });
707 assert(I != std::end(Processors) && "Processor not found!");
708
709 FeatureBitset Bits = I->Features;
710
711 // Remove the 64-bit feature which we only use to validate if a CPU can
712 // be used with 64-bit mode.
713 Bits &= ~Feature64BIT;
714
715 // Add the string version of all set bits.
716 for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)
717 if (Bits[i] && !FeatureInfos[i].getName(NeedPlus).empty())
718 EnabledFeatures.push_back(FeatureInfos[i].getName(NeedPlus));
719}
720
721// For each feature that is (transitively) implied by this feature, set it.
723 const FeatureBitset &Implies) {
724 // Fast path: Implies is often empty.
725 if (!Implies.any())
726 return;
727 FeatureBitset Prev;
728 Bits |= Implies;
729 do {
730 Prev = Bits;
731 for (unsigned i = CPU_FEATURE_MAX; i;)
732 if (Bits[--i])
733 Bits |= FeatureInfos[i].ImpliedFeatures;
734 } while (Prev != Bits);
735}
736
737/// Create bit vector of features that are implied disabled if the feature
738/// passed in Value is disabled.
739static void getImpliedDisabledFeatures(FeatureBitset &Bits, unsigned Value) {
740 // Check all features looking for any dependent on this feature. If we find
741 // one, mark it and recursively find any feature that depend on it.
742 FeatureBitset Prev;
743 Bits.set(Value);
744 do {
745 Prev = Bits;
746 for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)
747 if ((FeatureInfos[i].ImpliedFeatures & Bits).any())
748 Bits.set(i);
749 } while (Prev != Bits);
750}
751
753 StringRef Feature, bool Enabled,
754 StringMap<bool> &Features) {
755 auto I = llvm::find_if(FeatureInfos, [&](const FeatureInfo &FI) {
756 return FI.getName() == Feature;
757 });
758 if (I == std::end(FeatureInfos)) {
759 // FIXME: This shouldn't happen, but may not have all features in the table
760 // yet.
761 return;
762 }
763
764 FeatureBitset ImpliedBits;
765 if (Enabled)
766 getImpliedEnabledFeatures(ImpliedBits, I->ImpliedFeatures);
767 else
768 getImpliedDisabledFeatures(ImpliedBits,
769 std::distance(std::begin(FeatureInfos), I));
770
771 // Update the map entry for all implied features.
772 for (unsigned i = 0; i != CPU_FEATURE_MAX; ++i)
773 if (ImpliedBits[i] && !FeatureInfos[i].getName().empty())
774 Features[FeatureInfos[i].getName()] = Enabled;
775}
776
779 [&](const ProcInfo &P) { return P.Name == CPU; });
780 assert(I != std::end(Processors) && "Processor not found!");
781 assert(I->Mangling != '\0' && "Processor dooesn't support function multiversion!");
782 return I->Mangling;
783}
784
787 [&](const ProcInfo &P) { return P.Name == Name; });
788 return I != std::end(Processors);
789}
790
791std::array<uint32_t, 4>
793 // Processor features and mapping to processor feature value.
794 std::array<uint32_t, 4> FeatureMask{};
795 for (StringRef FeatureStr : FeatureStrs) {
796 unsigned Feature = StringSwitch<unsigned>(FeatureStr)
797#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) .Case(STR, ABI_VALUE)
798#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY, ABI_VALUE) \
799 .Case(STR, ABI_VALUE)
800#include "llvm/TargetParser/X86TargetParser.def"
801 ;
802 assert(Feature / 32 < FeatureMask.size());
803 FeatureMask[Feature / 32] |= 1U << (Feature % 32);
804 }
805 return FeatureMask;
806}
807
809#ifndef NDEBUG
810 // Check that priorities are set properly in the .def file. We expect that
811 // "compat" features are assigned non-duplicate consecutive priorities
812 // starting from one (1, ..., MAX_PRIORITY) and multiple zeros.
813#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) PRIORITY,
814 unsigned Priorities[] = {
815#include "llvm/TargetParser/X86TargetParser.def"
816 };
817 std::array<unsigned, std::size(Priorities)> HelperList;
818 std::iota(HelperList.begin(), HelperList.begin() + MAX_PRIORITY + 1, 0);
819 for (size_t i = MAX_PRIORITY + 1; i != std::size(Priorities); ++i)
820 HelperList[i] = 0;
821 assert(std::is_permutation(HelperList.begin(), HelperList.end(),
822 std::begin(Priorities), std::end(Priorities)) &&
823 "Priorities don't form consecutive range!");
824#endif
825
826 switch (Feat) {
827#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) \
828 case X86::FEATURE_##ENUM: \
829 return PRIORITY;
830#include "llvm/TargetParser/X86TargetParser.def"
831 default:
832 llvm_unreachable("No Feature Priority for non-CPUSupports Features");
833 }
834}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define I(x, y, z)
Definition MD5.cpp:57
#define P(N)
static StringRef getName(Value *V)
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
constexpr FeatureBitset FeaturesClearwaterforest
constexpr FeatureBitset FeaturesX86_64
constexpr FeatureBitset ImpliedFeaturesLVI_LOAD_HARDENING
constexpr FeatureBitset FeaturesWestmere
constexpr FeatureBitset ImpliedFeaturesNDD
constexpr FeatureBitset ImpliedFeaturesXSAVEOPT
constexpr FeatureBitset FeaturesAthlon
constexpr FeatureBitset ImpliedFeaturesAMX_COMPLEX
constexpr FeatureBitset ImpliedFeaturesAVX5124VNNIW
constexpr FeatureBitset ImpliedFeaturesPOPCNT
constexpr FeatureBitset ImpliedFeaturesAVX512CD
constexpr FeatureBitset FeaturesC86_4G_M4
constexpr FeatureBitset ImpliedFeaturesSSE4_1
constexpr FeatureBitset FeaturesZNVER2
constexpr FeatureBitset ImpliedFeaturesAPXF
constexpr FeatureBitset FeaturesBDVER3
constexpr FeatureBitset ImpliedFeaturesBMI2
constexpr FeatureBitset FeaturesGeode
constexpr FeatureBitset ImpliedFeaturesLWP
constexpr FeatureBitset ImpliedFeaturesPREFETCHI
constexpr FeatureBitset ImpliedFeaturesAVX512FP16
constexpr FeatureBitset FeaturesCascadeLake
constexpr FeatureBitset ImpliedFeaturesCLDEMOTE
constexpr FeatureBitset FeaturesK8SSE3
constexpr FeatureBitset FeaturesZNVER1
constexpr FeatureBitset FeaturesNocona
constexpr FeatureBitset ImpliedFeaturesEVEX512
constexpr FeatureBitset ImpliedFeaturesSSE4_A
constexpr FeatureBitset FeaturesPrescott
constexpr FeatureBitset FeaturesCooperLake
constexpr FeatureBitset ImpliedFeaturesEGPR
constexpr FeatureBitset ImpliedFeaturesFXSR
constexpr FeatureBitset FeaturesSapphireRapids
constexpr FeatureBitset ImpliedFeaturesAVX512DQ
constexpr FeatureBitset ImpliedFeaturesSERIALIZE
constexpr FeatureBitset ImpliedFeaturesVPCLMULQDQ
constexpr FeatureBitset ImpliedFeaturesWBNOINVD
constexpr FeatureBitset ImpliedFeaturesAES
constexpr FeatureBitset FeaturesTremont
constexpr FeatureBitset ImpliedFeaturesPush2Pop2
constexpr FeatureBitset FeaturesBDVER1
constexpr FeatureBitset ImpliedFeaturesWAITPKG
constexpr FeatureBitset ImpliedFeaturesCRC32
static constexpr FeatureBitset FeaturesZNVER3
constexpr FeatureBitset FeaturesGoldmontPlus
constexpr FeatureBitset ImpliedFeaturesRDPID
constexpr FeatureBitset ImpliedFeaturesPRFCHW
constexpr FeatureBitset FeaturesCannonlake
constexpr FeatureBitset ImpliedFeaturesX87
constexpr FeatureBitset ImpliedFeaturesAVX512VPOPCNTDQ
constexpr FeatureBitset ImpliedFeaturesVAES
constexpr FeatureBitset FeaturesSandyBridge
constexpr FeatureBitset ImpliedFeaturesAMX_INT8
constexpr FeatureBitset ImpliedFeaturesJMPABS
constexpr FeatureBitset ImpliedFeaturesAVX512BF16
constexpr FeatureBitset ImpliedFeaturesRDPRU
constexpr FeatureBitset FeaturesAMDFAM10
constexpr FeatureBitset ImpliedFeaturesAMX_TILE
constexpr FeatureBitset FeaturesSkylakeServer
constexpr FeatureBitset FeaturesPentiumMMX
constexpr FeatureBitset ImpliedFeaturesCLWB
constexpr FeatureBitset ImpliedFeaturesAVX512IFMA
constexpr FeatureBitset FeaturesKNL
constexpr FeatureBitset FeaturesNehalem
constexpr FeatureBitset FeaturesBTVER1
constexpr FeatureBitset FeaturesPentium3
constexpr FeatureBitset ImpliedFeaturesTBM
constexpr FeatureBitset ImpliedFeaturesAVXNECONVERT
constexpr FeatureBitset FeaturesAthlonXP
constexpr FeatureBitset FeaturesGraniteRapids
constexpr FeatureBitset ImpliedFeaturesFSGSBASE
constexpr FeatureBitset FeaturesPantherlake
constexpr FeatureBitset ImpliedFeaturesPCONFIG
constexpr FeatureBitset ImpliedFeaturesAVX
constexpr FeatureBitset FeaturesX86_64_V3
constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_BRANCHES
constexpr FeatureBitset ImpliedFeaturesAVX512VBMI2
constexpr FeatureBitset ImpliedFeaturesCMPCCXADD
constexpr FeatureBitset ImpliedFeaturesCLFLUSHOPT
constexpr FeatureBitset ImpliedFeaturesAVX5124FMAPS
constexpr FeatureBitset FeaturesDiamondRapids
constexpr FeatureBitset ImpliedFeaturesF16C
constexpr FeatureBitset ImpliedFeaturesAVX10_2
constexpr FeatureBitset ImpliedFeaturesXSAVE
constexpr FeatureBitset FeaturesX86_64_V2
constexpr FeatureBitset FeaturesArrowlakeS
constexpr FeatureBitset ImpliedFeaturesMOVBE
constexpr FeatureBitset FeaturesIvyBridge
constexpr FeatureBitset FeaturesHaswell
static constexpr FeatureBitset FeaturesZNVER5
constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_CALLS
constexpr FeatureBitset ImpliedFeaturesSSSE3
constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT8
constexpr FeatureBitset ImpliedFeaturesCCMP
constexpr FeatureBitset FeaturesICLClient
constexpr FeatureBitset ImpliedFeaturesCF
static void getImpliedDisabledFeatures(FeatureBitset &Bits, unsigned Value)
Create bit vector of features that are implied disabled if the feature passed in Value is disabled.
constexpr FeatureBitset ImpliedFeaturesHRESET
constexpr const char * NoTuneList[]
constexpr FeatureBitset ImpliedFeaturesUINTR
constexpr FeatureBitset ImpliedFeaturesCMOV
constexpr FeatureBitset ImpliedFeaturesAVX512BITALG
constexpr FeatureBitset ImpliedFeaturesRTM
constexpr FeatureBitset FeaturesRocketlake
constexpr FeatureBitset ImpliedFeaturesMOVDIRI
constexpr FeatureBitset ImpliedFeaturesMWAITX
constexpr FeatureBitset ImpliedFeaturesSSE3
constexpr FeatureBitset ImpliedFeaturesVZEROUPPER
constexpr FeatureBitset FeaturesBTVER2
constexpr FeatureBitset FeaturesSkylakeClient
constexpr FeatureBitset ImpliedFeaturesPPX
static void getImpliedEnabledFeatures(FeatureBitset &Bits, const FeatureBitset &Implies)
constexpr FeatureBitset FeaturesPentium2
constexpr FeatureBitset ImpliedFeaturesSHSTK
constexpr FeatureBitset ImpliedFeaturesAMX_FP16
constexpr FeatureBitset ImpliedFeaturesMMX
constexpr FeatureBitset FeaturesICLServer
static constexpr FeatureBitset FeaturesZNVER6
constexpr FeatureBitset ImpliedFeaturesRETPOLINE_EXTERNAL_THUNK
constexpr FeatureBitset ImpliedFeaturesAMX_BF16
constexpr FeatureBitset FeaturesBroadwell
constexpr ProcInfo Processors[]
constexpr FeatureBitset ImpliedFeaturesAMX_AVX512
constexpr FeatureBitset ImpliedFeaturesCLZERO
constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT16
constexpr FeatureBitset ImpliedFeaturesMOVRS
constexpr FeatureBitset ImpliedFeaturesFMA4
constexpr FeatureBitset ImpliedFeaturesFMA
constexpr FeatureBitset FeaturesSierraforest
constexpr FeatureBitset FeaturesK6
constexpr FeatureBitset ImpliedFeaturesRAOINT
constexpr FeatureBitset FeaturesX86_64_V4
constexpr FeatureBitset FeaturesNovalake
constexpr FeatureBitset ImpliedFeaturesLVI_CFI
constexpr FeatureBitset ImpliedFeaturesCMPXCHG16B
constexpr FeatureBitset ImpliedFeaturesSSE2
constexpr FeatureBitset FeaturesBonnell
constexpr FeatureBitset FeaturesPenryn
constexpr FeatureBitset ImpliedFeaturesKL
constexpr FeatureBitset ImpliedFeaturesBMI
constexpr FeatureBitset ImpliedFeaturesGFNI
constexpr FeatureBitset ImpliedFeatures64BIT
constexpr FeatureBitset FeaturesK8
constexpr FeatureBitset ImpliedFeaturesAVX512VP2INTERSECT
constexpr FeatureBitset ImpliedFeaturesSM4
constexpr FeatureBitset ImpliedFeaturesENQCMD
constexpr FeatureBitset ImpliedFeaturesAVXVNNI
static constexpr FeatureBitset FeaturesC86_4G_M6
constexpr FeatureBitset ImpliedFeaturesPKU
constexpr FeatureBitset ImpliedFeaturesTSXLDTRK
constexpr FeatureBitset ImpliedFeaturesPTWRITE
constexpr FeatureBitset FeaturesPentium4
constexpr FeatureBitset ImpliedFeaturesXSAVES
constexpr FeatureBitset ImpliedFeaturesAVX512VNNI
constexpr FeatureBitset ImpliedFeaturesAVX512BW
constexpr FeatureBitset ImpliedFeaturesSGX
constexpr FeatureBitset ImpliedFeaturesSSE4_2
constexpr FeatureBitset ImpliedFeaturesAVX512VBMI
constexpr FeatureBitset FeaturesAlderlake
constexpr FeatureBitset ImpliedFeaturesSHA512
constexpr FeatureBitset ImpliedFeaturesAMX_MOVRS
constexpr FeatureBitset ImpliedFeaturesAVXIFMA
constexpr FeatureBitset ImpliedFeaturesAMX_TF32
constexpr FeatureBitset ImpliedFeaturesPCLMUL
constexpr FeatureBitset ImpliedFeaturesXSAVEC
constexpr FeatureBitset FeaturesBDVER2
constexpr FeatureBitset ImpliedFeaturesSSE
constexpr FeatureBitset ImpliedFeaturesNF
constexpr FeatureBitset FeaturesKNM
constexpr FeatureBitset ImpliedFeaturesSAHF
constexpr FeatureBitset ImpliedFeaturesLZCNT
constexpr FeatureBitset ImpliedFeaturesMOVDIR64B
constexpr FeatureBitset ImpliedFeaturesCMPXCHG8B
constexpr FeatureInfo FeatureInfos[]
constexpr FeatureBitset FeaturesGoldmont
constexpr FeatureBitset ImpliedFeaturesAVX2
constexpr FeatureBitset FeaturesBDVER4
constexpr FeatureBitset ImpliedFeaturesAVX512VL
constexpr FeatureBitset FeaturesSilvermont
constexpr FeatureBitset ImpliedFeaturesAMX_FP8
constexpr FeatureBitset FeaturesCore2
constexpr FeatureBitset ImpliedFeaturesXOP
constexpr FeatureBitset ImpliedFeaturesINVPCID
static constexpr FeatureBitset FeaturesC86_4G_M7
constexpr FeatureBitset ImpliedFeaturesRDSEED
constexpr FeatureBitset ImpliedFeaturesAVX512F
constexpr FeatureBitset ImpliedFeaturesSM3
constexpr FeatureBitset ImpliedFeaturesWIDEKL
constexpr FeatureBitset ImpliedFeaturesADX
constexpr FeatureBitset FeaturesArrowlake
static constexpr FeatureBitset FeaturesZNVER4
constexpr FeatureBitset ImpliedFeaturesSHA
constexpr FeatureBitset ImpliedFeaturesUSERMSR
constexpr FeatureBitset FeaturesTigerlake
constexpr FeatureBitset ImpliedFeaturesAVX10_1
constexpr FeatureBitset ImpliedFeaturesRDRND
constexpr FeatureBitset ImpliedFeaturesZU
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This is a constexpr reimplementation of a subset of std::bitset.
Definition Bitset.h:29
Container class for subtarget features.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:128
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A switch()-like statement whose cases are string literals.
LLVM Value Representation.
Definition Value.h:75
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Define some predicates that are used for node matching.
LLVM_ABI std::array< uint32_t, 4 > getCpuSupportsMask(ArrayRef< StringRef > FeatureStrs)
LLVM_ABI char getCPUDispatchMangling(StringRef Name)
LLVM_ABI CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit=false)
LLVM_ABI void updateImpliedFeatures(StringRef Feature, bool Enabled, StringMap< bool > &Features)
Set or clear entries in Features that are implied to be enabled/disabled by the provided Feature.
LLVM_ABI CPUKind parseArchX86(StringRef CPU, bool Only64Bit=false)
Parse CPU string into a CPUKind.
LLVM_ABI void fillValidTuneCPUList(SmallVectorImpl< StringRef > &Values, bool Only64Bit=false)
Provide a list of valid -mtune names.
LLVM_ABI void getFeaturesForCPU(StringRef CPU, SmallVectorImpl< StringRef > &Features, bool NeedPlus=false)
Fill in the features that CPU supports into Features.
LLVM_ABI unsigned getFeaturePriority(ProcessorFeatures Feat)
LLVM_ABI void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values, bool Only64Bit=false)
Provide a list of valid CPU names.
LLVM_ABI bool validateCPUSpecificCPUDispatch(StringRef Name)
LLVM_ABI ProcessorFeatures getKeyFeature(CPUKind Kind)
Get the key feature prioritizing target multiversioning.
This is an optimization pass for GlobalISel generic memory operations.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1771
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1946
@ Enabled
Convert any .debug_str_offsets tables to DWARF64 if needed.
Definition DWP.h:31