1 //===--- AArch64.h - Declare AArch64 target feature support -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares AArch64 TargetInfo objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H 14 #define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H 15 16 #include "OSTargets.h" 17 #include "clang/Basic/TargetBuiltins.h" 18 #include "llvm/Support/TargetParser.h" 19 20 namespace clang { 21 namespace targets { 22 23 class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { 24 virtual void setDataLayout() = 0; 25 static const TargetInfo::GCCRegAlias GCCRegAliases[]; 26 static const char *const GCCRegNames[]; 27 28 enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) }; 29 30 unsigned FPU; 31 bool HasCRC; 32 bool HasCrypto; 33 bool HasAES; 34 bool HasSHA2; 35 bool HasSHA3; 36 bool HasSM4; 37 bool HasUnaligned; 38 bool HasFullFP16; 39 bool HasDotProd; 40 bool HasFP16FML; 41 bool HasMTE; 42 bool HasTME; 43 bool HasPAuth; 44 bool HasLS64; 45 bool HasRandGen; 46 bool HasMatMul; 47 bool HasSVE2; 48 bool HasSVE2AES; 49 bool HasSVE2SHA3; 50 bool HasSVE2SM4; 51 bool HasSVE2BitPerm; 52 bool HasMatmulFP64; 53 bool HasMatmulFP32; 54 bool HasLSE; 55 bool HasFlagM; 56 57 llvm::AArch64::ArchKind ArchKind; 58 59 static const Builtin::Info BuiltinInfo[]; 60 61 std::string ABI; 62 63 public: 64 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 65 66 StringRef getABI() const override; 67 bool setABI(const std::string &Name) override; 68 69 bool validateBranchProtection(StringRef, BranchProtectionInfo &, 70 StringRef &) const override; 71 72 bool isValidCPUName(StringRef Name) const override; 73 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; 74 bool setCPU(const std::string &Name) override; 75 76 bool useFP16ConversionIntrinsics() const override { 77 return false; 78 } 79 80 void getTargetDefinesARMV81A(const LangOptions &Opts, 81 MacroBuilder &Builder) const; 82 void getTargetDefinesARMV82A(const LangOptions &Opts, 83 MacroBuilder &Builder) const; 84 void getTargetDefinesARMV83A(const LangOptions &Opts, 85 MacroBuilder &Builder) const; 86 void getTargetDefinesARMV84A(const LangOptions &Opts, 87 MacroBuilder &Builder) const; 88 void getTargetDefinesARMV85A(const LangOptions &Opts, 89 MacroBuilder &Builder) const; 90 void getTargetDefinesARMV86A(const LangOptions &Opts, 91 MacroBuilder &Builder) const; 92 void getTargetDefinesARMV87A(const LangOptions &Opts, 93 MacroBuilder &Builder) const; 94 void getTargetDefines(const LangOptions &Opts, 95 MacroBuilder &Builder) const override; 96 97 ArrayRef<Builtin::Info> getTargetBuiltins() const override; 98 99 bool hasFeature(StringRef Feature) const override; 100 bool handleTargetFeatures(std::vector<std::string> &Features, 101 DiagnosticsEngine &Diags) override; 102 103 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; 104 105 bool isCLZForZeroUndef() const override; 106 107 BuiltinVaListKind getBuiltinVaListKind() const override; 108 109 ArrayRef<const char *> getGCCRegNames() const override; 110 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 111 112 std::string convertConstraint(const char *&Constraint) const override { 113 std::string R; 114 switch (*Constraint) { 115 case 'U': // Three-character constraint; add "@3" hint for later parsing. 116 R = std::string("@3") + std::string(Constraint, 3); 117 Constraint += 2; 118 break; 119 default: 120 R = TargetInfo::convertConstraint(Constraint); 121 break; 122 } 123 return R; 124 } 125 126 bool validateAsmConstraint(const char *&Name, 127 TargetInfo::ConstraintInfo &Info) const override; 128 bool 129 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, 130 std::string &SuggestedModifier) const override; 131 const char *getClobbers() const override; 132 133 StringRef getConstraintRegister(StringRef Constraint, 134 StringRef Expression) const override { 135 return Expression; 136 } 137 138 int getEHDataRegisterNumber(unsigned RegNo) const override; 139 140 const char *getBFloat16Mangling() const override { return "u6__bf16"; }; 141 bool hasInt128Type() const override; 142 143 bool hasExtIntType() const override { return true; } 144 }; 145 146 class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { 147 public: 148 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 149 150 void getTargetDefines(const LangOptions &Opts, 151 MacroBuilder &Builder) const override; 152 private: 153 void setDataLayout() override; 154 }; 155 156 class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo 157 : public WindowsTargetInfo<AArch64leTargetInfo> { 158 const llvm::Triple Triple; 159 160 public: 161 WindowsARM64TargetInfo(const llvm::Triple &Triple, 162 const TargetOptions &Opts); 163 164 void setDataLayout() override; 165 166 BuiltinVaListKind getBuiltinVaListKind() const override; 167 168 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; 169 }; 170 171 // Windows ARM, MS (C++) ABI 172 class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo 173 : public WindowsARM64TargetInfo { 174 public: 175 MicrosoftARM64TargetInfo(const llvm::Triple &Triple, 176 const TargetOptions &Opts); 177 178 void getTargetDefines(const LangOptions &Opts, 179 MacroBuilder &Builder) const override; 180 TargetInfo::CallingConvKind 181 getCallingConvKind(bool ClangABICompat4) const override; 182 183 unsigned getMinGlobalAlign(uint64_t TypeSize) const override; 184 }; 185 186 // ARM64 MinGW target 187 class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo 188 : public WindowsARM64TargetInfo { 189 public: 190 MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 191 }; 192 193 class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { 194 public: 195 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 196 void getTargetDefines(const LangOptions &Opts, 197 MacroBuilder &Builder) const override; 198 199 private: 200 void setDataLayout() override; 201 }; 202 203 class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo 204 : public DarwinTargetInfo<AArch64leTargetInfo> { 205 public: 206 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); 207 208 BuiltinVaListKind getBuiltinVaListKind() const override; 209 210 protected: 211 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, 212 MacroBuilder &Builder) const override; 213 }; 214 215 // 64-bit RenderScript is aarch64 216 class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo 217 : public AArch64leTargetInfo { 218 public: 219 RenderScript64TargetInfo(const llvm::Triple &Triple, 220 const TargetOptions &Opts); 221 222 void getTargetDefines(const LangOptions &Opts, 223 MacroBuilder &Builder) const override; 224 }; 225 226 } // namespace targets 227 } // namespace clang 228 229 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H 230