17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/ADT/StringSwitch.h"
20 #include "llvm/Support/AArch64TargetParser.h"
21 #include "llvm/Support/ARMTargetParserCommon.h"
22 #include "llvm/TargetParser/AArch64TargetParser.h"
25 using namespace clang;
29 #define BUILTIN(ID, TYPE, ATTRS) \
30 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
31 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
32 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
33 #include "clang/Basic/BuiltinsNEON.def"
35 #define BUILTIN(ID, TYPE, ATTRS) \
36 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
37 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
38 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
39 #include "clang/Basic/BuiltinsSVE.def"
41 #define BUILTIN(ID, TYPE, ATTRS) \
42 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
43 #define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
44 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, LANG},
45 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
46 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
47 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
48 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
49 #include "clang/Basic/BuiltinsAArch64.def"
53 if (*ArchInfo == llvm::AArch64::ARMV8R) {
63 }
else if (ArchInfo->Version.getMajor() == 8) {
64 if (ArchInfo->Version.getMinor() >= 7u) {
67 if (ArchInfo->Version.getMinor() >= 6u) {
71 if (ArchInfo->Version.getMinor() >= 5u) {
72 HasAlternativeNZCV =
true;
79 if (ArchInfo->Version.getMinor() >= 4u) {
84 if (ArchInfo->Version.getMinor() >= 3u) {
88 if (ArchInfo->Version.getMinor() >= 2u) {
91 if (ArchInfo->Version.getMinor() >= 1u) {
96 }
else if (ArchInfo->Version.getMajor() == 9) {
97 if (ArchInfo->Version.getMinor() >= 2u) {
100 if (ArchInfo->Version.getMinor() >= 1u) {
107 HasAlternativeNZCV =
true;
145 if (Triple.isArch64Bit())
187 if (Triple.getOS() == llvm::Triple::Linux)
189 else if (Triple.getOS() == llvm::Triple::UnknownOS)
191 Opts.
EABIVersion == llvm::EABI::GNU ?
"\01_mcount" :
"mcount";
197 if (Name !=
"aapcs" && Name !=
"darwinpcs")
206 StringRef &Err)
const {
207 llvm::ARM::ParsedBranchProtection PBP;
208 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
212 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
217 if (PBP.Key ==
"a_key")
227 return Name ==
"generic" || llvm::AArch64::parseCpu(Name);
236 llvm::AArch64::fillValidCPUArchList(Values);
241 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
242 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
243 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
254 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
255 Builder.defineMacro(
"__ARM_FEATURE_JCVT",
"1");
256 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
269 Builder.defineMacro(
"__ARM_FEATURE_FRINT",
"1");
270 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
336 Builder.defineMacro(
"__aarch64__");
338 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
340 Builder.defineMacro(
"__ELF__");
344 Builder.defineMacro(
"_LP64");
345 Builder.defineMacro(
"__LP64__");
349 if (CodeModel ==
"default")
351 for (
char &
c : CodeModel)
353 Builder.defineMacro(
"__AARCH64_CMODEL_" + CodeModel +
"__");
356 Builder.defineMacro(
"__ARM_ACLE",
"200");
357 Builder.defineMacro(
"__ARM_ARCH",
358 std::to_string(ArchInfo->Version.getMajor()));
359 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
362 Builder.defineMacro(
"__ARM_64BIT_STATE",
"1");
363 Builder.defineMacro(
"__ARM_PCS_AAPCS64",
"1");
364 Builder.defineMacro(
"__ARM_ARCH_ISA_A64",
"1");
366 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
367 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
368 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0xF");
369 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
370 Builder.defineMacro(
"__ARM_FEATURE_DIV");
371 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
372 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
374 Builder.defineMacro(
"__ARM_ALIGN_MAX_STACK_PWR",
"4");
377 Builder.defineMacro(
"__ARM_FP",
"0xE");
381 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
382 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
384 if (Opts.UnsafeFPMath)
385 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
387 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
388 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
390 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
392 if (FPU & NeonMode) {
393 Builder.defineMacro(
"__ARM_NEON",
"1");
395 Builder.defineMacro(
"__ARM_NEON_FP",
"0xE");
399 Builder.defineMacro(
"__ARM_FEATURE_SVE",
"1");
401 if ((FPU & NeonMode) && (FPU & SveMode))
402 Builder.defineMacro(
"__ARM_NEON_SVE_BRIDGE",
"1");
405 Builder.defineMacro(
"__ARM_FEATURE_SVE2",
"1");
407 if (HasSVE2 && HasSVE2AES)
408 Builder.defineMacro(
"__ARM_FEATURE_SVE2_AES",
"1");
410 if (HasSVE2 && HasSVE2BitPerm)
411 Builder.defineMacro(
"__ARM_FEATURE_SVE2_BITPERM",
"1");
413 if (HasSVE2 && HasSVE2SHA3)
414 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SHA3",
"1");
416 if (HasSVE2 && HasSVE2SM4)
417 Builder.defineMacro(
"__ARM_FEATURE_SVE2_SM4",
"1");
420 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
423 Builder.defineMacro(
"__ARM_FEATURE_RCPC",
"1");
426 Builder.defineMacro(
"__HAVE_FUNCTION_MULTI_VERSIONING",
"1");
430 if (HasAES && HasSHA2)
431 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
434 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
437 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
440 Builder.defineMacro(
"__ARM_FEATURE_SHA3",
"1");
441 Builder.defineMacro(
"__ARM_FEATURE_SHA512",
"1");
445 Builder.defineMacro(
"__ARM_FEATURE_SM3",
"1");
446 Builder.defineMacro(
"__ARM_FEATURE_SM4",
"1");
450 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
453 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
455 if ((FPU & NeonMode) && HasFullFP16)
456 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
458 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
461 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
464 Builder.defineMacro(
"__ARM_FEATURE_MEMORY_TAGGING",
"1");
467 Builder.defineMacro(
"__ARM_FEATURE_TME",
"1");
470 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
473 Builder.defineMacro(
"__ARM_FEATURE_ATOMICS",
"1");
476 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
477 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
478 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
479 Builder.defineMacro(
"__ARM_FEATURE_BF16_SCALAR_ARITHMETIC",
"1");
482 if ((FPU & SveMode) && HasBFloat16) {
483 Builder.defineMacro(
"__ARM_FEATURE_SVE_BF16",
"1");
486 if ((FPU & SveMode) && HasMatmulFP64)
487 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP64",
"1");
489 if ((FPU & SveMode) && HasMatmulFP32)
490 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_FP32",
"1");
492 if ((FPU & SveMode) && HasMatMul)
493 Builder.defineMacro(
"__ARM_FEATURE_SVE_MATMUL_INT8",
"1");
495 if ((FPU & NeonMode) && HasFP16FML)
496 Builder.defineMacro(
"__ARM_FEATURE_FP16_FML",
"1");
513 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", std::to_string(
Value));
516 if (Opts.BranchTargetEnforcement)
517 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
520 Builder.defineMacro(
"__ARM_FEATURE_LS64",
"1");
523 Builder.defineMacro(
"__ARM_FEATURE_RNG",
"1");
526 Builder.defineMacro(
"__ARM_FEATURE_MOPS",
"1");
529 Builder.defineMacro(
"__ARM_FEATURE_SYSREG128",
"1");
531 if (*ArchInfo == llvm::AArch64::ARMV8_1A)
533 else if (*ArchInfo == llvm::AArch64::ARMV8_2A)
535 else if (*ArchInfo == llvm::AArch64::ARMV8_3A)
537 else if (*ArchInfo == llvm::AArch64::ARMV8_4A)
539 else if (*ArchInfo == llvm::AArch64::ARMV8_5A)
541 else if (*ArchInfo == llvm::AArch64::ARMV8_6A)
543 else if (*ArchInfo == llvm::AArch64::ARMV8_7A)
545 else if (*ArchInfo == llvm::AArch64::ARMV8_8A)
547 else if (*ArchInfo == llvm::AArch64::ARMV8_9A)
549 else if (*ArchInfo == llvm::AArch64::ARMV9A)
551 else if (*ArchInfo == llvm::AArch64::ARMV9_1A)
553 else if (*ArchInfo == llvm::AArch64::ARMV9_2A)
555 else if (*ArchInfo == llvm::AArch64::ARMV9_3A)
557 else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
561 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
562 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
563 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
564 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
567 Builder.defineMacro(
"__FP_FAST_FMA",
"1");
568 Builder.defineMacro(
"__FP_FAST_FMAF",
"1");
572 Builder.defineMacro(
"__ARM_FEATURE_SVE_VECTOR_OPERATORS",
"2");
574 if (Opts.VScaleMin && Opts.VScaleMin == Opts.VScaleMax) {
575 Builder.defineMacro(
"__ARM_FEATURE_SVE_BITS", Twine(Opts.VScaleMin * 128));
584 std::optional<std::pair<unsigned, unsigned>>
586 if (LangOpts.VScaleMin || LangOpts.VScaleMax)
587 return std::pair<unsigned, unsigned>(
588 LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
591 return std::pair<unsigned, unsigned>(1, 16);
597 if (Name ==
"default")
599 for (
const auto &E : llvm::AArch64::Extensions)
601 return E.FmvPriority;
607 return llvm::AArch64::ExtensionInfo::MaxFMVPriority;
613 for (
const auto &E : llvm::AArch64::Extensions) {
614 if (Name == E.Name) {
615 FeatureVec = E.DependentFeatures;
619 return FeatureVec !=
"";
623 for (
const auto &E : llvm::AArch64::Extensions)
624 if (FeatureStr == E.Name)
630 return llvm::StringSwitch<bool>(Feature)
631 .Cases(
"aarch64",
"arm64",
"arm",
true)
633 .Cases(
"neon",
"fp",
"simd", FPU & NeonMode)
634 .Case(
"jscvt", HasJSCVT)
635 .Case(
"fcma", HasFCMA)
636 .Case(
"rng", HasRandGen)
637 .Case(
"flagm", HasFlagM)
638 .Case(
"flagm2", HasAlternativeNZCV)
639 .Case(
"fp16fml", HasFP16FML)
640 .Case(
"dotprod", HasDotProd)
645 .Case(
"sha2", HasSHA2)
646 .Case(
"sha3", HasSHA3)
647 .Cases(
"aes",
"pmull", HasAES)
648 .Cases(
"fp16",
"fullfp16", HasFullFP16)
650 .Case(
"dpb", HasCCPP)
651 .Case(
"dpb2", HasCCDP)
652 .Case(
"rcpc", HasRCPC)
653 .Case(
"frintts", HasFRInt3264)
654 .Case(
"i8mm", HasMatMul)
655 .Case(
"bf16", HasBFloat16)
656 .Case(
"sve", FPU & SveMode)
657 .Case(
"sve-bf16", FPU & SveMode && HasBFloat16)
658 .Case(
"sve-i8mm", FPU & SveMode && HasMatMul)
659 .Case(
"f32mm", FPU & SveMode && HasMatmulFP32)
660 .Case(
"f64mm", FPU & SveMode && HasMatmulFP64)
661 .Case(
"sve2", FPU & SveMode && HasSVE2)
662 .Case(
"sve2-pmull128", FPU & SveMode && HasSVE2AES)
663 .Case(
"sve2-bitperm", FPU & SveMode && HasSVE2BitPerm)
664 .Case(
"sve2-sha3", FPU & SveMode && HasSVE2SHA3)
665 .Case(
"sve2-sm4", FPU & SveMode && HasSVE2SM4)
667 .Case(
"sme-f64f64", HasSMEF64)
668 .Case(
"sme-i16i64", HasSMEI64)
669 .Cases(
"memtag",
"memtag2", HasMTE)
671 .Case(
"predres", HasPredRes)
672 .Cases(
"ssbs",
"ssbs2", HasSSBS)
674 .Cases(
"ls64",
"ls64_v",
"ls64_accdata", HasLS64)
675 .Case(
"wfxt", HasWFxT)
680 StringRef Name,
bool Enabled)
const {
681 Features[Name] = Enabled;
684 const std::optional<llvm::AArch64::ArchInfo> ArchInfo =
685 llvm::AArch64::ArchInfo::findBySubArch(Name);
690 for (
const auto *OtherArch : llvm::AArch64::ArchInfos)
691 if (ArchInfo->implies(*OtherArch))
692 Features[OtherArch->getSubArch()] = Enabled;
695 std::vector<StringRef> CPUFeats;
696 if (llvm::AArch64::getExtensionFeatures(ArchInfo->DefaultExts, CPUFeats)) {
697 for (
auto F : CPUFeats) {
698 assert(F[0] ==
'+' &&
"Expected + in target feature!");
699 Features[F.drop_front(1)] =
true;
706 for (
const auto &Feature : Features) {
707 if (Feature ==
"-neon")
709 if (Feature ==
"-sve")
712 if (Feature ==
"+neon" || Feature ==
"+fp-armv8")
714 if (Feature ==
"+jscvt") {
718 if (Feature ==
"+fcma") {
723 if (Feature ==
"+sve") {
728 if (Feature ==
"+sve2") {
734 if (Feature ==
"+sve2-aes") {
741 if (Feature ==
"+sve2-sha3") {
748 if (Feature ==
"+sve2-sm4") {
755 if (Feature ==
"+sve2-bitperm") {
760 HasSVE2BitPerm =
true;
762 if (Feature ==
"+f32mm") {
766 HasMatmulFP32 =
true;
768 if (Feature ==
"+f64mm") {
772 HasMatmulFP64 =
true;
774 if (Feature ==
"+sme") {
778 if (Feature ==
"+sme-f64f64") {
783 if (Feature ==
"+sme-i16i64") {
788 if (Feature ==
"+sb")
790 if (Feature ==
"+predres")
792 if (Feature ==
"+ssbs")
794 if (Feature ==
"+bti")
796 if (Feature ==
"+wfxt")
798 if (Feature ==
"-fmv")
800 if (Feature ==
"+crc")
802 if (Feature ==
"+rcpc")
804 if (Feature ==
"+aes") {
808 if (Feature ==
"+sha2") {
812 if (Feature ==
"+sha3") {
817 if (Feature ==
"+rdm") {
821 if (Feature ==
"+dit")
823 if (Feature ==
"+cccp")
825 if (Feature ==
"+ccdp") {
829 if (Feature ==
"+fptoint")
831 if (Feature ==
"+sm4") {
835 if (Feature ==
"+strict-align")
836 HasUnaligned =
false;
838 if (Feature ==
"+v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version)
839 ArchInfo = &llvm::AArch64::ARMV8A;
840 if (Feature ==
"+v8.1a" &&
841 ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version)
842 ArchInfo = &llvm::AArch64::ARMV8_1A;
843 if (Feature ==
"+v8.2a" &&
844 ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version)
845 ArchInfo = &llvm::AArch64::ARMV8_2A;
846 if (Feature ==
"+v8.3a" &&
847 ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version)
848 ArchInfo = &llvm::AArch64::ARMV8_3A;
849 if (Feature ==
"+v8.4a" &&
850 ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version)
851 ArchInfo = &llvm::AArch64::ARMV8_4A;
852 if (Feature ==
"+v8.5a" &&
853 ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version)
854 ArchInfo = &llvm::AArch64::ARMV8_5A;
855 if (Feature ==
"+v8.6a" &&
856 ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version)
857 ArchInfo = &llvm::AArch64::ARMV8_6A;
858 if (Feature ==
"+v8.7a" &&
859 ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version)
860 ArchInfo = &llvm::AArch64::ARMV8_7A;
861 if (Feature ==
"+v8.8a" &&
862 ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version)
863 ArchInfo = &llvm::AArch64::ARMV8_8A;
864 if (Feature ==
"+v8.9a" &&
865 ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version)
866 ArchInfo = &llvm::AArch64::ARMV8_9A;
867 if (Feature ==
"+v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version)
868 ArchInfo = &llvm::AArch64::ARMV9A;
869 if (Feature ==
"+v9.1a" &&
870 ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version)
871 ArchInfo = &llvm::AArch64::ARMV9_1A;
872 if (Feature ==
"+v9.2a" &&
873 ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version)
874 ArchInfo = &llvm::AArch64::ARMV9_2A;
875 if (Feature ==
"+v9.3a" &&
876 ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version)
877 ArchInfo = &llvm::AArch64::ARMV9_3A;
878 if (Feature ==
"+v9.4a" &&
879 ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
880 ArchInfo = &llvm::AArch64::ARMV9_4A;
881 if (Feature ==
"+v8r")
882 ArchInfo = &llvm::AArch64::ARMV8R;
883 if (Feature ==
"+fullfp16") {
887 if (Feature ==
"+dotprod") {
891 if (Feature ==
"+fp16fml") {
896 if (Feature ==
"+mte")
898 if (Feature ==
"+tme")
900 if (Feature ==
"+pauth")
902 if (Feature ==
"+i8mm")
904 if (Feature ==
"+bf16")
906 if (Feature ==
"+lse")
908 if (Feature ==
"+ls64")
910 if (Feature ==
"+rand")
912 if (Feature ==
"+flagm")
914 if (Feature ==
"+altnzcv") {
916 HasAlternativeNZCV =
true;
918 if (Feature ==
"+mops")
920 if (Feature ==
"+d128")
927 for (
const auto &Feature : Features) {
928 if (Feature ==
"-d128")
947 const std::vector<std::string> &FeaturesVec)
const {
948 std::vector<std::string> UpdatedFeaturesVec;
950 std::optional<llvm::AArch64::CpuInfo> CpuInfo = llvm::AArch64::parseCpu(CPU);
952 uint64_t Exts = CpuInfo->getImpliedExtensions();
953 std::vector<StringRef> CPUFeats;
954 llvm::AArch64::getExtensionFeatures(Exts, CPUFeats);
955 for (
auto F : CPUFeats) {
956 assert((F[0] ==
'+' || F[0] ==
'-') &&
"Expected +/- in target feature!");
957 UpdatedFeaturesVec.push_back(F.str());
965 for (
const auto &Feature : FeaturesVec)
966 if ((Feature[0] ==
'?' || Feature[0] ==
'+')) {
970 StringRef(Options).split(AttrFeatures,
",");
971 for (
auto F : AttrFeatures)
972 UpdatedFeaturesVec.push_back(F.str());
975 for (
const auto &Feature : FeaturesVec)
976 if (Feature[0] !=
'?') {
978 if (Feature[0] ==
'+') {
979 std::optional<llvm::AArch64::ExtensionInfo> Extension =
980 llvm::AArch64::parseArchExtension(Feature.substr(1));
982 UpdatedFeature = Extension->Feature.str();
984 UpdatedFeaturesVec.push_back(UpdatedFeature);
998 if (Features ==
"default")
1001 Features.split(AttrFeatures,
",");
1002 bool FoundArch =
false;
1004 auto SplitAndAddFeatures = [](StringRef FeatString,
1005 std::vector<std::string> &Features) {
1007 FeatString.split(SplitFeatures, StringRef(
"+"), -1,
false);
1008 for (StringRef Feature : SplitFeatures) {
1009 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1010 if (!FeatureName.empty())
1011 Features.push_back(FeatureName.str());
1015 if (Feature.startswith(
"no"))
1016 Features.push_back(
"-" + Feature.drop_front(2).str());
1018 Features.push_back(
"+" + Feature.str());
1022 for (
auto &Feature : AttrFeatures) {
1023 Feature = Feature.trim();
1024 if (Feature.startswith(
"fpmath="))
1027 if (Feature.startswith(
"branch-protection=")) {
1028 Ret.BranchProtection = Feature.split(
'=').second.trim();
1032 if (Feature.startswith(
"arch=")) {
1034 Ret.Duplicate =
"arch=";
1036 std::pair<StringRef, StringRef> Split =
1037 Feature.split(
"=").second.trim().split(
"+");
1038 const std::optional<llvm::AArch64::ArchInfo> AI =
1039 llvm::AArch64::parseArch(Split.first);
1045 Ret.Features.push_back(AI->ArchFeature.str());
1047 SplitAndAddFeatures(Split.second,
Ret.Features);
1048 }
else if (Feature.startswith(
"cpu=")) {
1049 if (!
Ret.CPU.empty())
1050 Ret.Duplicate =
"cpu=";
1054 std::pair<StringRef, StringRef> Split =
1055 Feature.split(
"=").second.trim().split(
"+");
1056 Ret.CPU = Split.first;
1057 SplitAndAddFeatures(Split.second,
Ret.Features);
1059 }
else if (Feature.startswith(
"tune=")) {
1060 if (!
Ret.Tune.empty())
1061 Ret.Duplicate =
"tune=";
1063 Ret.Tune = Feature.split(
"=").second.trim();
1064 }
else if (Feature.startswith(
"+")) {
1065 SplitAndAddFeatures(Feature,
Ret.Features);
1066 }
else if (Feature.startswith(
"no-")) {
1067 StringRef FeatureName =
1068 llvm::AArch64::getArchExtFeature(Feature.split(
"-").second);
1069 if (!FeatureName.empty())
1070 Ret.Features.push_back(
"-" + FeatureName.drop_front(1).str());
1072 Ret.Features.push_back(
"-" + Feature.split(
"-").second.str());
1077 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
1078 if (!FeatureName.empty())
1079 Ret.Features.push_back(FeatureName.str());
1081 Ret.Features.push_back(
"+" + Feature.str());
1115 const char *
const AArch64TargetInfo::GCCRegNames[] = {
1117 "w0",
"w1",
"w2",
"w3",
"w4",
"w5",
"w6",
"w7",
"w8",
"w9",
"w10",
"w11",
1118 "w12",
"w13",
"w14",
"w15",
"w16",
"w17",
"w18",
"w19",
"w20",
"w21",
"w22",
1119 "w23",
"w24",
"w25",
"w26",
"w27",
"w28",
"w29",
"w30",
"wsp",
1122 "x0",
"x1",
"x2",
"x3",
"x4",
"x5",
"x6",
"x7",
"x8",
"x9",
"x10",
"x11",
1123 "x12",
"x13",
"x14",
"x15",
"x16",
"x17",
"x18",
"x19",
"x20",
"x21",
"x22",
1124 "x23",
"x24",
"x25",
"x26",
"x27",
"x28",
"fp",
"lr",
"sp",
1127 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1128 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1129 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1132 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1133 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1134 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1137 "v0",
"v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
1138 "v12",
"v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
"v22",
1139 "v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
"v31",
1142 "z0",
"z1",
"z2",
"z3",
"z4",
"z5",
"z6",
"z7",
"z8",
"z9",
"z10",
1143 "z11",
"z12",
"z13",
"z14",
"z15",
"z16",
"z17",
"z18",
"z19",
"z20",
"z21",
1144 "z22",
"z23",
"z24",
"z25",
"z26",
"z27",
"z28",
"z29",
"z30",
"z31",
1147 "p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6",
"p7",
"p8",
"p9",
"p10",
1148 "p11",
"p12",
"p13",
"p14",
"p15"
1188 {{
"r29",
"x29"},
"fp"},
1189 {{
"r30",
"x30"},
"lr"},
1222 if (Name[1] ==
'p' && (Name[2] ==
'l' || Name[2] ==
'a')) {
1250 StringRef Constraint,
char Modifier,
unsigned Size,
1253 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
1254 Constraint = Constraint.substr(1);
1256 switch (Constraint[0]) {
1276 SuggestedModifier =
"w";
1299 void AArch64leTargetInfo::setDataLayout() {
1306 resetDataLayout(
"e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1311 Builder.defineMacro(
"__AARCH64EL__");
1321 Builder.defineMacro(
"__AARCH64EB__");
1322 Builder.defineMacro(
"__AARCH_BIG_ENDIAN");
1323 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1327 void AArch64beTargetInfo::setDataLayout() {
1328 assert(!
getTriple().isOSBinFormatMachO());
1329 resetDataLayout(
"E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
1352 ?
"e-m:o-i64:64-i128:128-n32:64-S128"
1353 :
"e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128",
1354 Triple.isOSBinFormatMachO() ?
"_" :
"");
1392 Builder.defineMacro(
"_M_ARM64",
"1");
1407 if (TypeSize >= 512) {
1409 }
else if (TypeSize >= 64) {
1411 }
else if (TypeSize >= 16) {
1448 const llvm::Triple &Triple,
1450 Builder.defineMacro(
"__AARCH64_SIMD__");
1451 if (Triple.isArch32Bit())
1452 Builder.defineMacro(
"__ARM64_ARCH_8_32__");
1454 Builder.defineMacro(
"__ARM64_ARCH_8__");
1455 Builder.defineMacro(
"__ARM_NEON__");
1456 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1457 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
1458 Builder.defineMacro(
"__arm64",
"1");
1459 Builder.defineMacro(
"__arm64__",
"1");
1461 if (Triple.isArm64e())
1462 Builder.defineMacro(
"__arm64e__",
"1");
1477 Triple.getEnvironmentName()),
1484 Builder.defineMacro(
"__RENDERSCRIPT__");