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);
41 return &ArchInfos[Cpu->ArchIdx];
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))
112 Features.push_back(StrTab[E.PosTargetFeature]);
118 for (
const auto &
A : CpuAliases)
119 if (StrTab[
A.AltName] == Name)
120 return StrTab[
A.Name];
129 return StrTab[IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature];
134 for (
const auto &
C : CpuInfos)
135 Values.push_back(StrTab[
C.Name]);
137 for (
const auto &
Alias : CpuAliases)
146 return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
147 TT.isOSWindows() || TT.isOHOSFamily();
157 for (
const auto &
A : ArchInfos) {
158 if (StrTab[
A.Name].ends_with(Syn))
164std::optional<AArch64::ExtensionInfo>
169 if (ArchExt == StrTab[
A.UserVisibleName] || ArchExt == StrTab[
A.Alias])
177 if (FMVExt ==
"rdma")
181 if (FMVExt ==
I.Name)
187std::optional<AArch64::ExtensionInfo>
190 if (TargetFeature == StrTab[E.PosTargetFeature] ||
191 TargetFeature == StrTab[E.NegTargetFeature])
201 for (
const auto &
C : CpuInfos)
202 if (Name == StrTab[
C.Name])
209 outs() <<
"All available -march extensions for AArch64\n\n"
215 if (Ext.UserVisibleName.value() && Ext.PosTargetFeature.value()) {
219 <<
format(!Ext.Description.value() ?
"%-20s%s\n"
221 StrTab[Ext.UserVisibleName].data(),
222 StrTab[Ext.ArchFeatureName].data(),
223 StrTab[Ext.Description].data());
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 StrTab[Lhs.ArchFeatureName] < StrTab[Rhs.ArchFeatureName];
245 for (
const auto &Ext : EnabledExtensionsInfo) {
249 <<
format(
"%-55s%s\n", StrTab[Ext.ArchFeatureName].data(),
250 StrTab[Ext.Description].data());
256 for (
const auto &
E : llvm::AArch64::Extensions)
262void AArch64::ExtensionSet::enable(ArchExtKind E) {
276 for (
auto Dep : ExtensionDependencies)
284 if (E == AEK_FP16 &&
BaseArch->is_superset(ARMV8_4A) &&
289 if (E == AEK_CRYPTO &&
BaseArch->is_superset(ARMV8_4A)) {
296void AArch64::ExtensionSet::disable(ArchExtKind E) {
299 if (E == AEK_CRYPTO) {
310 if (E == AEK_SVE2AES)
317 if (E == AEK_SVE2SM4)
324 if (E == AEK_SVE2SHA3)
327 if (E == AEK_SVE2BITPERM){
343 for (
auto Dep : ExtensionDependencies)
344 if (E == Dep.Earlier)
348void AArch64::ExtensionSet::addCPUDefaults(
const CpuInfo &CPU) {
353 if (CPU.DefaultExtensions.test(E.ID))
357void AArch64::ExtensionSet::addArchDefaults(
const ArchInfo &Arch) {
366bool AArch64::ExtensionSet::parseModifier(
StringRef Modifier,
367 const bool AllowNoDashForm) {
372 if (AllowNoDashForm && Modifier.
starts_with(
"no-"))
376 bool IsNegated = NChars != 0;
389void AArch64::ExtensionSet::reconstructFromParsedFeatures(
390 const std::vector<std::string> &Features,
391 std::vector<std::string> &NonExtensions) {
393 for (
auto &
F : Features) {
394 bool IsNegated =
F[0] ==
'-';
403 NonExtensions.push_back(
F);
407void AArch64::ExtensionSet::dump()
const {
408 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")
static cl::opt< ExtensionSet, 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.
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...
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
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
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.
RelativeUniformCounterPtr Values
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.
StringTable::Offset AltName
AArch64::ExtensionBitset DefaultExts
static LLVM_ABI std::optional< ArchInfo > findBySubArch(StringRef SubArch)
LLVM_ABI void enable(ArchExtKind E)
LLVM_ABI void disable(ArchExtKind E)
void toLLVMFeatureList(std::vector< T > &Features) const
const ArchInfo * BaseArch