1 //===--- TargetBuiltins.h - Target specific builtin IDs ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 /// Enumerates target-specific builtins in their own namespaces within
11 /// namespace ::clang.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H
16 #define LLVM_CLANG_BASIC_TARGETBUILTINS_H
20 #include "clang/Basic/Builtins.h"
21 #include "llvm/Support/MathExtras.h"
28 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
29 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
30 #include "clang/Basic/BuiltinsNEON.def"
38 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
39 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
40 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
41 #include "clang/Basic/BuiltinsARM.def"
48 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
49 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
50 #include "clang/Basic/BuiltinsSVE.def"
58 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
59 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
60 FirstSVEBuiltin = NEON::FirstTSBuiltin,
61 LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
62 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
63 #include "clang/Basic/BuiltinsAArch64.def"
71 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
72 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
73 #include "clang/Basic/BuiltinsBPF.def"
81 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
82 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
83 #include "clang/Basic/BuiltinsPPC.def"
91 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
92 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
93 #include "clang/Basic/BuiltinsNVPTX.def"
101 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
102 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
103 #include "clang/Basic/BuiltinsAMDGPU.def"
111 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
112 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
113 #include "clang/Basic/BuiltinsX86.def"
115 LastX86CommonBuiltin = FirstX86_64Builtin - 1,
116 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
117 #include "clang/Basic/BuiltinsX86_64.def"
124 enum { LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, LastTSBuiltin };
127 /// Flags to identify the types for overloaded Neon builtins.
129 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
130 class NeonTypeFlags {
154 NeonTypeFlags(unsigned F) : Flags(F) {}
155 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
157 Flags |= UnsignedFlag;
162 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
163 bool isPoly() const {
164 EltType ET = getEltType();
165 return ET == Poly8 || ET == Poly16 || ET == Poly64;
167 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
168 bool isQuad() const { return (Flags & QuadFlag) != 0; }
171 /// Flags to identify the types for overloaded SVE builtins.
174 unsigned EltTypeShift;
175 unsigned MemEltTypeShift;
176 unsigned MergeTypeShift;
177 unsigned SplatOperandMaskShift;
180 #define LLVM_GET_SVE_TYPEFLAGS
181 #include "clang/Basic/arm_sve_typeflags.inc"
182 #undef LLVM_GET_SVE_TYPEFLAGS
185 #define LLVM_GET_SVE_ELTTYPES
186 #include "clang/Basic/arm_sve_typeflags.inc"
187 #undef LLVM_GET_SVE_ELTTYPES
191 #define LLVM_GET_SVE_MEMELTTYPES
192 #include "clang/Basic/arm_sve_typeflags.inc"
193 #undef LLVM_GET_SVE_MEMELTTYPES
197 #define LLVM_GET_SVE_MERGETYPES
198 #include "clang/Basic/arm_sve_typeflags.inc"
199 #undef LLVM_GET_SVE_MERGETYPES
203 #define LLVM_GET_SVE_IMMCHECKTYPES
204 #include "clang/Basic/arm_sve_typeflags.inc"
205 #undef LLVM_GET_SVE_IMMCHECKTYPES
208 SVETypeFlags(uint64_t F) : Flags(F) {
209 EltTypeShift = llvm::countTrailingZeros(EltTypeMask);
210 MemEltTypeShift = llvm::countTrailingZeros(MemEltTypeMask);
211 MergeTypeShift = llvm::countTrailingZeros(MergeTypeMask);
212 SplatOperandMaskShift = llvm::countTrailingZeros(SplatOperandMask);
215 EltType getEltType() const {
216 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
219 MemEltType getMemEltType() const {
220 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
223 MergeType getMergeType() const {
224 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
227 unsigned getSplatOperand() const {
228 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
231 bool hasSplatOperand() const {
232 return Flags & SplatOperandMask;
235 bool isLoad() const { return Flags & IsLoad; }
236 bool isStore() const { return Flags & IsStore; }
237 bool isGatherLoad() const { return Flags & IsGatherLoad; }
238 bool isScatterStore() const { return Flags & IsScatterStore; }
239 bool isStructLoad() const { return Flags & IsStructLoad; }
240 bool isStructStore() const { return Flags & IsStructStore; }
241 bool isZExtReturn() const { return Flags & IsZExtReturn; }
242 bool isByteIndexed() const { return Flags & IsByteIndexed; }
243 bool isOverloadNone() const { return Flags & IsOverloadNone; }
244 bool isOverloadWhile() const { return Flags & IsOverloadWhile; }
245 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
246 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
247 bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
248 bool isPrefetch() const { return Flags & IsPrefetch; }
249 bool isReverseCompare() const { return Flags & ReverseCompare; }
250 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
251 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
252 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
253 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
254 bool isUndef() const { return Flags & IsUndef; }
255 bool isTupleCreate() const { return Flags & IsTupleCreate; }
256 bool isTupleGet() const { return Flags & IsTupleGet; }
257 bool isTupleSet() const { return Flags & IsTupleSet; }
259 uint64_t getBits() const { return Flags; }
260 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
266 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
267 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
268 #include "clang/Basic/BuiltinsHexagon.def"
276 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
277 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
278 #include "clang/Basic/BuiltinsMips.def"
286 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
287 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
288 #include "clang/Basic/BuiltinsXCore.def"
296 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
297 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
298 #include "clang/Basic/BuiltinsLe64.def"
306 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
307 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
308 #include "clang/Basic/BuiltinsSystemZ.def"
313 /// WebAssembly builtins
314 namespace WebAssembly {
316 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
317 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
318 #include "clang/Basic/BuiltinsWebAssembly.def"
323 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
324 {NEON::FirstTSBuiltin, ARM::LastTSBuiltin, SVE::FirstTSBuiltin,
325 AArch64::LastTSBuiltin, BPF::LastTSBuiltin, PPC::LastTSBuiltin,
326 NVPTX::LastTSBuiltin, AMDGPU::LastTSBuiltin, X86::LastTSBuiltin,
327 Hexagon::LastTSBuiltin, Mips::LastTSBuiltin, XCore::LastTSBuiltin,
328 Le64::LastTSBuiltin, SystemZ::LastTSBuiltin,
329 WebAssembly::LastTSBuiltin});
331 } // end namespace clang.