23#define DEBUG_TYPE "target-parser"
28#include "llvm/TargetParser/AArch64TargetParserDef.inc"
31 if (Arch.
size() >= 2 && Arch[0] ==
'v' && std::isdigit(Arch[1]))
32 return (Arch[1] - 48);
38 std::optional<CpuInfo> Cpu =
parseCpu(CPU);
45 for (
const auto *
A : AArch64::ArchInfos)
46 if (
A->getSubArch() == SubArch)
51std::optional<AArch64::FMVInfo>
lookupFMVByID(AArch64::ArchExtKind ExtID) {
61 for (
const StringRef Feature : Features) {
63 if (!FMV && Feature.starts_with(
'+')) {
68 FeatureBits.
enable(*FMV->ID);
99 std::vector<StringRef> &Features) {
102 if (InputExts.
test(E.ID) && !E.PosTargetFeature.empty())
103 Features.push_back(E.PosTargetFeature);
109 for (
const auto &
A : CpuAliases)
110 if (
A.AltName ==
Name)
120 assert(!(AE.has_value() && AE->NegTargetFeature.empty()));
121 return IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature;
128 for (
const auto &
C : CpuInfos)
131 for (
const auto &
Alias : CpuAliases)
140 return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
141 TT.isOSWindows() || TT.isOHOSFamily();
151 for (
const auto *
A : ArchInfos) {
152 if (
A->Name.ends_with(Syn))
158std::optional<AArch64::ExtensionInfo>
163 if (ArchExt ==
A.UserVisibleName || ArchExt ==
A.Alias)
171 if (FMVExt ==
"rdma")
175 if (FMVExt ==
I.Name)
181std::optional<AArch64::ExtensionInfo>
184 if (TargetFeature == E.PosTargetFeature ||
185 TargetFeature == E.NegTargetFeature)
195 for (
const auto &
C : CpuInfos)
203 outs() <<
"All available -march extensions for AArch64\n\n"
209 if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) {
211 <<
format(Ext.Description.empty() ?
"%-20s%s\n" :
"%-20s%-55s%s\n",
212 Ext.UserVisibleName.str().c_str(),
213 Ext.ArchFeatureName.str().c_str(),
214 Ext.Description.str().c_str());
221 outs() <<
"Extensions enabled for the given AArch64 target\n\n"
224 std::vector<ExtensionInfo> EnabledExtensionsInfo;
225 for (
const auto &FeatureName : EnabledFeatureNames) {
226 std::string PosFeatureName =
'+' + FeatureName.str();
228 EnabledExtensionsInfo.push_back(*ExtInfo);
231 std::sort(EnabledExtensionsInfo.begin(), EnabledExtensionsInfo.end(),
233 return Lhs.ArchFeatureName < Rhs.ArchFeatureName;
236 for (
const auto &Ext : EnabledExtensionsInfo) {
239 Ext.ArchFeatureName.str().c_str(),
240 Ext.Description.str().c_str());
246 for (
const auto &E : llvm::AArch64::Extensions)
264 for (
auto Dep : ExtensionDependencies)
272 if (E == AEK_FP16 && BaseArch->is_superset(ARMV8_4A) &&
273 !BaseArch->is_superset(ARMV9A))
277 if (E == AEK_CRYPTO && BaseArch->is_superset(ARMV8_4A)) {
287 if (E == AEK_CRYPTO) {
298 if (E == AEK_SVE2AES)
305 if (E == AEK_SVE2SM4)
312 if (E == AEK_SVE2SHA3)
313 disable(AEK_SVESHA3);
315 if (E == AEK_SVE2BITPERM){
316 disable(AEK_SVEBITPERM);
329 for (
auto Dep : ExtensionDependencies)
330 if (E == Dep.Earlier)
336 BaseArch = &CPU.
Arch;
340 if (CPUExtensions.
test(E.ID))
354 const bool AllowNoDashForm) {
359 if (AllowNoDashForm && Modifier.
starts_with(
"no-"))
363 bool IsNegated = NChars != 0;
367 if (AE->PosTargetFeature.empty() || AE->NegTargetFeature.empty())
379 const std::vector<std::string> &Features,
380 std::vector<std::string> &NonExtensions) {
381 assert(Touched.none() &&
"Bitset already initialized");
382 for (
auto &
F : Features) {
383 bool IsNegated =
F[0] ==
'-';
392 NonExtensions.push_back(
F);
397 std::vector<StringRef> Features;
398 toLLVMFeatureList(Features);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static unsigned checkArchVersion(llvm::StringRef Arch)
const llvm::AArch64::ExtensionInfo & lookupExtensionByID(llvm::AArch64::ArchExtKind ExtID)
std::optional< AArch64::FMVInfo > lookupFMVByID(AArch64::ArchExtKind ExtID)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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"))
Class for arbitrary precision integers.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
constexpr bool test(unsigned I) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr size_t size() const
size - Get the string size.
Triple - Helper class for working with autoconf configuration names.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI bool isX18ReservedByDefault(const Triple &TT)
LLVM_ABI StringRef getArchExtFeature(StringRef ArchExt)
LLVM_ABI std::optional< ExtensionInfo > parseArchExtension(StringRef Extension)
LLVM_ABI std::optional< CpuInfo > parseCpu(StringRef Name)
LLVM_ABI const std::vector< FMVInfo > & getFMVInfo()
LLVM_ABI const ArchInfo * parseArch(StringRef Arch)
LLVM_ABI const ArchInfo * getArchForCpu(StringRef CPU)
LLVM_ABI const ExtensionInfo & getExtensionByID(ArchExtKind(ExtID))
LLVM_ABI void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values)
LLVM_ABI APInt getCpuSupportsMask(ArrayRef< StringRef > Features)
LLVM_ABI void printEnabledExtensions(const std::set< StringRef > &EnabledFeatureNames)
LLVM_ABI std::optional< FMVInfo > parseFMVExtension(StringRef Extension)
LLVM_ABI APInt getFMVPriority(ArrayRef< StringRef > Features)
LLVM_ABI void PrintSupportedExtensions()
LLVM_ABI std::optional< ExtensionInfo > targetFeatureToExtension(StringRef TargetFeature)
LLVM_ABI StringRef resolveCPUAlias(StringRef CPU)
LLVM_ABI bool getExtensionFeatures(const AArch64::ExtensionBitset &Extensions, std::vector< StringRef > &Features)
LLVM_ABI StringRef getCanonicalArchName(StringRef Arch)
MArch is expected to be of the form (arm|thumb)?(eb)?(v.
LLVM_ABI StringRef getArchSynonym(StringRef Arch)
Converts e.g. "armv8" -> "armv8-a".
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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.
AArch64::ExtensionBitset DefaultExts
static LLVM_ABI std::optional< ArchInfo > findBySubArch(StringRef SubArch)
AArch64::ExtensionBitset getImpliedExtensions() const
LLVM_ABI bool parseModifier(StringRef Modifier, const bool AllowNoDashForm=false)
LLVM_ABI void addCPUDefaults(const CpuInfo &CPU)
LLVM_ABI void enable(ArchExtKind E)
LLVM_ABI void disable(ArchExtKind E)
LLVM_ABI void dump() const
LLVM_ABI void addArchDefaults(const ArchInfo &Arch)
LLVM_ABI void reconstructFromParsedFeatures(const std::vector< std::string > &Features, std::vector< std::string > &NonExtensions)