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"
194 {AEK_SIMD, AEK_CRYPTO},
196 {AEK_SIMD, AEK_SHA2},
197 {AEK_SIMD, AEK_SHA3},
200 {AEK_SIMD, AEK_DOTPROD},
201 {AEK_SIMD, AEK_FCMA},
202 {AEK_FP16, AEK_FP16FML},
205 {AEK_BF16, AEK_B16B16},
207 {AEK_SVE, AEK_F32MM},
208 {AEK_SVE, AEK_F64MM},
209 {AEK_SVE2, AEK_SVE2P1},
210 {AEK_SVE2, AEK_SVE2BITPERM},
211 {AEK_SVE2, AEK_SVE2AES},
212 {AEK_SVE2, AEK_SVE2SHA3},
213 {AEK_SVE2, AEK_SVE2SM4},
214 {AEK_SVE2, AEK_SMEFA64},
215 {AEK_SVE2, AEK_SMEFA64},
217 {AEK_SME, AEK_SMEF16F16},
218 {AEK_SME, AEK_SMEF64F64},
219 {AEK_SME, AEK_SMEI16I64},
220 {AEK_SME, AEK_SMEFA64},
221 {AEK_SME2, AEK_SME2P1},
222 {AEK_SME2, AEK_SSVE_FP8FMA},
223 {AEK_SME2, AEK_SSVE_FP8DOT2},
224 {AEK_SME2, AEK_SSVE_FP8DOT4},
225 {AEK_SME2, AEK_SMEF8F16},
226 {AEK_SME2, AEK_SMEF8F32},
227 {AEK_FP8, AEK_SMEF8F16},
228 {AEK_FP8, AEK_SMEF8F32},
229 {AEK_LSE, AEK_LSE128},
230 {AEK_PREDRES, AEK_SPECRES2},
231 {AEK_RAS, AEK_RASV2},
232 {AEK_RCPC, AEK_RCPC3},
248 return this->Name ==
Other.Name;
251 return this->Name !=
Other.Name;
265 if (this->Profile !=
Other.Profile)
268 return this->Version >
Other.Version;
270 if (this->Version.
getMajor() == 9 &&
Other.Version.getMajor() == 8) {
272 "AArch64::ArchInfo should have a minor version.");
273 return this->Version.
getMinor().value_or(0) + 5 >=
274 Other.Version.getMinor().value_or(0);
292#define EMIT_ARCHITECTURES
293#include "llvm/TargetParser/AArch64TargetParserDef.inc"
312 {
"cortex-a34", ARMV8A,
314 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
315 {
"cortex-a35", ARMV8A,
317 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
318 {
"cortex-a53", ARMV8A,
320 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
321 {
"cortex-a55", ARMV8_2A,
323 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
324 AArch64::AEK_RCPC})},
325 {
"cortex-a510", ARMV9A,
327 {AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_SB,
328 AArch64::AEK_PAUTH, AArch64::AEK_MTE, AArch64::AEK_SSBS,
329 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
330 AArch64::AEK_FP16FML})},
331 {
"cortex-a520", ARMV9_2A,
333 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
334 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
335 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
336 {
"cortex-a520ae", ARMV9_2A,
338 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
339 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
340 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
341 {
"cortex-a57", ARMV8A,
343 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
344 {
"cortex-a65", ARMV8_2A,
346 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
347 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
348 {
"cortex-a65ae", ARMV8_2A,
350 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
351 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
352 {
"cortex-a72", ARMV8A,
354 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
355 {
"cortex-a73", ARMV8A,
357 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
358 {
"cortex-a75", ARMV8_2A,
360 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
361 AArch64::AEK_RCPC})},
362 {
"cortex-a76", ARMV8_2A,
364 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
365 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
366 {
"cortex-a76ae", ARMV8_2A,
368 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
369 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
370 {
"cortex-a77", ARMV8_2A,
372 AArch64::AEK_FP16, AArch64::AEK_RCPC,
373 AArch64::AEK_DOTPROD, AArch64::AEK_SSBS})},
374 {
"cortex-a78", ARMV8_2A,
376 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
377 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
378 AArch64::AEK_PROFILE})},
379 {
"cortex-a78ae", ARMV8_2A,
381 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
382 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
383 AArch64::AEK_PROFILE})},
384 {
"cortex-a78c", ARMV8_2A,
386 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
387 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
388 AArch64::AEK_PROFILE, AArch64::AEK_FLAGM, AArch64::AEK_PAUTH})},
389 {
"cortex-a710", ARMV9A,
391 AArch64::AEK_FLAGM, AArch64::AEK_SB,
392 AArch64::AEK_I8MM, AArch64::AEK_FP16FML,
393 AArch64::AEK_SVE, AArch64::AEK_SVE2,
394 AArch64::AEK_SVE2BITPERM, AArch64::AEK_BF16})},
395 {
"cortex-a715", ARMV9A,
397 {AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_MTE,
398 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
399 AArch64::AEK_I8MM, AArch64::AEK_PREDRES, AArch64::AEK_PERFMON,
400 AArch64::AEK_PROFILE, AArch64::AEK_SVE, AArch64::AEK_SVE2BITPERM,
401 AArch64::AEK_BF16, AArch64::AEK_FLAGM})},
402 {
"cortex-a720", ARMV9_2A,
404 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
405 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
406 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
407 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
408 {
"cortex-a720ae", ARMV9_2A,
410 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
411 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
412 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
413 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
414 {
"cortex-r82", ARMV8R,
416 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
417 {
"cortex-r82ae", ARMV8R,
419 AArch64::AEK_PERFMON, AArch64::AEK_PREDRES})},
420 {
"cortex-x1", ARMV8_2A,
422 AArch64::AEK_FP16, AArch64::AEK_DOTPROD,
423 AArch64::AEK_RCPC, AArch64::AEK_SSBS,
424 AArch64::AEK_PROFILE})},
425 {
"cortex-x1c", ARMV8_2A,
427 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16,
428 AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
429 AArch64::AEK_PAUTH, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM})},
430 {
"cortex-x2", ARMV9A,
432 {AArch64::AEK_MTE, AArch64::AEK_BF16, AArch64::AEK_I8MM,
433 AArch64::AEK_PAUTH, AArch64::AEK_SSBS, AArch64::AEK_SB,
434 AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM,
435 AArch64::AEK_FP16FML, AArch64::AEK_FLAGM})},
436 {
"cortex-x3", ARMV9A,
438 {AArch64::AEK_SVE, AArch64::AEK_PERFMON, AArch64::AEK_PROFILE,
439 AArch64::AEK_BF16, AArch64::AEK_I8MM, AArch64::AEK_MTE,
440 AArch64::AEK_SVE2BITPERM, AArch64::AEK_SB, AArch64::AEK_PAUTH,
441 AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_PREDRES,
442 AArch64::AEK_FLAGM, AArch64::AEK_SSBS})},
443 {
"cortex-x4", ARMV9_2A,
445 AArch64::AEK_MTE, AArch64::AEK_FP16FML,
446 AArch64::AEK_PAUTH, AArch64::AEK_SVE2BITPERM,
447 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
448 AArch64::AEK_PREDRES, AArch64::AEK_PROFILE})},
449 {
"neoverse-e1", ARMV8_2A,
451 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
452 AArch64::AEK_RCPC, AArch64::AEK_SSBS})},
453 {
"neoverse-n1", ARMV8_2A,
455 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
456 AArch64::AEK_PROFILE, AArch64::AEK_RCPC,
457 AArch64::AEK_SSBS})},
458 {
"neoverse-n2", ARMV9A,
460 {AArch64::AEK_BF16, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
461 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE,
462 AArch64::AEK_SB, AArch64::AEK_SSBS, AArch64::AEK_SVE,
463 AArch64::AEK_SVE2, AArch64::AEK_SVE2BITPERM})},
464 {
"neoverse-n3", ARMV9_2A,
466 AArch64::AEK_SB, AArch64::AEK_PREDRES,
467 AArch64::AEK_FP16FML, AArch64::AEK_PAUTH,
468 AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
469 AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
470 AArch64::AEK_PROFILE, AArch64::AEK_PERFMON})},
471 {
"neoverse-512tvb", ARMV8_4A,
473 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
474 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
475 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
476 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
477 AArch64::AEK_I8MM})},
478 {
"neoverse-v1", ARMV8_4A,
480 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_SHA3,
481 AArch64::AEK_SM4, AArch64::AEK_SVE, AArch64::AEK_SSBS,
482 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_DOTPROD,
483 AArch64::AEK_PROFILE, AArch64::AEK_RAND, AArch64::AEK_FP16FML,
484 AArch64::AEK_I8MM})},
485 {
"neoverse-v2", ARMV9A,
487 {AArch64::AEK_SVE, AArch64::AEK_SVE2, AArch64::AEK_SSBS,
488 AArch64::AEK_FP16, AArch64::AEK_BF16, AArch64::AEK_RAND,
489 AArch64::AEK_DOTPROD, AArch64::AEK_PROFILE, AArch64::AEK_SVE2BITPERM,
490 AArch64::AEK_FP16FML, AArch64::AEK_I8MM, AArch64::AEK_MTE})},
491 {
"neoverse-v3", ARMV9_2A,
493 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
494 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
495 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
496 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
497 AArch64::AEK_FP16FML})},
498 {
"neoverse-v3ae", ARMV9_2A,
500 {AArch64::AEK_PROFILE, AArch64::AEK_MTE, AArch64::AEK_SSBS,
501 AArch64::AEK_SB, AArch64::AEK_PREDRES, AArch64::AEK_LS64,
502 AArch64::AEK_BRBE, AArch64::AEK_PAUTH, AArch64::AEK_FLAGM,
503 AArch64::AEK_PERFMON, AArch64::AEK_RAND, AArch64::AEK_SVE2BITPERM,
504 AArch64::AEK_FP16FML}))},
507 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
510 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
513 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
516 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_NONE})},
517 {
"apple-a10", ARMV8A,
519 AArch64::AEK_CRC, AArch64::AEK_RDM})},
520 {
"apple-a11", ARMV8_2A,
522 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
523 {
"apple-a12", ARMV8_3A,
525 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
526 {
"apple-a13", ARMV8_4A,
528 AArch64::AEK_SHA3, AArch64::AEK_FP16,
529 AArch64::AEK_FP16FML})},
530 {
"apple-a14", ARMV8_5A,
532 AArch64::AEK_SHA3, AArch64::AEK_FP16,
533 AArch64::AEK_FP16FML})},
534 {
"apple-a15", ARMV8_6A,
536 AArch64::AEK_SHA3, AArch64::AEK_FP16,
537 AArch64::AEK_FP16FML})},
538 {
"apple-a16", ARMV8_6A,
540 AArch64::AEK_SHA3, AArch64::AEK_FP16,
541 AArch64::AEK_FP16FML})},
542 {
"apple-a17", ARMV8_6A,
544 AArch64::AEK_SHA3, AArch64::AEK_FP16,
545 AArch64::AEK_FP16FML})},
547 {
"apple-m1", ARMV8_5A,
549 AArch64::AEK_SHA3, AArch64::AEK_FP16,
550 AArch64::AEK_FP16FML})},
551 {
"apple-m2", ARMV8_6A,
553 AArch64::AEK_SHA3, AArch64::AEK_FP16,
554 AArch64::AEK_FP16FML})},
555 {
"apple-m3", ARMV8_6A,
557 AArch64::AEK_SHA3, AArch64::AEK_FP16,
558 AArch64::AEK_FP16FML})},
560 {
"apple-s4", ARMV8_3A,
562 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
563 {
"apple-s5", ARMV8_3A,
565 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
566 {
"exynos-m3", ARMV8A,
568 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
569 {
"exynos-m4", ARMV8_2A,
571 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
572 {
"exynos-m5", ARMV8_2A,
574 AArch64::AEK_DOTPROD, AArch64::AEK_FP16})},
577 AArch64::AEK_CRC, AArch64::AEK_RDM})},
578 {
"saphira", ARMV8_3A,
580 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_PROFILE})},
583 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
584 {
"thunderx2t99", ARMV8_1A,
586 {
"thunderx3t110", ARMV8_3A,
590 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
591 {
"thunderxt88", ARMV8A,
593 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
594 {
"thunderxt81", ARMV8A,
596 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
597 {
"thunderxt83", ARMV8A,
599 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_CRC})},
602 AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
603 AArch64::AEK_FP16FML, AArch64::AEK_PROFILE,
604 AArch64::AEK_JSCVT, AArch64::AEK_FCMA})},
607 AArch64::AEK_FP16, AArch64::AEK_SVE})},
610 {AArch64::AEK_AES, AArch64::AEK_SHA2, AArch64::AEK_FP16})},
611 {
"ampere1", ARMV8_6A,
613 AArch64::AEK_SHA3, AArch64::AEK_FP16,
614 AArch64::AEK_SB, AArch64::AEK_SSBS,
615 AArch64::AEK_RAND})},
616 {
"ampere1a", ARMV8_6A,
618 {AArch64::AEK_FP16, AArch64::AEK_RAND, AArch64::AEK_SM4,
619 AArch64::AEK_SHA3, AArch64::AEK_SHA2, AArch64::AEK_AES,
620 AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS})},
621 {
"ampere1b", ARMV8_7A,
623 AArch64::AEK_SM4, AArch64::AEK_SHA3,
624 AArch64::AEK_SHA2, AArch64::AEK_AES,
625 AArch64::AEK_MTE, AArch64::AEK_SB,
626 AArch64::AEK_SSBS, AArch64::AEK_CSSC})},
636 {
"grace",
"neoverse-v2"}};
642 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)
constexpr ExtensionDependency ExtensionDependencies[]
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)