Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/AArch64.h
35269 views
//===--- AArch64.h - Declare AArch64 target feature support -----*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file declares AArch64 TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H13#define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H1415#include "OSTargets.h"16#include "clang/Basic/TargetBuiltins.h"17#include "llvm/TargetParser/AArch64TargetParser.h"18#include <optional>1920namespace clang {21namespace targets {2223class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {24virtual void setDataLayout() = 0;25static const TargetInfo::GCCRegAlias GCCRegAliases[];26static const char *const GCCRegNames[];2728enum FPUModeEnum {29FPUMode = (1 << 0),30NeonMode = (1 << 1),31SveMode = (1 << 2),32};3334unsigned FPU = FPUMode;35bool HasCRC = false;36bool HasAES = false;37bool HasSHA2 = false;38bool HasSHA3 = false;39bool HasSM4 = false;40bool HasFullFP16 = false;41bool HasDotProd = false;42bool HasFP16FML = false;43bool HasMTE = false;44bool HasTME = false;45bool HasPAuth = false;46bool HasLS64 = false;47bool HasRandGen = false;48bool HasMatMul = false;49bool HasBFloat16 = false;50bool HasSVE2 = false;51bool HasSVE2p1 = false;52bool HasSVE2AES = false;53bool HasSVE2SHA3 = false;54bool HasSVE2SM4 = false;55bool HasSVEB16B16 = false;56bool HasSVE2BitPerm = false;57bool HasMatmulFP64 = false;58bool HasMatmulFP32 = false;59bool HasLSE = false;60bool HasFlagM = false;61bool HasAlternativeNZCV = false;62bool HasMOPS = false;63bool HasD128 = false;64bool HasRCPC = false;65bool HasRDM = false;66bool HasDIT = false;67bool HasCCPP = false;68bool HasCCDP = false;69bool HasFRInt3264 = false;70bool HasSME = false;71bool HasSME2 = false;72bool HasSMEF64F64 = false;73bool HasSMEI16I64 = false;74bool HasSMEF16F16 = false;75bool HasSMEB16B16 = false;76bool HasSME2p1 = false;77bool HasSB = false;78bool HasPredRes = false;79bool HasSSBS = false;80bool HasBTI = false;81bool HasWFxT = false;82bool HasJSCVT = false;83bool HasFCMA = false;84bool HasNoFP = false;85bool HasNoNeon = false;86bool HasNoSVE = false;87bool HasFMV = true;88bool HasGCS = false;89bool HasRCPC3 = false;90bool HasSMEFA64 = false;91bool HasPAuthLR = false;9293const llvm::AArch64::ArchInfo *ArchInfo = &llvm::AArch64::ARMV8A;9495std::string ABI;9697public:98AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);99100StringRef getABI() const override;101bool setABI(const std::string &Name) override;102103bool validateBranchProtection(StringRef Spec, StringRef Arch,104BranchProtectionInfo &BPI,105StringRef &Err) const override;106107bool isValidCPUName(StringRef Name) const override;108void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;109bool setCPU(const std::string &Name) override;110111unsigned multiVersionSortPriority(StringRef Name) const override;112unsigned multiVersionFeatureCost() const override;113114bool useFP16ConversionIntrinsics() const override {115return false;116}117118void setArchFeatures();119120void getTargetDefinesARMV81A(const LangOptions &Opts,121MacroBuilder &Builder) const;122void getTargetDefinesARMV82A(const LangOptions &Opts,123MacroBuilder &Builder) const;124void getTargetDefinesARMV83A(const LangOptions &Opts,125MacroBuilder &Builder) const;126void getTargetDefinesARMV84A(const LangOptions &Opts,127MacroBuilder &Builder) const;128void getTargetDefinesARMV85A(const LangOptions &Opts,129MacroBuilder &Builder) const;130void getTargetDefinesARMV86A(const LangOptions &Opts,131MacroBuilder &Builder) const;132void getTargetDefinesARMV87A(const LangOptions &Opts,133MacroBuilder &Builder) const;134void getTargetDefinesARMV88A(const LangOptions &Opts,135MacroBuilder &Builder) const;136void getTargetDefinesARMV89A(const LangOptions &Opts,137MacroBuilder &Builder) const;138void getTargetDefinesARMV9A(const LangOptions &Opts,139MacroBuilder &Builder) const;140void getTargetDefinesARMV91A(const LangOptions &Opts,141MacroBuilder &Builder) const;142void getTargetDefinesARMV92A(const LangOptions &Opts,143MacroBuilder &Builder) const;144void getTargetDefinesARMV93A(const LangOptions &Opts,145MacroBuilder &Builder) const;146void getTargetDefinesARMV94A(const LangOptions &Opts,147MacroBuilder &Builder) const;148void getTargetDefinesARMV95A(const LangOptions &Opts,149MacroBuilder &Builder) const;150void getTargetDefines(const LangOptions &Opts,151MacroBuilder &Builder) const override;152153ArrayRef<Builtin::Info> getTargetBuiltins() const override;154155std::optional<std::pair<unsigned, unsigned>>156getVScaleRange(const LangOptions &LangOpts) const override;157bool doesFeatureAffectCodeGen(StringRef Name) const override;158bool validateCpuSupports(StringRef FeatureStr) const override;159bool hasFeature(StringRef Feature) const override;160void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,161bool Enabled) const override;162bool handleTargetFeatures(std::vector<std::string> &Features,163DiagnosticsEngine &Diags) override;164ParsedTargetAttr parseTargetAttr(StringRef Str) const override;165bool supportsTargetAttributeTune() const override { return true; }166bool supportsCpuSupports() const override { return true; }167bool checkArithmeticFenceSupported() const override { return true; }168169bool hasBFloat16Type() const override;170171CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;172173bool isCLZForZeroUndef() const override;174175BuiltinVaListKind getBuiltinVaListKind() const override;176177ArrayRef<const char *> getGCCRegNames() const override;178ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;179180std::string convertConstraint(const char *&Constraint) const override;181182bool validateAsmConstraint(const char *&Name,183TargetInfo::ConstraintInfo &Info) const override;184bool185validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,186std::string &SuggestedModifier) const override;187std::string_view getClobbers() const override;188189StringRef getConstraintRegister(StringRef Constraint,190StringRef Expression) const override {191return Expression;192}193194int getEHDataRegisterNumber(unsigned RegNo) const override;195196bool validatePointerAuthKey(const llvm::APSInt &value) const override;197198const char *getBFloat16Mangling() const override { return "u6__bf16"; };199bool hasInt128Type() const override;200201bool hasBitIntType() const override { return true; }202203bool validateTarget(DiagnosticsEngine &Diags) const override;204205bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize,206bool &HasSizeMismatch) const override;207};208209class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {210public:211AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);212213void getTargetDefines(const LangOptions &Opts,214MacroBuilder &Builder) const override;215private:216void setDataLayout() override;217};218219class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo220: public WindowsTargetInfo<AArch64leTargetInfo> {221const llvm::Triple Triple;222223public:224WindowsARM64TargetInfo(const llvm::Triple &Triple,225const TargetOptions &Opts);226227void setDataLayout() override;228229BuiltinVaListKind getBuiltinVaListKind() const override;230231CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;232};233234// Windows ARM, MS (C++) ABI235class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo236: public WindowsARM64TargetInfo {237public:238MicrosoftARM64TargetInfo(const llvm::Triple &Triple,239const TargetOptions &Opts);240241void getTargetDefines(const LangOptions &Opts,242MacroBuilder &Builder) const override;243TargetInfo::CallingConvKind244getCallingConvKind(bool ClangABICompat4) const override;245246unsigned getMinGlobalAlign(uint64_t TypeSize,247bool HasNonWeakDef) const override;248};249250// ARM64 MinGW target251class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo252: public WindowsARM64TargetInfo {253public:254MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);255};256257class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {258public:259AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);260void getTargetDefines(const LangOptions &Opts,261MacroBuilder &Builder) const override;262263private:264void setDataLayout() override;265};266267class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo268: public DarwinTargetInfo<AArch64leTargetInfo> {269public:270DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);271272BuiltinVaListKind getBuiltinVaListKind() const override;273274protected:275void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,276MacroBuilder &Builder) const override;277};278279// 64-bit RenderScript is aarch64280class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo281: public AArch64leTargetInfo {282public:283RenderScript64TargetInfo(const llvm::Triple &Triple,284const TargetOptions &Opts);285286void getTargetDefines(const LangOptions &Opts,287MacroBuilder &Builder) const override;288};289290} // namespace targets291} // namespace clang292293#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H294295296