AArch64.h revision 1.1.1.2 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