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:
90 case ArchKind::ARMV9_6A:
92 case ArchKind::INVALID:
100 case ARM::ArchKind::ARMV6M:
101 case ARM::ArchKind::ARMV7M:
102 case ARM::ArchKind::ARMV7EM:
103 case ARM::ArchKind::ARMV8MMainline:
104 case ARM::ArchKind::ARMV8MBaseline:
105 case ARM::ArchKind::ARMV8_1MMainline:
106 return ARM::ProfileKind::M;
107 case ARM::ArchKind::ARMV7R:
108 case ARM::ArchKind::ARMV8R:
109 return ARM::ProfileKind::R;
110 case ARM::ArchKind::ARMV7A:
111 case ARM::ArchKind::ARMV7VE:
112 case ARM::ArchKind::ARMV7K:
113 case ARM::ArchKind::ARMV8A:
114 case ARM::ArchKind::ARMV8_1A:
115 case ARM::ArchKind::ARMV8_2A:
116 case ARM::ArchKind::ARMV8_3A:
117 case ARM::ArchKind::ARMV8_4A:
118 case ARM::ArchKind::ARMV8_5A:
119 case ARM::ArchKind::ARMV8_6A:
120 case ARM::ArchKind::ARMV8_7A:
121 case ARM::ArchKind::ARMV8_8A:
122 case ARM::ArchKind::ARMV8_9A:
123 case ARM::ArchKind::ARMV9A:
124 case ARM::ArchKind::ARMV9_1A:
125 case ARM::ArchKind::ARMV9_2A:
126 case ARM::ArchKind::ARMV9_3A:
127 case ARM::ArchKind::ARMV9_4A:
128 case ARM::ArchKind::ARMV9_5A:
129 case ARM::ArchKind::ARMV9_6A:
130 return ARM::ProfileKind::A;
131 case ARM::ArchKind::ARMV4:
132 case ARM::ArchKind::ARMV4T:
133 case ARM::ArchKind::ARMV5T:
134 case ARM::ArchKind::ARMV5TE:
135 case ARM::ArchKind::ARMV5TEJ:
136 case ARM::ArchKind::ARMV6:
137 case ARM::ArchKind::ARMV6K:
138 case ARM::ArchKind::ARMV6T2:
139 case ARM::ArchKind::ARMV6KZ:
140 case ARM::ArchKind::ARMV7S:
141 case ARM::ArchKind::IWMMXT:
142 case ARM::ArchKind::IWMMXT2:
143 case ARM::ArchKind::XSCALE:
144 case ARM::ArchKind::INVALID:
145 return ARM::ProfileKind::INVALID;
157 std::vector<StringRef> &Features) {
162 static const struct FPUFeatureNameInfo {
163 const char *PlusName, *MinusName;
166 } FPUFeatureInfoList[] = {
174 {
"+vfp2",
"-vfp2", FPUVersion::VFPV2, FPURestriction::D16},
175 {
"+vfp2sp",
"-vfp2sp", FPUVersion::VFPV2, FPURestriction::SP_D16},
176 {
"+vfp3",
"-vfp3", FPUVersion::VFPV3, FPURestriction::None},
177 {
"+vfp3d16",
"-vfp3d16", FPUVersion::VFPV3, FPURestriction::D16},
178 {
"+vfp3d16sp",
"-vfp3d16sp", FPUVersion::VFPV3, FPURestriction::SP_D16},
179 {
"+vfp3sp",
"-vfp3sp", FPUVersion::VFPV3, FPURestriction::None},
180 {
"+fp16",
"-fp16", FPUVersion::VFPV3_FP16, FPURestriction::SP_D16},
181 {
"+vfp4",
"-vfp4", FPUVersion::VFPV4, FPURestriction::None},
182 {
"+vfp4d16",
"-vfp4d16", FPUVersion::VFPV4, FPURestriction::D16},
183 {
"+vfp4d16sp",
"-vfp4d16sp", FPUVersion::VFPV4, FPURestriction::SP_D16},
184 {
"+vfp4sp",
"-vfp4sp", FPUVersion::VFPV4, FPURestriction::None},
185 {
"+fp-armv8",
"-fp-armv8", FPUVersion::VFPV5, FPURestriction::None},
186 {
"+fp-armv8d16",
"-fp-armv8d16", FPUVersion::VFPV5, FPURestriction::D16},
187 {
"+fp-armv8d16sp",
"-fp-armv8d16sp", FPUVersion::VFPV5, FPURestriction::SP_D16},
188 {
"+fp-armv8sp",
"-fp-armv8sp", FPUVersion::VFPV5, FPURestriction::None},
189 {
"+fullfp16",
"-fullfp16", FPUVersion::VFPV5_FULLFP16, FPURestriction::SP_D16},
190 {
"+fp64",
"-fp64", FPUVersion::VFPV2, FPURestriction::D16},
191 {
"+d32",
"-d32", FPUVersion::VFPV3, FPURestriction::None},
194 for (
const auto &
Info: FPUFeatureInfoList) {
196 FPUNames[
FPUKind].Restriction <=
Info.MaxRestriction)
197 Features.push_back(
Info.PlusName);
199 Features.push_back(
Info.MinusName);
202 static const struct NeonFeatureNameInfo {
203 const char *PlusName, *MinusName;
205 } NeonFeatureInfoList[] = {
206 {
"+neon",
"-neon", NeonSupportLevel::Neon},
207 {
"+sha2",
"-sha2", NeonSupportLevel::Crypto},
208 {
"+aes",
"-aes", NeonSupportLevel::Crypto},
211 for (
const auto &
Info: NeonFeatureInfoList) {
212 if (FPUNames[
FPUKind].NeonSupport >=
Info.MinSupportLevel)
213 Features.push_back(
Info.PlusName);
215 Features.push_back(
Info.MinusName);
223 for (
const auto &
F : FPUNames) {
232 return NeonSupportLevel::None;
233 return FPUNames[
FPUKind].NeonSupport;
238 .
Cases(
"fpa",
"fpe2",
"fpe3",
"maverick",
"invalid")
239 .
Case(
"vfp2",
"vfpv2")
240 .
Case(
"vfp3",
"vfpv3")
241 .
Case(
"vfp4",
"vfpv4")
242 .
Case(
"vfp3-d16",
"vfpv3-d16")
243 .
Case(
"vfp4-d16",
"vfpv4-d16")
244 .
Cases(
"fp4-sp-d16",
"vfpv4-sp-d16",
"fpv4-sp-d16")
245 .
Cases(
"fp4-dp-d16",
"fpv4-dp-d16",
"vfpv4-d16")
246 .
Case(
"fp5-sp-d16",
"fpv5-sp-d16")
247 .
Cases(
"fp5-dp-d16",
"fpv5-dp-d16",
"fpv5-d16")
249 .
Case(
"neon-vfpv3",
"neon")
261 return FPUVersion::NONE;
262 return FPUNames[
FPUKind].FPUVer;
267 return FPURestriction::None;
268 return FPUNames[
FPUKind].Restriction;
272 if (CPU ==
"generic")
276#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
277 .Case(NAME, DEFAULT_FPU)
278#include "llvm/TargetParser/ARMTargetParser.def"
283 if (CPU ==
"generic")
287#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
289 ARMArchNames[static_cast<unsigned>(ArchKind::ID)].ArchBaseExtensions | \
291#include "llvm/TargetParser/ARMTargetParser.def"
296 std::vector<StringRef> &Features) {
302 Features.push_back(
"+hwdiv-arm");
304 Features.push_back(
"-hwdiv-arm");
307 Features.push_back(
"+hwdiv");
309 Features.push_back(
"-hwdiv");
315 std::vector<StringRef> &Features) {
321 if ((
Extensions & AE.ID) == AE.ID && !AE.Feature.empty())
322 Features.push_back(AE.Feature);
323 else if (!AE.NegFeature.empty())
324 Features.push_back(AE.NegFeature);
331 return ARMArchNames[
static_cast<unsigned>(AK)].
Name;
335 return ARMArchNames[
static_cast<unsigned>(AK)].CPUAttr;
339 return ARMArchNames[
static_cast<unsigned>(AK)].
getSubArch();
343 return ARMArchNames[
static_cast<unsigned>(AK)].ArchAttr;
355 return Name.consume_front(
"no");
361 if (!AE.Feature.empty() && ArchExt == AE.Name)
362 return StringRef(Negated ? AE.NegFeature : AE.Feature);
369 if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE)
370 return ARM::FK_INVALID;
382 if (CandidateFPU.FPUVer == InputFPU.
FPUVer &&
383 CandidateFPU.NeonSupport == InputFPU.
NeonSupport &&
387 return CandidateFPU.
ID;
392 return ARM::FK_INVALID;
396 if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE)
397 return ARM::FK_INVALID;
409 if (CandidateFPU.FPUVer == InputFPU.
FPUVer &&
410 CandidateFPU.NeonSupport == InputFPU.
NeonSupport &&
414 return CandidateFPU.
ID;
419 return ARM::FK_INVALID;
424 std::vector<StringRef> &Features,
427 size_t StartingNumFeatures = Features.size();
436 if ((AE.ID &
ID) ==
ID && !AE.NegFeature.empty())
437 Features.push_back(AE.NegFeature);
439 if ((AE.ID &
ID) == AE.ID && !AE.Feature.empty())
440 Features.push_back(AE.Feature);
447 if (ArchExt ==
"fp" || ArchExt ==
"fp.dp") {
450 if (ArchExt ==
"fp.dp") {
451 const bool IsDP = ArgFPUKind != ARM::FK_INVALID &&
452 ArgFPUKind != ARM::FK_NONE &&
458 if (ArgFPUKind != ARM::FK_INVALID && !IsDP)
461 if (
FPUKind == ARM::FK_INVALID)
467 if (
FPUKind == ARM::FK_INVALID)
470 }
else if (Negated) {
478 return StartingNumFeatures != Features.size();
483 return ARM::ArchKind::INVALID;
484 if (AK < ARM::ArchKind::ARMV9A || AK > ARM::ArchKind::ARMV9_3A)
485 return ARM::ArchKind::INVALID;
486 unsigned AK_v8 =
static_cast<unsigned>(ARM::ArchKind::ARMV8_5A);
487 AK_v8 +=
static_cast<unsigned>(AK) -
488 static_cast<unsigned>(ARM::ArchKind::ARMV9A);
494 if (AK == ArchKind::INVALID)
499 if (CPU.ArchID == AK && CPU.Default)
518 if (ArchExt ==
A.Name)
529 return ArchKind::INVALID;
534 if (Arch.ArchID != ArchKind::INVALID)
543 if (
TT.isOSBinFormatMachO()) {
551 }
else if (
TT.isOSWindows())
556 switch (
TT.getEnvironment()) {
565 return "aapcs-linux";
572 if (
TT.isOSFreeBSD() ||
TT.isOSOpenBSD() ||
TT.isOSHaiku() ||
574 return "aapcs-linux";
590 if (!MArch.
empty() && MArch ==
"v6")
591 return "arm1176jzf-s";
592 if (!MArch.
empty() && MArch ==
"v7")
617 if (!CPU.
empty() && CPU !=
"invalid")
624 return "arm1176jzf-s";
644 return "arm1176jzf-s";
654 outs() <<
"All available -march extensions for ARM\n\n"
656 << (DescMap.
empty() ?
"\n" :
"Description\n");
659 if (!Ext.Feature.empty()) {
660 std::string Description = DescMap[Ext.Name].str();
662 <<
format(Description.empty() ?
"%s\n" :
"%-20s%s\n",
663 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)
const struct llvm::ARM::@432 HWDivNames[]
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)
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