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 if (std::optional<AArch64::ExtensionInfo> Ext =
71 for (
const StringRef Feature : Features) {
75 FeatureBits.
enable(*FMV->ID);
77 PriorityMask.
setBit(FMV->PriorityBit);
84 PriorityMask.
setBit(Info.PriorityBit);
95 FeatureBits.
enable(*FMV->ID);
101 FeaturesMask.
setBit(*Info.FeatureBit);
108 std::vector<StringRef> &Features) {
111 if (InputExts.
test(E.ID) && !E.PosTargetFeature.empty())
112 Features.push_back(E.PosTargetFeature);
118 for (
const auto &
A : CpuAliases)
119 if (
A.AltName == Name)
129 assert(!(AE.has_value() && AE->NegTargetFeature.empty()));
130 return IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature;
137 for (
const auto &
C : CpuInfos)
140 for (
const auto &
Alias : CpuAliases)
149 return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
150 TT.isOSWindows() || TT.isOHOSFamily();
160 for (
const auto *
A : ArchInfos) {
161 if (
A->Name.ends_with(Syn))
167std::optional<AArch64::ExtensionInfo>
172 if (ArchExt ==
A.UserVisibleName || ArchExt ==
A.Alias)
180 if (FMVExt ==
"rdma")
184 if (FMVExt ==
I.Name)
190std::optional<AArch64::ExtensionInfo>
193 if (TargetFeature == E.PosTargetFeature ||
194 TargetFeature == E.NegTargetFeature)
204 for (
const auto &
C : CpuInfos)
212 outs() <<
"All available -march extensions for AArch64\n\n"
218 if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) {
220 <<
format(Ext.Description.empty() ?
"%-20s%s\n" :
"%-20s%-55s%s\n",
221 Ext.UserVisibleName.str().c_str(),
222 Ext.ArchFeatureName.str().c_str(),
223 Ext.Description.str().c_str());
230 outs() <<
"Extensions enabled for the given AArch64 target\n\n"
233 std::vector<ExtensionInfo> EnabledExtensionsInfo;
234 for (
const auto &FeatureName : EnabledFeatureNames) {
235 std::string PosFeatureName =
'+' + FeatureName.str();
237 EnabledExtensionsInfo.push_back(*ExtInfo);
240 std::sort(EnabledExtensionsInfo.begin(), EnabledExtensionsInfo.end(),
242 return Lhs.ArchFeatureName < Rhs.ArchFeatureName;
245 for (
const auto &Ext : EnabledExtensionsInfo) {
248 Ext.ArchFeatureName.str().c_str(),
249 Ext.Description.str().c_str());
255 for (
const auto &
E : llvm::AArch64::Extensions)
273 for (
auto Dep : ExtensionDependencies)
281 if (E == AEK_FP16 &&
BaseArch->is_superset(ARMV8_4A) &&
286 if (E == AEK_CRYPTO &&
BaseArch->is_superset(ARMV8_4A)) {
296 if (E == AEK_CRYPTO) {
307 if (E == AEK_SVE2AES)
314 if (E == AEK_SVE2SM4)
321 if (E == AEK_SVE2SHA3)
324 if (E == AEK_SVE2BITPERM){
338 for (
auto Dep : ExtensionDependencies)
339 if (E == Dep.Earlier)
349 if (CPUExtensions.
test(E.ID))
363 const bool AllowNoDashForm) {
368 if (AllowNoDashForm && Modifier.
starts_with(
"no-"))
372 bool IsNegated = NChars != 0;
376 if (AE->PosTargetFeature.empty() || AE->NegTargetFeature.empty())
388 const std::vector<std::string> &Features,
389 std::vector<std::string> &NonExtensions) {
391 for (
auto &
F : Features) {
392 bool IsNegated =
F[0] ==
'-';
401 NonExtensions.push_back(
F);
406 std::vector<StringRef> Features;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
std::optional< AArch64::FMVInfo > getFMVInfoFrom(StringRef Feature)
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")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
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)
Bitset< AEK_NUM_EXTENSIONS > ExtensionBitset
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)
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)
void toLLVMFeatureList(std::vector< T > &Features) const
LLVM_ABI void dump() const
const ArchInfo * BaseArch
LLVM_ABI void addArchDefaults(const ArchInfo &Arch)
LLVM_ABI void reconstructFromParsedFeatures(const std::vector< std::string > &Features, std::vector< std::string > &NonExtensions)