14#ifndef LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
15#define LLVM_TARGETPARSER_AARCH64TARGETPARSER_H
104 "Number of features in CPUFeatures are limited to 62 entries");
107#define EMIT_ARCHEXTKIND_ENUM
108#include "llvm/TargetParser/AArch64TargetParserDef.inc"
132#define EMIT_EXTENSIONS
133#include "llvm/TargetParser/AArch64TargetParserDef.inc"
186#define EMIT_EXTENSION_DEPENDENCIES
187#include "llvm/TargetParser/AArch64TargetParserDef.inc"
201 return this->Name ==
Other.Name;
204 return this->Name !=
Other.Name;
218 if (this->Profile !=
Other.Profile)
221 return this->Version >
Other.Version;
223 if (this->Version.
getMajor() == 9 &&
Other.Version.getMajor() == 8) {
225 "AArch64::ArchInfo should have a minor version.");
226 return this->Version.
getMinor().value_or(0) + 5 >=
227 Other.Version.getMinor().value_or(0);
245#define EMIT_ARCHITECTURES
246#include "llvm/TargetParser/AArch64TargetParserDef.inc"
265 {
"cortex-a34", ARMV8A,
267 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
268 {
"cortex-a35", ARMV8A,
270 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
271 {
"cortex-a53", ARMV8A,
273 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
274 {
"cortex-a55", ARMV8_2A,
276 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
277 AArch64::AEK_RCPC})},
278 {
"cortex-a510", ARMV9A,
280 {AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_SB,
281 AArch64::AEK_PAUTH, AArch64::AEK_MTE, AArch64::AEK_SSBS,
282 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
283 AArch64::AEK_FP16FML})},
284 {
"cortex-a520", ARMV9_2A,
286 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
287 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
288 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
289 {
"cortex-a520ae", ARMV9_2A,
291 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
292 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
293 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
294 {
"cortex-a57", ARMV8A,
296 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
297 {
"cortex-a65", ARMV8_2A,
299 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
300 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
301 {
"cortex-a65ae", ARMV8_2A,
303 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
304 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
305 {
"cortex-a72", ARMV8A,
307 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
308 {
"cortex-a73", ARMV8A,
310 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
311 {
"cortex-a75", ARMV8_2A,
313 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
314 AArch64::AEK_RCPC})},
315 {
"cortex-a76", ARMV8_2A,
317 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
318 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
319 {
"cortex-a76ae", ARMV8_2A,
321 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
322 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
323 {
"cortex-a77", ARMV8_2A,
325 AArch64::AEK_FP16, AArch64::AEK_RCPC,
326 AArch64::AEK_DOTPROD, AArch64::AEK_SSBS})},
327 {
"cortex-a78", ARMV8_2A,
329 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
330 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
331 AArch64::AEK_PROFILE})},
332 {
"cortex-a78ae", ARMV8_2A,
334 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
335 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
336 AArch64::AEK_PROFILE})},
337 {
"cortex-a78c", ARMV8_2A,
339 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
340 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
341 AArch64::AEK_PROFILE, AArch64::AEK_FLAGM, AArch64::AEK_PAUTH})},
342 {
"cortex-a710", ARMV9A,
344 AArch64::AEK_FLAGM, AArch64::AEK_SB,
345 AArch64::AEK_I8MM, AArch64::AEK_FP16FML,
346 AArch64::AEK_SVE, AArch64::AEK_SVE2,
347 AArch64::AEK_SVE2BITPERM, AArch64::AEK_BF16})},
348 {
"cortex-a715", ARMV9A,
350 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
351 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
352 AArch64::AEK_I8MM, AArch64::AEK_PREDRES, AArch64::AEK_PERFMON,
353 AArch64::AEK_PROFILE, AArch64::AEK_SVE, AArch64::AEK_SVE2BITPERM,
354 AArch64::AEK_BF16, AArch64::AEK_FLAGM})},
355 {
"cortex-a720", ARMV9_2A,
357 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
358 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
359 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
360 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
361 {
"cortex-a720ae", ARMV9_2A,
363 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
364 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
365 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
366 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
367 {
"cortex-r82", ARMV8R,
369 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
370 {
"cortex-r82ae", ARMV8R,
372 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
373 {
"cortex-x1", ARMV8_2A,
375 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
376 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
377 AArch64::AEK_PROFILE})},
378 {
"cortex-x1c", ARMV8_2A,
380 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
381 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
382 AArch64::AEK_PAUTH, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM})},
383 {
"cortex-x2", ARMV9A,
385 {AArch64::AEK_MTE, AArch64::AEK_BF16, AArch64::AEK_I8MM,
386 AArch64::AEK_PAUTH, AArch64::AEK_SSBS, AArch64::AEK_SB,
387 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
388 AArch64::AEK_FP16FML, AArch64::AEK_FLAGM})},
389 {
"cortex-x3", ARMV9A,
391 {AArch64::AEK_SVE, AArch64::AEK_PERFMON, AArch64::AEK_PROFILE,
392 AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_MTE,
393 AArch64::AEK_SVE2BITPERM, AArch64::AEK_SB, AArch64::AEK_PAUTH,
394 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PREDRES,
395 AArch64::AEK_FLAGM, AArch64::AEK_SSBS})},
396 {
"cortex-x4", ARMV9_2A,
398 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
399 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
400 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
401 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
402 {
"neoverse-e1", ARMV8_2A,
404 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
405 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
406 {
"neoverse-n1", ARMV8_2A,
408 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
409 AArch64::AEK_PROFILE, AArch64::AEK_RCPC,
410 AArch64::AEK_SSBS})},
411 {
"neoverse-n2", ARMV9A,
413 {AArch64::AEK_BF16, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
414 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE,
415 AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_SVE,
416 AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM})},
417 {
"neoverse-n3", ARMV9_2A,
419 AArch64::AEK_SB, AArch64::AEK_PREDRES,
420 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
421 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
422 AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
423 AArch64::AEK_PROFILE, AArch64::AEK_PERFMON})},
424 {
"neoverse-512tvb", ARMV8_4A,
426 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
427 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
428 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
429 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
430 AArch64::AEK_I8MM})},
431 {
"neoverse-v1", ARMV8_4A,
433 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
434 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
435 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
436 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
437 AArch64::AEK_I8MM})},
438 {
"neoverse-v2", ARMV9A,
440 {AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SSBS,
441 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_RAND,
442 AArch64::AEK_DOTPROD, AArch64::AEK_PROFILE, AArch64::AEK_SVE2BITPERM,
443 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE})},
444 {
"neoverse-v3", ARMV9_2A,
446 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
447 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
448 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
449 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
450 AArch64::AEK_FP16FML})},
451 {
"neoverse-v3ae", ARMV9_2A,
453 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
454 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
455 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
456 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
457 AArch64::AEK_FP16FML}))},
460 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
463 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
466 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
469 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
470 {
"apple-a10", ARMV8A,
472 AArch64::AEK_CRC, AArch64::AEK_RDM})},
473 {
"apple-a11", ARMV8_2A,
475 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
476 {
"apple-a12", ARMV8_3A,
478 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
479 {
"apple-a13", ARMV8_4A,
481 AArch64::AEK_SHA3, AArch64::AEK_FP16,
482 AArch64::AEK_FP16FML})},
483 {
"apple-a14", ARMV8_5A,
485 AArch64::AEK_SHA3, AArch64::AEK_FP16,
486 AArch64::AEK_FP16FML})},
487 {
"apple-a15", ARMV8_6A,
489 AArch64::AEK_SHA3, AArch64::AEK_FP16,
490 AArch64::AEK_FP16FML})},
491 {
"apple-a16", ARMV8_6A,
493 AArch64::AEK_SHA3, AArch64::AEK_FP16,
494 AArch64::AEK_FP16FML})},
495 {
"apple-a17", ARMV8_6A,
497 AArch64::AEK_SHA3, AArch64::AEK_FP16,
498 AArch64::AEK_FP16FML})},
500 {
"apple-m1", ARMV8_5A,
502 AArch64::AEK_SHA3, AArch64::AEK_FP16,
503 AArch64::AEK_FP16FML})},
504 {
"apple-m2", ARMV8_6A,
506 AArch64::AEK_SHA3, AArch64::AEK_FP16,
507 AArch64::AEK_FP16FML})},
508 {
"apple-m3", ARMV8_6A,
510 AArch64::AEK_SHA3, AArch64::AEK_FP16,
511 AArch64::AEK_FP16FML})},
513 {
"apple-s4", ARMV8_3A,
515 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
516 {
"apple-s5", ARMV8_3A,
518 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
519 {
"exynos-m3", ARMV8A,
521 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
522 {
"exynos-m4", ARMV8_2A,
524 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
525 {
"exynos-m5", ARMV8_2A,
527 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
530 AArch64::AEK_CRC, AArch64::AEK_RDM})},
531 {
"saphira", ARMV8_3A,
533 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_PROFILE})},
536 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
537 {
"thunderx2t99", ARMV8_1A,
539 {
"thunderx3t110", ARMV8_3A,
543 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
544 {
"thunderxt88", ARMV8A,
546 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
547 {
"thunderxt81", ARMV8A,
549 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
550 {
"thunderxt83", ARMV8A,
552 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
555 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
556 AArch64::AEK_FP16FML, AArch64::AEK_PROFILE,
557 AArch64::AEK_JSCVT, AArch64::AEK_FCMA})},
560 AArch64::AEK_FP16, AArch64::AEK_SVE})},
563 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
564 {
"ampere1", ARMV8_6A,
566 AArch64::AEK_SHA3, AArch64::AEK_FP16,
567 AArch64::AEK_SB, AArch64::AEK_SSBS,
568 AArch64::AEK_RAND})},
569 {
"ampere1a", ARMV8_6A,
571 {AArch64::AEK_FP16, AArch64::AEK_RAND, AArch64::AEK_SM4,
572 AArch64::AEK_SHA3, AArch64::AEK_SHA2, AArch64::AEK_AES,
573 AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS})},
574 {
"ampere1b", ARMV8_7A,
576 AArch64::AEK_SM4, AArch64::AEK_SHA3,
577 AArch64::AEK_SHA2, AArch64::AEK_AES,
578 AArch64::AEK_MTE, AArch64::AEK_SB,
579 AArch64::AEK_SSBS, AArch64::AEK_CSSC})},
589 {
"grace",
"neoverse-v2"}};
595 std::vector<StringRef> &Features);
This file defines the StringMap class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static cl::opt< std::set< SPIRV::Extension::Extension >, false, SPIRVExtensionsParser > Extensions("spirv-ext", cl::desc("Specify list of enabled SPIR-V extensions"))
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),...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Triple - Helper class for working with autoconf configuration names.
Represents a version number in the form major[.minor[.subminor[.build]]].
unsigned getMajor() const
Retrieve the major version number.
std::optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
void PrintSupportedExtensions(StringMap< StringRef > DescMap)
bool isX18ReservedByDefault(const Triple &TT)
StringRef getArchExtFeature(StringRef ArchExt)
std::optional< ExtensionInfo > parseArchExtension(StringRef Extension)
constexpr CpuInfo CpuInfos[]
std::optional< CpuInfo > parseCpu(StringRef Name)
uint64_t getCpuSupportsMask(ArrayRef< StringRef > FeatureStrs)
const ArchInfo * parseArch(StringRef Arch)
const ArchInfo * getArchForCpu(StringRef CPU)
void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values)
const ExtensionInfo & getExtensionByID(ArchExtKind(ExtID))
constexpr Alias CpuAliases[]
StringRef resolveCPUAlias(StringRef CPU)
bool getExtensionFeatures(const AArch64::ExtensionBitset &Extensions, std::vector< StringRef > &Features)
Bitset< AEK_NUM_EXTENSIONS > ExtensionBitset
This is an optimization pass for GlobalISel generic memory operations.
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
std::optional< StringRef > Alias
static constexpr unsigned MaxFMVPriority
StringRef DependentFeatures
void addCPUDefaults(const CpuInfo &CPU)
void enable(ArchExtKind E)
void disable(ArchExtKind E)
void toLLVMFeatureList(std::vector< StringRef > &Features) const
const ArchInfo * BaseArch
bool parseModifier(StringRef Modifier)
void addArchDefaults(const ArchInfo &Arch)