LLVM 19.0.0git
AArch64TargetParser.h
Go to the documentation of this file.
1//===-- AArch64TargetParser - Parser for AArch64 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 AArch64 hardware features
10// such as FPU/CPU/ARCH and extension names.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
15#define LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/Bitset.h"
19#include "llvm/ADT/StringMap.h"
20#include "llvm/ADT/StringRef.h"
22#include <array>
23#include <vector>
24
25namespace llvm {
26
27class Triple;
28
29namespace AArch64 {
30
31struct ArchInfo;
32struct CpuInfo;
33
34// Function Multi Versioning CPU features. They must be kept in sync with
35// compiler-rt enum CPUFeatures in lib/builtins/cpu_model/aarch64.c with
36// FEAT_MAX as sentinel.
102
103static_assert(FEAT_MAX < 62,
104 "Number of features in CPUFeatures are limited to 62 entries");
105
106// Each ArchExtKind correponds directly to a possible -target-feature.
107enum ArchExtKind : unsigned {
109#define ARM_EXTENSION(NAME, ENUM) ENUM,
110#include "llvm/TargetParser/AArch64TargetParserDef.inc"
112
113 // FIXME temporary fixes for inconsistent naming.
114 AEK_F32MM = AEK_MATMULFP32,
115 AEK_F64MM = AEK_MATMULFP64,
116 AEK_FCMA = AEK_COMPLXNUM,
117 AEK_FP = AEK_FPARMV8,
118 AEK_FP16 = AEK_FULLFP16,
119 AEK_I8MM = AEK_MATMULINT8,
120 AEK_JSCVT = AEK_JS,
121 AEK_PROFILE = AEK_SPE,
122 AEK_RASv2 = AEK_RASV2,
123 AEK_RAND = AEK_RANDGEN,
124 AEK_SIMD = AEK_NEON,
125 AEK_SME2p1 = AEK_SME2P1,
126 AEK_SVE2p1 = AEK_SVE2P1,
127 AEK_SME_LUTv2 = AEK_SME_LUTV2,
128
129};
131
132// Represents an extension that can be enabled with -march=<arch>+<extension>.
133// Typically these correspond to Arm Architecture extensions, unlike
134// SubtargetFeature which may represent either an actual extension or some
135// internal LLVM property.
137 StringRef Name; // Human readable name, e.g. "profile".
138 ArchExtKind ID; // Corresponding to the ArchExtKind, this
139 // extensions representation in the bitfield.
140 StringRef Feature; // -mattr enable string, e.g. "+spe"
141 StringRef NegFeature; // -mattr disable string, e.g. "-spe"
142 CPUFeatures CPUFeature; // Function Multi Versioning (FMV) bitfield value
143 // set in __aarch64_cpu_features
144 StringRef DependentFeatures; // FMV enabled features string,
145 // e.g. "+dotprod,+fp-armv8,+neon"
146 unsigned FmvPriority; // FMV feature priority
147 static constexpr unsigned MaxFMVPriority =
148 1000; // Maximum priority for FMV feature
149};
150
151// NOTE: If adding a new extension here, consider adding it to ExtensionMap
152// in AArch64AsmParser too, if supported as an extension name by binutils.
153// clang-format off
154inline constexpr ExtensionInfo Extensions[] = {
155 {"aes", AArch64::AEK_AES, "+aes", "-aes", FEAT_AES, "+fp-armv8,+neon", 150},
156 {"b16b16", AArch64::AEK_B16B16, "+b16b16", "-b16b16", FEAT_INIT, "", 0},
157 {"bf16", AArch64::AEK_BF16, "+bf16", "-bf16", FEAT_BF16, "+bf16", 280},
158 {"brbe", AArch64::AEK_BRBE, "+brbe", "-brbe", FEAT_INIT, "", 0},
159 {"bti", AArch64::AEK_NONE, {}, {}, FEAT_BTI, "+bti", 510},
160 {"crc", AArch64::AEK_CRC, "+crc", "-crc", FEAT_CRC, "+crc", 110},
161 {"crypto", AArch64::AEK_CRYPTO, "+crypto", "-crypto", FEAT_INIT, "+aes,+sha2", 0},
162 {"cssc", AArch64::AEK_CSSC, "+cssc", "-cssc", FEAT_INIT, "", 0},
163 {"d128", AArch64::AEK_D128, "+d128", "-d128", FEAT_INIT, "", 0},
164 {"dgh", AArch64::AEK_NONE, {}, {}, FEAT_DGH, "", 260},
165 {"dit", AArch64::AEK_NONE, {}, {}, FEAT_DIT, "+dit", 180},
166 {"dotprod", AArch64::AEK_DOTPROD, "+dotprod", "-dotprod", FEAT_DOTPROD, "+dotprod,+fp-armv8,+neon", 104},
167 {"dpb", AArch64::AEK_NONE, {}, {}, FEAT_DPB, "+ccpp", 190},
168 {"dpb2", AArch64::AEK_NONE, {}, {}, FEAT_DPB2, "+ccpp,+ccdp", 200},
169 {"ebf16", AArch64::AEK_NONE, {}, {}, FEAT_EBF16, "+bf16", 290},
170 {"f32mm", AArch64::AEK_F32MM, "+f32mm", "-f32mm", FEAT_SVE_F32MM, "+sve,+f32mm,+fullfp16,+fp-armv8,+neon", 350},
171 {"f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64mm", FEAT_SVE_F64MM, "+sve,+f64mm,+fullfp16,+fp-armv8,+neon", 360},
172 {"fcma", AArch64::AEK_FCMA, "+complxnum", "-complxnum", FEAT_FCMA, "+fp-armv8,+neon,+complxnum", 220},
173 {"flagm", AArch64::AEK_FLAGM, "+flagm", "-flagm", FEAT_FLAGM, "+flagm", 20},
174 {"flagm2", AArch64::AEK_NONE, {}, {}, FEAT_FLAGM2, "+flagm,+altnzcv", 30},
175 {"fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8", FEAT_FP, "+fp-armv8,+neon", 90},
176 {"fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16", FEAT_FP16, "+fullfp16,+fp-armv8,+neon", 170},
177 {"fp16fml", AArch64::AEK_FP16FML, "+fp16fml", "-fp16fml", FEAT_FP16FML, "+fp16fml,+fullfp16,+fp-armv8,+neon", 175},
178 {"frintts", AArch64::AEK_NONE, {}, {}, FEAT_FRINTTS, "+fptoint", 250},
179 {"hbc", AArch64::AEK_HBC, "+hbc", "-hbc", FEAT_INIT, "", 0},
180 {"i8mm", AArch64::AEK_I8MM, "+i8mm", "-i8mm", FEAT_I8MM, "+i8mm", 270},
181 {"ite", AArch64::AEK_ITE, "+ite", "-ite", FEAT_INIT, "", 0},
182 {"jscvt", AArch64::AEK_JSCVT, "+jsconv", "-jsconv", FEAT_JSCVT, "+fp-armv8,+neon,+jsconv", 210},
183 {"ls64_accdata", AArch64::AEK_NONE, {}, {}, FEAT_LS64_ACCDATA, "+ls64", 540},
184 {"ls64_v", AArch64::AEK_NONE, {}, {}, FEAT_LS64_V, "", 530},
185 {"ls64", AArch64::AEK_LS64, "+ls64", "-ls64", FEAT_LS64, "", 520},
186 {"lse", AArch64::AEK_LSE, "+lse", "-lse", FEAT_LSE, "+lse", 80},
187 {"lse128", AArch64::AEK_LSE128, "+lse128", "-lse128", FEAT_INIT, "", 0},
188 {"memtag", AArch64::AEK_MTE, "+mte", "-mte", FEAT_MEMTAG, "", 440},
189 {"memtag2", AArch64::AEK_NONE, {}, {}, FEAT_MEMTAG2, "+mte", 450},
190 {"memtag3", AArch64::AEK_NONE, {}, {}, FEAT_MEMTAG3, "+mte", 460},
191 {"mops", AArch64::AEK_MOPS, "+mops", "-mops", FEAT_MOPS, "+mops", 650},
192 {"pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth", FEAT_INIT, "", 0},
193 {"pmull", AArch64::AEK_NONE, {}, {}, FEAT_PMULL, "+aes,+fp-armv8,+neon", 160},
194 {"pmuv3", AArch64::AEK_PERFMON, "+perfmon", "-perfmon", FEAT_INIT, "", 0},
195 {"predres", AArch64::AEK_PREDRES, "+predres", "-predres", FEAT_PREDRES, "+predres", 480},
196 {"predres2", AArch64::AEK_SPECRES2, "+specres2", "-specres2", FEAT_INIT, "", 0},
197 {"profile", AArch64::AEK_PROFILE, "+spe", "-spe", FEAT_INIT, "", 0},
198 {"ras", AArch64::AEK_RAS, "+ras", "-ras", FEAT_INIT, "", 0},
199 {"rasv2", AArch64::AEK_RASv2, "+rasv2", "-rasv2", FEAT_INIT, "", 0},
200 {"rcpc", AArch64::AEK_RCPC, "+rcpc", "-rcpc", FEAT_RCPC, "+rcpc", 230},
201 {"rcpc2", AArch64::AEK_NONE, {}, {}, FEAT_RCPC2, "+rcpc", 240},
202 {"rcpc3", AArch64::AEK_RCPC3, "+rcpc3", "-rcpc3", FEAT_RCPC3, "+rcpc,+rcpc3", 241},
203 {"rdm", AArch64::AEK_RDM, "+rdm", "-rdm", FEAT_RDM, "+rdm,+fp-armv8,+neon", 108},
204 {"rng", AArch64::AEK_RAND, "+rand", "-rand", FEAT_RNG, "+rand", 10},
205 {"rpres", AArch64::AEK_NONE, {}, {}, FEAT_RPRES, "", 300},
206 {"sb", AArch64::AEK_SB, "+sb", "-sb", FEAT_SB, "+sb", 470},
207 {"sha1", AArch64::AEK_NONE, {}, {}, FEAT_SHA1, "+fp-armv8,+neon", 120},
208 {"sha2", AArch64::AEK_SHA2, "+sha2", "-sha2", FEAT_SHA2, "+sha2,+fp-armv8,+neon", 130},
209 {"sha3", AArch64::AEK_SHA3, "+sha3", "-sha3", FEAT_SHA3, "+sha3,+sha2,+fp-armv8,+neon", 140},
210 {"simd", AArch64::AEK_SIMD, "+neon", "-neon", FEAT_SIMD, "+fp-armv8,+neon", 100},
211 {"sm4", AArch64::AEK_SM4, "+sm4", "-sm4", FEAT_SM4, "+sm4,+fp-armv8,+neon", 106},
212 {"sme-f16f16", AArch64::AEK_SMEF16F16, "+sme-f16f16", "-sme-f16f16", FEAT_INIT, "+sme2,+sme-f16f16", 0},
213 {"sme-f64f64", AArch64::AEK_SMEF64F64, "+sme-f64f64", "-sme-f64f64", FEAT_SME_F64, "+sme,+sme-f64f64,+bf16", 560},
214 {"sme-i16i64", AArch64::AEK_SMEI16I64, "+sme-i16i64", "-sme-i16i64", FEAT_SME_I64, "+sme,+sme-i16i64,+bf16", 570},
215 {"sme", AArch64::AEK_SME, "+sme", "-sme", FEAT_SME, "+sme,+bf16", 430},
216 {"sme2", AArch64::AEK_SME2, "+sme2", "-sme2", FEAT_SME2, "+sme2,+sme,+bf16", 580},
217 {"sme2p1", AArch64::AEK_SME2p1, "+sme2p1", "-sme2p1", FEAT_INIT, "+sme2p1,+sme2,+sme,+bf16", 0},
218 {"ssbs", AArch64::AEK_SSBS, "+ssbs", "-ssbs", FEAT_SSBS, "", 490},
219 {"ssbs2", AArch64::AEK_NONE, {}, {}, FEAT_SSBS2, "+ssbs", 500},
220 {"sve-bf16", AArch64::AEK_NONE, {}, {}, FEAT_SVE_BF16, "+sve,+bf16,+fullfp16,+fp-armv8,+neon", 320},
221 {"sve-ebf16", AArch64::AEK_NONE, {}, {}, FEAT_SVE_EBF16, "+sve,+bf16,+fullfp16,+fp-armv8,+neon", 330},
222 {"sve-i8mm", AArch64::AEK_NONE, {}, {}, FEAT_SVE_I8MM, "+sve,+i8mm,+fullfp16,+fp-armv8,+neon", 340},
223 {"sve", AArch64::AEK_SVE, "+sve", "-sve", FEAT_SVE, "+sve,+fullfp16,+fp-armv8,+neon", 310},
224 {"sve2-aes", AArch64::AEK_SVE2AES, "+sve2-aes", "-sve2-aes", FEAT_SVE_AES, "+sve2,+sve,+sve2-aes,+fullfp16,+fp-armv8,+neon", 380},
225 {"sve2-bitperm", AArch64::AEK_SVE2BITPERM, "+sve2-bitperm", "-sve2-bitperm", FEAT_SVE_BITPERM, "+sve2,+sve,+sve2-bitperm,+fullfp16,+fp-armv8,+neon", 400},
226 {"sve2-pmull128", AArch64::AEK_NONE, {}, {}, FEAT_SVE_PMULL128, "+sve2,+sve,+sve2-aes,+fullfp16,+fp-armv8,+neon", 390},
227 {"sve2-sha3", AArch64::AEK_SVE2SHA3, "+sve2-sha3", "-sve2-sha3", FEAT_SVE_SHA3, "+sve2,+sve,+sve2-sha3,+fullfp16,+fp-armv8,+neon", 410},
228 {"sve2-sm4", AArch64::AEK_SVE2SM4, "+sve2-sm4", "-sve2-sm4", FEAT_SVE_SM4, "+sve2,+sve,+sve2-sm4,+fullfp16,+fp-armv8,+neon", 420},
229 {"sve2", AArch64::AEK_SVE2, "+sve2", "-sve2", FEAT_SVE2, "+sve2,+sve,+fullfp16,+fp-armv8,+neon", 370},
230 {"sve2p1", AArch64::AEK_SVE2p1, "+sve2p1", "-sve2p1", FEAT_INIT, "+sve2p1,+sve2,+sve,+fullfp16,+fp-armv8,+neon", 0},
231 {"the", AArch64::AEK_THE, "+the", "-the", FEAT_INIT, "", 0},
232 {"tme", AArch64::AEK_TME, "+tme", "-tme", FEAT_INIT, "", 0},
233 {"wfxt", AArch64::AEK_NONE, {}, {}, FEAT_WFXT, "+wfxt", 550},
234 {"gcs", AArch64::AEK_GCS, "+gcs", "-gcs", FEAT_INIT, "", 0},
235 {"fpmr", AArch64::AEK_FPMR, "+fpmr", "-fpmr", FEAT_INIT, "", 0},
236 {"fp8", AArch64::AEK_FP8, "+fp8", "-fp8", FEAT_INIT, "+fpmr", 0},
237 {"faminmax", AArch64::AEK_FAMINMAX, "+faminmax", "-faminmax", FEAT_INIT, "", 0},
238 {"fp8fma", AArch64::AEK_FP8FMA, "+fp8fma", "-fp8fma", FEAT_INIT, "+fpmr", 0},
239 {"ssve-fp8fma", AArch64::AEK_SSVE_FP8FMA, "+ssve-fp8fma", "-ssve-fp8fma", FEAT_INIT, "+sme2", 0},
240 {"fp8dot2", AArch64::AEK_FP8DOT2, "+fp8dot2", "-fp8dot2", FEAT_INIT, "", 0},
241 {"ssve-fp8dot2", AArch64::AEK_SSVE_FP8DOT2, "+ssve-fp8dot2", "-ssve-fp8dot2", FEAT_INIT, "+sme2", 0},
242 {"fp8dot4", AArch64::AEK_FP8DOT4, "+fp8dot4", "-fp8dot4", FEAT_INIT, "", 0},
243 {"ssve-fp8dot4", AArch64::AEK_SSVE_FP8DOT4, "+ssve-fp8dot4", "-ssve-fp8dot4", FEAT_INIT, "+sme2", 0},
244 {"lut", AArch64::AEK_LUT, "+lut", "-lut", FEAT_INIT, "", 0},
245 {"sme-lutv2", AArch64::AEK_SME_LUTv2, "+sme-lutv2", "-sme-lutv2", FEAT_INIT, "", 0},
246 {"sme-f8f16", AArch64::AEK_SMEF8F16, "+sme-f8f16", "-sme-f8f16", FEAT_INIT, "+fp8,+sme2", 0},
247 {"sme-f8f32", AArch64::AEK_SMEF8F32, "+sme-f8f32", "-sme-f8f32", FEAT_INIT, "+sme2,+fp8", 0},
248 {"sme-fa64", AArch64::AEK_SMEFA64, "+sme-fa64", "-sme-fa64", FEAT_INIT, "", 0},
249 {"cpa", AArch64::AEK_CPA, "+cpa", "-cpa", FEAT_INIT, "", 0},
250 {"pauth-lr", AArch64::AEK_PAUTHLR, "+pauth-lr", "-pauth-lr", FEAT_INIT, "", 0},
251 {"tlbiw", AArch64::AEK_TLBIW, "+tlbiw", "-tlbiw", FEAT_INIT, "", 0},
252 // Special cases
254};
255// clang-format on
256
258 // Set of extensions which are currently enabled.
260 // Set of extensions which have been enabled or disabled at any point. Used
261 // to avoid cluttering the cc1 command-line with lots of unneeded features.
263 // Base architecture version, which we need to know because some feature
264 // dependencies change depending on this.
266
267 ExtensionSet() : Enabled(), Touched(), BaseArch(nullptr) {}
268
269 // Enable the given architecture extension, and any other extensions it
270 // depends on. Does not change the base architecture, or follow dependencies
271 // between features which are only related by required arcitecture versions.
272 void enable(ArchExtKind E);
273
274 // Disable the given architecture extension, and any other extensions which
275 // depend on it. Does not change the base architecture, or follow
276 // dependencies between features which are only related by required
277 // arcitecture versions.
278 void disable(ArchExtKind E);
279
280 // Add default extensions for the given CPU. Records the base architecture,
281 // to later resolve dependencies which depend on it.
282 void addCPUDefaults(const CpuInfo &CPU);
283
284 // Add default extensions for the given architecture version. Records the
285 // base architecture, to later resolve dependencies which depend on it.
286 void addArchDefaults(const ArchInfo &Arch);
287
288 // Add or remove a feature based on a modifier string. The string must be of
289 // the form "<name>" to enable a feature or "no<name>" to disable it. This
290 // will also enable or disable any features as required by the dependencies
291 // between them.
292 bool parseModifier(StringRef Modifier);
293
294 // Convert the set of enabled extension to an LLVM feature list, appending
295 // them to Features.
296 void toLLVMFeatureList(std::vector<StringRef> &Features) const;
297};
298
299// Represents a dependency between two architecture extensions. Later is the
300// feature which was added to the architecture after Earlier, and expands the
301// functionality provided by it. If Later is enabled, then Earlier will also be
302// enabled. If Earlier is disabled, then Later will also be disabled.
306};
307
308// clang-format off
309// Each entry here is a link in the dependency chain starting from the
310// extension that was added to the architecture first.
312 {AEK_FP, AEK_FP16},
313 {AEK_FP, AEK_SIMD},
314 {AEK_FP, AEK_JSCVT},
315 {AEK_FP, AEK_FP8},
316 {AEK_SIMD, AEK_CRYPTO},
317 {AEK_SIMD, AEK_AES},
318 {AEK_SIMD, AEK_SHA2},
319 {AEK_SIMD, AEK_SHA3},
320 {AEK_SIMD, AEK_SM4},
321 {AEK_SIMD, AEK_RDM},
322 {AEK_SIMD, AEK_DOTPROD},
324 {AEK_FP16, AEK_FP16FML},
325 {AEK_FP16, AEK_SVE},
326 {AEK_BF16, AEK_SME},
327 {AEK_BF16, AEK_B16B16},
328 {AEK_SVE, AEK_SVE2},
329 {AEK_SVE, AEK_F32MM},
330 {AEK_SVE, AEK_F64MM},
331 {AEK_SVE2, AEK_SVE2p1},
332 {AEK_SVE2, AEK_SVE2BITPERM},
333 {AEK_SVE2, AEK_SVE2AES},
334 {AEK_SVE2, AEK_SVE2SHA3},
335 {AEK_SVE2, AEK_SVE2SM4},
336 {AEK_SVE2, AEK_SMEFA64},
337 {AEK_SVE2, AEK_SMEFA64},
338 {AEK_SME, AEK_SME2},
339 {AEK_SME, AEK_SMEF16F16},
340 {AEK_SME, AEK_SMEF64F64},
341 {AEK_SME, AEK_SMEI16I64},
342 {AEK_SME, AEK_SMEFA64},
343 {AEK_SME2, AEK_SME2p1},
344 {AEK_SME2, AEK_SSVE_FP8FMA},
345 {AEK_SME2, AEK_SSVE_FP8DOT2},
346 {AEK_SME2, AEK_SSVE_FP8DOT4},
347 {AEK_SME2, AEK_SMEF8F16},
348 {AEK_SME2, AEK_SMEF8F32},
349 {AEK_FP8, AEK_SMEF8F16},
350 {AEK_FP8, AEK_SMEF8F32},
351 {AEK_LSE, AEK_LSE128},
352 {AEK_PREDRES, AEK_SPECRES2},
353 {AEK_RAS, AEK_RASv2},
354 {AEK_RCPC, AEK_RCPC3},
355};
356// clang-format on
357
358enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' };
359
360// Information about a specific architecture, e.g. V8.1-A
361struct ArchInfo {
362 VersionTuple Version; // Architecture version, major + minor.
363 ArchProfile Profile; // Architecuture profile
364 StringRef Name; // Human readable name, e.g. "armv8.1-a"
365 StringRef ArchFeature; // Command line feature flag, e.g. +v8a
367 DefaultExts; // bitfield of default extensions ArchExtKind
368
369 bool operator==(const ArchInfo &Other) const {
370 return this->Name == Other.Name;
371 }
372 bool operator!=(const ArchInfo &Other) const {
373 return this->Name != Other.Name;
374 }
375
376 // Defines the following partial order, indicating when an architecture is
377 // a superset of another:
378 //
379 // v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a;
380 // v v v v v
381 // v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a;
382 //
383 // v8r has no relation to anything. This is used to determine which
384 // features to enable for a given architecture. See
385 // AArch64TargetInfo::setFeatureEnabled.
386 bool implies(const ArchInfo &Other) const {
387 if (this->Profile != Other.Profile)
388 return false; // ARMV8R
389 if (this->Version.getMajor() == Other.Version.getMajor()) {
390 return this->Version > Other.Version;
391 }
392 if (this->Version.getMajor() == 9 && Other.Version.getMajor() == 8) {
393 assert(this->Version.getMinor() && Other.Version.getMinor() &&
394 "AArch64::ArchInfo should have a minor version.");
395 return this->Version.getMinor().value_or(0) + 5 >=
396 Other.Version.getMinor().value_or(0);
397 }
398 return false;
399 }
400
401 // True if this architecture is a superset of Other (including being equal to
402 // it).
403 bool is_superset(const ArchInfo &Other) const {
404 return (*this == Other) || implies(Other);
405 }
406
407 // Return ArchFeature without the leading "+".
408 StringRef getSubArch() const { return ArchFeature.substr(1); }
409
410 // Search for ArchInfo by SubArch name
411 static std::optional<ArchInfo> findBySubArch(StringRef SubArch);
412};
413
414// clang-format off
415inline constexpr ArchInfo ARMV8A = { VersionTuple{8, 0}, AProfile, "armv8-a", "+v8a", (
417inline constexpr ArchInfo ARMV8_1A = { VersionTuple{8, 1}, AProfile, "armv8.1-a", "+v8.1a", (ARMV8A.DefaultExts |
418 AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_LSE, AArch64::AEK_RDM}))};
419inline constexpr ArchInfo ARMV8_2A = { VersionTuple{8, 2}, AProfile, "armv8.2-a", "+v8.2a", (ARMV8_1A.DefaultExts |
420 AArch64::ExtensionBitset({AArch64::AEK_RAS}))};
421inline constexpr ArchInfo ARMV8_3A = { VersionTuple{8, 3}, AProfile, "armv8.3-a", "+v8.3a", (ARMV8_2A.DefaultExts |
422 AArch64::ExtensionBitset({AArch64::AEK_FCMA, AArch64::AEK_JSCVT, AArch64::AEK_PAUTH, AArch64::AEK_RCPC}))};
423inline constexpr ArchInfo ARMV8_4A = { VersionTuple{8, 4}, AProfile, "armv8.4-a", "+v8.4a", (ARMV8_3A.DefaultExts |
424 AArch64::ExtensionBitset({AArch64::AEK_DOTPROD}))};
425inline constexpr ArchInfo ARMV8_5A = { VersionTuple{8, 5}, AProfile, "armv8.5-a", "+v8.5a", (ARMV8_4A.DefaultExts)};
426inline constexpr ArchInfo ARMV8_6A = { VersionTuple{8, 6}, AProfile, "armv8.6-a", "+v8.6a", (ARMV8_5A.DefaultExts |
427 AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))};
428inline constexpr ArchInfo ARMV8_7A = { VersionTuple{8, 7}, AProfile, "armv8.7-a", "+v8.7a", (ARMV8_6A.DefaultExts)};
429inline constexpr ArchInfo ARMV8_8A = { VersionTuple{8, 8}, AProfile, "armv8.8-a", "+v8.8a", (ARMV8_7A.DefaultExts |
430 AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))};
431inline constexpr ArchInfo ARMV8_9A = { VersionTuple{8, 9}, AProfile, "armv8.9-a", "+v8.9a", (ARMV8_8A.DefaultExts |
432 AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASv2}))};
433inline constexpr ArchInfo ARMV9A = { VersionTuple{9, 0}, AProfile, "armv9-a", "+v9a", (ARMV8_5A.DefaultExts |
434 AArch64::ExtensionBitset({AArch64::AEK_FP16, AArch64::AEK_SVE, AArch64::AEK_SVE2}))};
435inline constexpr ArchInfo ARMV9_1A = { VersionTuple{9, 1}, AProfile, "armv9.1-a", "+v9.1a", (ARMV9A.DefaultExts |
436 AArch64::ExtensionBitset({AArch64::AEK_BF16, AArch64::AEK_I8MM}))};
437inline constexpr ArchInfo ARMV9_2A = { VersionTuple{9, 2}, AProfile, "armv9.2-a", "+v9.2a", (ARMV9_1A.DefaultExts)};
438inline constexpr ArchInfo ARMV9_3A = { VersionTuple{9, 3}, AProfile, "armv9.3-a", "+v9.3a", (ARMV9_2A.DefaultExts |
439 AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))};
440inline constexpr ArchInfo ARMV9_4A = { VersionTuple{9, 4}, AProfile, "armv9.4-a", "+v9.4a", (ARMV9_3A.DefaultExts |
441 AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASv2}))};
442inline constexpr ArchInfo ARMV9_5A = { VersionTuple{9, 5}, AProfile, "armv9.5-a", "+v9.5a", (ARMV9_4A.DefaultExts |
443 AArch64::ExtensionBitset({AArch64::AEK_CPA}))};
444// For v8-R, we do not enable crypto and align with GCC that enables a more minimal set of optional architecture extensions.
445inline constexpr ArchInfo ARMV8R = { VersionTuple{8, 0}, RProfile, "armv8-r", "+v8r", (ARMV8_5A.DefaultExts |
446 AArch64::ExtensionBitset({AArch64::AEK_SSBS,
447 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_SB}).flip(AArch64::AEK_LSE))};
448// clang-format on
449
450// The set of all architectures
451static constexpr std::array<const ArchInfo *, 17> ArchInfos = {
455};
456
457// Details of a specific CPU.
458struct CpuInfo {
459 StringRef Name; // Name, as written for -mcpu.
462 DefaultExtensions; // Default extensions for this CPU. These will be
463 // ORd with the architecture defaults.
464
466 AArch64::ExtensionBitset ImpliedExts;
467 ImpliedExts |= DefaultExtensions;
468 ImpliedExts |= Arch.DefaultExts;
469 return ImpliedExts;
470 }
471};
472
473inline constexpr CpuInfo CpuInfos[] = {
474 {"cortex-a34", ARMV8A,
476 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
477 {"cortex-a35", ARMV8A,
479 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
480 {"cortex-a53", ARMV8A,
482 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
483 {"cortex-a55", ARMV8_2A,
484 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
485 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
486 AArch64::AEK_RCPC})},
487 {"cortex-a510", ARMV9A,
489 {AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_SB,
490 AArch64::AEK_PAUTH, AArch64::AEK_MTE, AArch64::AEK_SSBS,
491 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
492 AArch64::AEK_FP16FML})},
493 {"cortex-a520", ARMV9_2A,
495 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
496 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
497 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
498 {"cortex-a520ae", ARMV9_2A,
500 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
501 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
502 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
503 {"cortex-a57", ARMV8A,
505 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
506 {"cortex-a65", ARMV8_2A,
507 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
508 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
509 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
510 {"cortex-a65ae", ARMV8_2A,
511 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
512 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
513 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
514 {"cortex-a72", ARMV8A,
516 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
517 {"cortex-a73", ARMV8A,
519 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
520 {"cortex-a75", ARMV8_2A,
521 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
522 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
523 AArch64::AEK_RCPC})},
524 {"cortex-a76", ARMV8_2A,
525 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
526 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
527 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
528 {"cortex-a76ae", ARMV8_2A,
529 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
530 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
531 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
532 {"cortex-a77", ARMV8_2A,
533 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
534 AArch64::AEK_FP16, AArch64::AEK_RCPC,
535 AArch64::AEK_DOTPROD, AArch64::AEK_SSBS})},
536 {"cortex-a78", ARMV8_2A,
537 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
538 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
539 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
541 {"cortex-a78ae", ARMV8_2A,
542 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
543 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
544 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
546 {"cortex-a78c", ARMV8_2A,
548 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
549 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
550 AArch64::AEK_PROFILE, AArch64::AEK_FLAGM, AArch64::AEK_PAUTH})},
551 {"cortex-a710", ARMV9A,
552 AArch64::ExtensionBitset({AArch64::AEK_MTE, AArch64::AEK_PAUTH,
553 AArch64::AEK_FLAGM, AArch64::AEK_SB,
554 AArch64::AEK_I8MM, AArch64::AEK_FP16FML,
555 AArch64::AEK_SVE, AArch64::AEK_SVE2,
556 AArch64::AEK_SVE2BITPERM, AArch64::AEK_BF16})},
557 {"cortex-a715", ARMV9A,
559 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
560 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
561 AArch64::AEK_I8MM, AArch64::AEK_PREDRES, AArch64::AEK_PERFMON,
562 AArch64::AEK_PROFILE, AArch64::AEK_SVE, AArch64::AEK_SVE2BITPERM,
563 AArch64::AEK_BF16, AArch64::AEK_FLAGM})},
564 {"cortex-a720", ARMV9_2A,
565 AArch64::ExtensionBitset({AArch64::AEK_SB, AArch64::AEK_SSBS,
566 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
567 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
568 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
569 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
570 {"cortex-a720ae", ARMV9_2A,
571 AArch64::ExtensionBitset({AArch64::AEK_SB, AArch64::AEK_SSBS,
572 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
573 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
574 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
575 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
576 {"cortex-r82", ARMV8R,
577 AArch64::ExtensionBitset({AArch64::AEK_LSE, AArch64::AEK_FLAGM,
578 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
579 {"cortex-r82ae", ARMV8R,
580 AArch64::ExtensionBitset({AArch64::AEK_LSE, AArch64::AEK_FLAGM,
581 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
582 {"cortex-x1", ARMV8_2A,
583 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
584 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
585 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
587 {"cortex-x1c", ARMV8_2A,
589 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
590 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
591 AArch64::AEK_PAUTH, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM})},
592 {"cortex-x2", ARMV9A,
594 {AArch64::AEK_MTE, AArch64::AEK_BF16, AArch64::AEK_I8MM,
595 AArch64::AEK_PAUTH, AArch64::AEK_SSBS, AArch64::AEK_SB,
596 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
597 AArch64::AEK_FP16FML, AArch64::AEK_FLAGM})},
598 {"cortex-x3", ARMV9A,
600 {AArch64::AEK_SVE, AArch64::AEK_PERFMON, AArch64::AEK_PROFILE,
601 AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_MTE,
602 AArch64::AEK_SVE2BITPERM, AArch64::AEK_SB, AArch64::AEK_PAUTH,
603 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PREDRES,
604 AArch64::AEK_FLAGM, AArch64::AEK_SSBS})},
605 {"cortex-x4", ARMV9_2A,
606 AArch64::ExtensionBitset({AArch64::AEK_SB, AArch64::AEK_SSBS,
607 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
608 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
609 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
610 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
611 {"neoverse-e1", ARMV8_2A,
612 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
613 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
614 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
615 {"neoverse-n1", ARMV8_2A,
616 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
617 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
618 AArch64::AEK_PROFILE, AArch64::AEK_RCPC,
619 AArch64::AEK_SSBS})},
620 {"neoverse-n2", ARMV9A,
622 {AArch64::AEK_BF16, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
623 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE,
624 AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_SVE,
625 AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM})},
626 {"neoverse-n3", ARMV9_2A,
627 AArch64::ExtensionBitset({AArch64::AEK_MTE, AArch64::AEK_SSBS,
628 AArch64::AEK_SB, AArch64::AEK_PREDRES,
629 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
630 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
631 AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
632 AArch64::AEK_PROFILE, AArch64::AEK_PERFMON})},
633 {"neoverse-512tvb", ARMV8_4A,
635 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
636 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
637 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
638 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
640 {"neoverse-v1", ARMV8_4A,
642 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
643 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
644 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
645 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
647 {"neoverse-v2", ARMV9A,
649 {AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SSBS,
650 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_RAND,
651 AArch64::AEK_DOTPROD, AArch64::AEK_PROFILE, AArch64::AEK_SVE2BITPERM,
652 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE})},
653 {"neoverse-v3", ARMV9_2A,
655 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
656 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
657 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
658 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
659 AArch64::AEK_FP16FML})},
660 {"neoverse-v3ae", ARMV9_2A,
662 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
663 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
664 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
665 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
666 AArch64::AEK_FP16FML}))},
667 {"cyclone", ARMV8A,
669 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
670 {"apple-a7", ARMV8A,
672 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
673 {"apple-a8", ARMV8A,
675 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
676 {"apple-a9", ARMV8A,
678 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
679 {"apple-a10", ARMV8A,
680 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
681 AArch64::AEK_CRC, AArch64::AEK_RDM})},
682 {"apple-a11", ARMV8_2A,
684 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
685 {"apple-a12", ARMV8_3A,
687 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
688 {"apple-a13", ARMV8_4A,
689 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
690 AArch64::AEK_SHA3, AArch64::AEK_FP16,
691 AArch64::AEK_FP16FML})},
692 {"apple-a14", ARMV8_5A,
693 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
694 AArch64::AEK_SHA3, AArch64::AEK_FP16,
695 AArch64::AEK_FP16FML})},
696 {"apple-a15", ARMV8_6A,
697 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
698 AArch64::AEK_SHA3, AArch64::AEK_FP16,
699 AArch64::AEK_FP16FML})},
700 {"apple-a16", ARMV8_6A,
701 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
702 AArch64::AEK_SHA3, AArch64::AEK_FP16,
703 AArch64::AEK_FP16FML})},
704 {"apple-a17", ARMV8_6A,
705 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
706 AArch64::AEK_SHA3, AArch64::AEK_FP16,
707 AArch64::AEK_FP16FML})},
708
709 {"apple-m1", ARMV8_5A,
710 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
711 AArch64::AEK_SHA3, AArch64::AEK_FP16,
712 AArch64::AEK_FP16FML})},
713 {"apple-m2", ARMV8_6A,
714 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
715 AArch64::AEK_SHA3, AArch64::AEK_FP16,
716 AArch64::AEK_FP16FML})},
717 {"apple-m3", ARMV8_6A,
718 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
719 AArch64::AEK_SHA3, AArch64::AEK_FP16,
720 AArch64::AEK_FP16FML})},
721
722 {"apple-s4", ARMV8_3A,
724 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
725 {"apple-s5", ARMV8_3A,
727 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
728 {"exynos-m3", ARMV8A,
730 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
731 {"exynos-m4", ARMV8_2A,
732 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
733 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
734 {"exynos-m5", ARMV8_2A,
735 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
736 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
737 {"falkor", ARMV8A,
738 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
739 AArch64::AEK_CRC, AArch64::AEK_RDM})},
740 {"saphira", ARMV8_3A,
742 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_PROFILE})},
743 {"kryo", ARMV8A,
745 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
746 {"thunderx2t99", ARMV8_1A,
747 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2})},
748 {"thunderx3t110", ARMV8_3A,
749 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2})},
750 {"thunderx", ARMV8A,
752 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
753 {"thunderxt88", ARMV8A,
755 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
756 {"thunderxt81", ARMV8A,
758 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
759 {"thunderxt83", ARMV8A,
761 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
762 {"tsv110", ARMV8_2A,
763 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
764 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
765 AArch64::AEK_FP16FML, AArch64::AEK_PROFILE,
767 {"a64fx", ARMV8_2A,
768 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
769 AArch64::AEK_FP16, AArch64::AEK_SVE})},
770 {"carmel", ARMV8_2A,
772 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
773 {"ampere1", ARMV8_6A,
774 AArch64::ExtensionBitset({AArch64::AEK_AES, AArch64::AEK_SHA2,
775 AArch64::AEK_SHA3, AArch64::AEK_FP16,
776 AArch64::AEK_SB, AArch64::AEK_SSBS,
778 {"ampere1a", ARMV8_6A,
780 {AArch64::AEK_FP16, AArch64::AEK_RAND, AArch64::AEK_SM4,
781 AArch64::AEK_SHA3, AArch64::AEK_SHA2, AArch64::AEK_AES,
782 AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS})},
783 {"ampere1b", ARMV8_7A,
785 AArch64::AEK_SM4, AArch64::AEK_SHA3,
786 AArch64::AEK_SHA2, AArch64::AEK_AES,
787 AArch64::AEK_MTE, AArch64::AEK_SB,
788 AArch64::AEK_SSBS, AArch64::AEK_CSSC})},
789};
790
791// Name alias.
792struct Alias {
795};
796
797inline constexpr Alias CpuAliases[] = {{"cobalt-100", "neoverse-n2"},
798 {"grace", "neoverse-v2"}};
799
800inline constexpr Alias ExtAliases[] = {{"rdma", "rdm"}};
801
804 std::vector<StringRef> &Features);
805
809
810// Information by Name
811const ArchInfo *getArchForCpu(StringRef CPU);
812
813// Parser
814const ArchInfo *parseArch(StringRef Arch);
815std::optional<ExtensionInfo> parseArchExtension(StringRef Extension);
816// Given the name of a CPU or alias, return the correponding CpuInfo.
817std::optional<CpuInfo> parseCpu(StringRef Name);
818// Used by target parser tests
820
821bool isX18ReservedByDefault(const Triple &TT);
822
823// For given feature names, return a bitmask corresponding to the entries of
824// AArch64::CPUFeatures. The values in CPUFeatures are not bitmasks
825// themselves, they are sequential (0, 1, 2, 3, ...).
827
829
830} // namespace AArch64
831} // namespace llvm
832
833#endif
This file defines the StringMap class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
std::string Name
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Defines the llvm::VersionTuple class, which represents a version in the form major[....
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition: StringMap.h:127
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition: StringRef.h:563
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:29
unsigned getMajor() const
Retrieve the major version number.
Definition: VersionTuple.h:71
std::optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
Definition: VersionTuple.h:74
void PrintSupportedExtensions(StringMap< StringRef > DescMap)
constexpr ArchInfo ARMV8_9A
bool isX18ReservedByDefault(const Triple &TT)
StringRef getArchExtFeature(StringRef ArchExt)
std::optional< ExtensionInfo > parseArchExtension(StringRef Extension)
constexpr ArchInfo ARMV8_3A
constexpr CpuInfo CpuInfos[]
constexpr ArchInfo ARMV8_7A
constexpr ArchInfo ARMV8R
std::optional< CpuInfo > parseCpu(StringRef Name)
constexpr ArchInfo ARMV8_4A
uint64_t getCpuSupportsMask(ArrayRef< StringRef > FeatureStrs)
constexpr ArchInfo ARMV9_3A
const ArchInfo * parseArch(StringRef Arch)
constexpr ArchInfo ARMV8_6A
constexpr ArchInfo ARMV8_5A
const ArchInfo * getArchForCpu(StringRef CPU)
constexpr ArchInfo ARMV8A
constexpr ArchInfo ARMV9_1A
constexpr ArchInfo ARMV9A
void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values)
constexpr ArchInfo ARMV9_2A
constexpr ArchInfo ARMV9_4A
StringRef resolveExtAlias(StringRef ArchExt)
constexpr ExtensionDependency ExtensionDependencies[]
constexpr ArchInfo ARMV9_5A
constexpr Alias CpuAliases[]
static constexpr std::array< const ArchInfo *, 17 > ArchInfos
constexpr Alias ExtAliases[]
StringRef resolveCPUAlias(StringRef CPU)
bool getExtensionFeatures(const AArch64::ExtensionBitset &Extensions, std::vector< StringRef > &Features)
constexpr ArchInfo ARMV8_8A
constexpr ArchInfo ARMV8_1A
constexpr ArchInfo ARMV8_2A
Bitset< AEK_NUM_EXTENSIONS > ExtensionBitset
constexpr ExtensionInfo Extensions[]
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Other
Any other memory.
bool is_superset(const ArchInfo &Other) const
StringRef getSubArch() const
bool implies(const ArchInfo &Other) const
AArch64::ExtensionBitset DefaultExts
static std::optional< ArchInfo > findBySubArch(StringRef SubArch)
bool operator==(const ArchInfo &Other) const
bool operator!=(const ArchInfo &Other) const
AArch64::ExtensionBitset getImpliedExtensions() const
AArch64::ExtensionBitset DefaultExtensions
static constexpr unsigned MaxFMVPriority
void addCPUDefaults(const CpuInfo &CPU)
void toLLVMFeatureList(std::vector< StringRef > &Features) const
bool parseModifier(StringRef Modifier)
void addArchDefaults(const ArchInfo &Arch)