26 .
Case(
"thumb,arm",
"arm,thumb")
34 for (
const auto &
A : ARMArchNames) {
35 if (
A.Name.ends_with(Syn))
38 return ArchKind::INVALID;
46 case ArchKind::ARMV4T:
48 case ArchKind::ARMV5T:
49 case ArchKind::ARMV5TE:
50 case ArchKind::IWMMXT:
51 case ArchKind::IWMMXT2:
52 case ArchKind::XSCALE:
53 case ArchKind::ARMV5TEJ:
56 case ArchKind::ARMV6K:
57 case ArchKind::ARMV6T2:
58 case ArchKind::ARMV6KZ:
59 case ArchKind::ARMV6M:
61 case ArchKind::ARMV7A:
62 case ArchKind::ARMV7VE:
63 case ArchKind::ARMV7R:
64 case ArchKind::ARMV7M:
65 case ArchKind::ARMV7S:
66 case ArchKind::ARMV7EM:
67 case ArchKind::ARMV7K:
69 case ArchKind::ARMV8A:
70 case ArchKind::ARMV8_1A:
71 case ArchKind::ARMV8_2A:
72 case ArchKind::ARMV8_3A:
73 case ArchKind::ARMV8_4A:
74 case ArchKind::ARMV8_5A:
75 case ArchKind::ARMV8_6A:
76 case ArchKind::ARMV8_7A:
77 case ArchKind::ARMV8_8A:
78 case ArchKind::ARMV8_9A:
79 case ArchKind::ARMV8R:
80 case ArchKind::ARMV8MBaseline:
81 case ArchKind::ARMV8MMainline:
82 case ArchKind::ARMV8_1MMainline:
84 case ArchKind::ARMV9A:
85 case ArchKind::ARMV9_1A:
86 case ArchKind::ARMV9_2A:
87 case ArchKind::ARMV9_3A:
88 case ArchKind::ARMV9_4A:
89 case ArchKind::ARMV9_5A:
91 case ArchKind::INVALID:
99 case ARM::ArchKind::ARMV6M:
100 case ARM::ArchKind::ARMV7M:
101 case ARM::ArchKind::ARMV7EM:
102 case ARM::ArchKind::ARMV8MMainline:
103 case ARM::ArchKind::ARMV8MBaseline:
104 case ARM::ArchKind::ARMV8_1MMainline:
105 return ARM::ProfileKind::M;
106 case ARM::ArchKind::ARMV7R:
107 case ARM::ArchKind::ARMV8R:
108 return ARM::ProfileKind::R;
109 case ARM::ArchKind::ARMV7A:
110 case ARM::ArchKind::ARMV7VE:
111 case ARM::ArchKind::ARMV7K:
112 case ARM::ArchKind::ARMV8A:
113 case ARM::ArchKind::ARMV8_1A:
114 case ARM::ArchKind::ARMV8_2A:
115 case ARM::ArchKind::ARMV8_3A:
116 case ARM::ArchKind::ARMV8_4A:
117 case ARM::ArchKind::ARMV8_5A:
118 case ARM::ArchKind::ARMV8_6A:
119 case ARM::ArchKind::ARMV8_7A:
120 case ARM::ArchKind::ARMV8_8A:
121 case ARM::ArchKind::ARMV8_9A:
122 case ARM::ArchKind::ARMV9A:
123 case ARM::ArchKind::ARMV9_1A:
124 case ARM::ArchKind::ARMV9_2A:
125 case ARM::ArchKind::ARMV9_3A:
126 case ARM::ArchKind::ARMV9_4A:
127 case ARM::ArchKind::ARMV9_5A:
128 return ARM::ProfileKind::A;
129 case ARM::ArchKind::ARMV4:
130 case ARM::ArchKind::ARMV4T:
131 case ARM::ArchKind::ARMV5T:
132 case ARM::ArchKind::ARMV5TE:
133 case ARM::ArchKind::ARMV5TEJ:
134 case ARM::ArchKind::ARMV6:
135 case ARM::ArchKind::ARMV6K:
136 case ARM::ArchKind::ARMV6T2:
137 case ARM::ArchKind::ARMV6KZ:
138 case ARM::ArchKind::ARMV7S:
139 case ARM::ArchKind::IWMMXT:
140 case ARM::ArchKind::IWMMXT2:
141 case ARM::ArchKind::XSCALE:
142 case ARM::ArchKind::INVALID:
143 return ARM::ProfileKind::INVALID;
155 std::vector<StringRef> &Features) {
160 static const struct FPUFeatureNameInfo {
161 const char *PlusName, *MinusName;
164 } FPUFeatureInfoList[] = {
172 {
"+vfp2",
"-vfp2", FPUVersion::VFPV2, FPURestriction::D16},
173 {
"+vfp2sp",
"-vfp2sp", FPUVersion::VFPV2, FPURestriction::SP_D16},
174 {
"+vfp3",
"-vfp3", FPUVersion::VFPV3, FPURestriction::None},
175 {
"+vfp3d16",
"-vfp3d16", FPUVersion::VFPV3, FPURestriction::D16},
176 {
"+vfp3d16sp",
"-vfp3d16sp", FPUVersion::VFPV3, FPURestriction::SP_D16},
177 {
"+vfp3sp",
"-vfp3sp", FPUVersion::VFPV3, FPURestriction::None},
178 {
"+fp16",
"-fp16", FPUVersion::VFPV3_FP16, FPURestriction::SP_D16},
179 {
"+vfp4",
"-vfp4", FPUVersion::VFPV4, FPURestriction::None},
180 {
"+vfp4d16",
"-vfp4d16", FPUVersion::VFPV4, FPURestriction::D16},
181 {
"+vfp4d16sp",
"-vfp4d16sp", FPUVersion::VFPV4, FPURestriction::SP_D16},
182 {
"+vfp4sp",
"-vfp4sp", FPUVersion::VFPV4, FPURestriction::None},
183 {
"+fp-armv8",
"-fp-armv8", FPUVersion::VFPV5, FPURestriction::None},
184 {
"+fp-armv8d16",
"-fp-armv8d16", FPUVersion::VFPV5, FPURestriction::D16},
185 {
"+fp-armv8d16sp",
"-fp-armv8d16sp", FPUVersion::VFPV5, FPURestriction::SP_D16},
186 {
"+fp-armv8sp",
"-fp-armv8sp", FPUVersion::VFPV5, FPURestriction::None},
187 {
"+fullfp16",
"-fullfp16", FPUVersion::VFPV5_FULLFP16, FPURestriction::SP_D16},
188 {
"+fp64",
"-fp64", FPUVersion::VFPV2, FPURestriction::D16},
189 {
"+d32",
"-d32", FPUVersion::VFPV3, FPURestriction::None},
192 for (
const auto &
Info: FPUFeatureInfoList) {
194 FPUNames[
FPUKind].Restriction <=
Info.MaxRestriction)
195 Features.push_back(
Info.PlusName);
197 Features.push_back(
Info.MinusName);
200 static const struct NeonFeatureNameInfo {
201 const char *PlusName, *MinusName;
203 } NeonFeatureInfoList[] = {
204 {
"+neon",
"-neon", NeonSupportLevel::Neon},
205 {
"+sha2",
"-sha2", NeonSupportLevel::Crypto},
206 {
"+aes",
"-aes", NeonSupportLevel::Crypto},
209 for (
const auto &
Info: NeonFeatureInfoList) {
210 if (FPUNames[
FPUKind].NeonSupport >=
Info.MinSupportLevel)
211 Features.push_back(
Info.PlusName);
213 Features.push_back(
Info.MinusName);
221 for (
const auto &
F : FPUNames) {
230 return NeonSupportLevel::None;
231 return FPUNames[
FPUKind].NeonSupport;
236 .
Cases(
"fpa",
"fpe2",
"fpe3",
"maverick",
"invalid")
237 .
Case(
"vfp2",
"vfpv2")
238 .
Case(
"vfp3",
"vfpv3")
239 .
Case(
"vfp4",
"vfpv4")
240 .
Case(
"vfp3-d16",
"vfpv3-d16")
241 .
Case(
"vfp4-d16",
"vfpv4-d16")
242 .
Cases(
"fp4-sp-d16",
"vfpv4-sp-d16",
"fpv4-sp-d16")
243 .
Cases(
"fp4-dp-d16",
"fpv4-dp-d16",
"vfpv4-d16")
244 .
Case(
"fp5-sp-d16",
"fpv5-sp-d16")
245 .
Cases(
"fp5-dp-d16",
"fpv5-dp-d16",
"fpv5-d16")
247 .
Case(
"neon-vfpv3",
"neon")
259 return FPUVersion::NONE;
260 return FPUNames[
FPUKind].FPUVer;
265 return FPURestriction::None;
266 return FPUNames[
FPUKind].Restriction;
270 if (CPU ==
"generic")
274#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
275 .Case(NAME, DEFAULT_FPU)
276#include "llvm/TargetParser/ARMTargetParser.def"
281 if (CPU ==
"generic")
285#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
287 ARMArchNames[static_cast<unsigned>(ArchKind::ID)].ArchBaseExtensions | \
289#include "llvm/TargetParser/ARMTargetParser.def"
294 std::vector<StringRef> &Features) {
300 Features.push_back(
"+hwdiv-arm");
302 Features.push_back(
"-hwdiv-arm");
305 Features.push_back(
"+hwdiv");
307 Features.push_back(
"-hwdiv");
313 std::vector<StringRef> &Features) {
319 if ((
Extensions & AE.ID) == AE.ID && !AE.Feature.empty())
320 Features.push_back(AE.Feature);
321 else if (!AE.NegFeature.empty())
322 Features.push_back(AE.NegFeature);
329 return ARMArchNames[
static_cast<unsigned>(AK)].
Name;
333 return ARMArchNames[
static_cast<unsigned>(AK)].CPUAttr;
337 return ARMArchNames[
static_cast<unsigned>(AK)].
getSubArch();
341 return ARMArchNames[
static_cast<unsigned>(AK)].ArchAttr;
353 return Name.consume_front(
"no");
359 if (!AE.Feature.empty() && ArchExt == AE.Name)
360 return StringRef(Negated ? AE.NegFeature : AE.Feature);
367 if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE)
368 return ARM::FK_INVALID;
380 if (CandidateFPU.FPUVer == InputFPU.
FPUVer &&
381 CandidateFPU.NeonSupport == InputFPU.
NeonSupport &&
385 return CandidateFPU.
ID;
390 return ARM::FK_INVALID;
394 if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE)
395 return ARM::FK_INVALID;
407 if (CandidateFPU.FPUVer == InputFPU.
FPUVer &&
408 CandidateFPU.NeonSupport == InputFPU.
NeonSupport &&
412 return CandidateFPU.
ID;
417 return ARM::FK_INVALID;
422 std::vector<StringRef> &Features,
425 size_t StartingNumFeatures = Features.size();
434 if ((AE.ID &
ID) ==
ID && !AE.NegFeature.empty())
435 Features.push_back(AE.NegFeature);
437 if ((AE.ID &
ID) == AE.ID && !AE.Feature.empty())
438 Features.push_back(AE.Feature);
445 if (ArchExt ==
"fp" || ArchExt ==
"fp.dp") {
448 if (ArchExt ==
"fp.dp") {
449 const bool IsDP = ArgFPUKind != ARM::FK_INVALID &&
450 ArgFPUKind != ARM::FK_NONE &&
456 if (ArgFPUKind != ARM::FK_INVALID && !IsDP)
459 if (
FPUKind == ARM::FK_INVALID)
465 if (
FPUKind == ARM::FK_INVALID)
468 }
else if (Negated) {
476 return StartingNumFeatures != Features.size();
481 return ARM::ArchKind::INVALID;
482 if (AK < ARM::ArchKind::ARMV9A || AK > ARM::ArchKind::ARMV9_3A)
483 return ARM::ArchKind::INVALID;
484 unsigned AK_v8 =
static_cast<unsigned>(ARM::ArchKind::ARMV8_5A);
485 AK_v8 +=
static_cast<unsigned>(AK) -
486 static_cast<unsigned>(ARM::ArchKind::ARMV9A);
492 if (AK == ArchKind::INVALID)
497 if (CPU.ArchID == AK && CPU.Default)
516 if (ArchExt ==
A.Name)
527 return ArchKind::INVALID;
532 if (Arch.ArchID != ArchKind::INVALID)
541 if (
TT.isOSBinFormatMachO()) {
549 }
else if (
TT.isOSWindows())
554 switch (
TT.getEnvironment()) {
561 return "aapcs-linux";
568 if (
TT.isOSFreeBSD() ||
TT.isOSOpenBSD() ||
TT.isOSHaiku() ||
570 return "aapcs-linux";
586 if (!MArch.
empty() && MArch ==
"v6")
587 return "arm1176jzf-s";
588 if (!MArch.
empty() && MArch ==
"v7")
613 if (!CPU.
empty() && CPU !=
"invalid")
620 return "arm1176jzf-s";
639 return "arm1176jzf-s";
649 outs() <<
"All available -march extensions for ARM\n\n"
651 << (DescMap.
empty() ?
"\n" :
"Description\n");
654 if (!Ext.Feature.empty()) {
655 std::string Description = DescMap[Ext.Name].str();
657 <<
format(Description.empty() ?
"%s\n" :
"%-20s%s\n",
658 Ext.Name.str().c_str(), Description.c_str());
static ARM::FPUKind findSinglePrecisionFPU(ARM::FPUKind InputFPUKind)
static StringRef getHWDivSynonym(StringRef HWDiv)
static bool stripNegationPrefix(StringRef &Name)
static ARM::ProfileKind getProfileKind(ARM::ArchKind AK)
static ARM::FPUKind findDoublePrecisionFPU(ARM::FPUKind InputFPUKind)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
static cl::opt< std::set< SPIRV::Extension::Extension >, false, SPIRVExtensionsParser > Extensions("spirv-ext", cl::desc("Specify list of enabled SPIR-V extensions"))
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static Triple::ArchType parseArch(StringRef ArchName)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
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 bool empty() const
empty - Check if the string is empty.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, T Value)
Triple - Helper class for working with autoconf configuration names.
OSType getOS() const
Get the parsed operating system type of this triple.
EnvironmentType getEnvironment() const
Get the parsed environment type of this triple.
StringRef getArchName() const
Get the architecture (first) component of the triple.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
StringRef getArchExtName(uint64_t ArchExtKind)
StringRef getFPUSynonym(StringRef FPU)
bool getFPUFeatures(FPUKind FPUKind, std::vector< StringRef > &Features)
StringRef getCanonicalArchName(StringRef Arch)
MArch is expected to be of the form (arm|thumb)?(eb)?(v.
uint64_t parseHWDiv(StringRef HWDiv)
StringRef getCPUAttr(ArchKind AK)
StringRef getArchName(ArchKind AK)
StringRef computeDefaultTargetABI(const Triple &TT, StringRef CPU)
void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values)
static const FPUName FPUNames[]
uint64_t parseArchExt(StringRef ArchExt)
ArchKind convertV9toV8(ArchKind AK)
ArchKind parseArch(StringRef Arch)
FPURestriction getFPURestriction(FPUKind FPUKind)
bool appendArchExtFeatures(StringRef CPU, ARM::ArchKind AK, StringRef ArchExt, std::vector< StringRef > &Features, FPUKind &ArgFPUKind)
const struct llvm::ARM::@429 HWDivNames[]
StringRef getArchSynonym(StringRef Arch)
Converts e.g. "armv8" -> "armv8-a".
StringRef getDefaultCPU(StringRef Arch)
StringRef getArchExtFeature(StringRef ArchExt)
const CpuNames CPUNames[]
ProfileKind parseArchProfile(StringRef Arch)
FPUKind parseFPU(StringRef FPU)
StringRef getSubArch(ArchKind AK)
static const ArchNames ARMArchNames[]
StringRef getARMCPUForArch(const llvm::Triple &Triple, StringRef MArch={})
Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
unsigned parseArchVersion(StringRef Arch)
const ExtName ARCHExtNames[]
bool has32Regs(const FPURestriction restriction)
NeonSupportLevel getFPUNeonSupportLevel(FPUKind FPUKind)
ArchKind parseCPUArch(StringRef CPU)
bool isDoublePrecision(const FPURestriction restriction)
unsigned getArchAttr(ArchKind AK)
StringRef getFPUName(FPUKind FPUKind)
FPUVersion getFPUVersion(FPUKind FPUKind)
bool getHWDivFeatures(uint64_t HWDivKind, std::vector< StringRef > &Features)
uint64_t getDefaultExtensions(StringRef CPU, ArchKind AK)
FPUKind getDefaultFPU(StringRef CPU, ArchKind AK)
bool getExtensionFeatures(uint64_t Extensions, std::vector< StringRef > &Features)
void PrintSupportedExtensions(StringMap< StringRef > DescMap)
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
FormattedString left_justify(StringRef Str, unsigned Width)
left_justify - append spaces after string so total output is Width characters.
FPURestriction Restriction
NeonSupportLevel NeonSupport