clang 20.0.0git
TargetBuiltins.h
Go to the documentation of this file.
1//===--- TargetBuiltins.h - Target specific builtin IDs ---------*- 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/// \file
10/// Enumerates target-specific builtins in their own namespaces within
11/// namespace ::clang.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H
16#define LLVM_CLANG_BASIC_TARGETBUILTINS_H
17
18#include <algorithm>
19#include <stdint.h>
21#include "llvm/Support/MathExtras.h"
22#undef PPC
23
24namespace clang {
25
26 namespace NEON {
27 enum {
29#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
30#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
31#include "clang/Basic/BuiltinsNEON.def"
33 };
34 }
35
36 /// ARM builtins
37 namespace ARM {
38 enum {
41#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
42#include "clang/Basic/BuiltinsARM.def"
44 };
45 }
46
47 namespace SVE {
48 enum {
50#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
51#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
52#include "clang/Basic/BuiltinsSVE.def"
54 };
55 }
56
57 namespace SME {
58 enum {
60#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
61#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
62#include "clang/Basic/BuiltinsSME.def"
64 };
65 }
66
67 /// AArch64 builtins
68 namespace AArch64 {
69 enum {
76 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
77 #include "clang/Basic/BuiltinsAArch64.def"
79 };
80 }
81
82 /// BPF builtins
83 namespace BPF {
84 enum {
86 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
87 #include "clang/Basic/BuiltinsBPF.inc"
89 };
90 }
91
92 /// PPC builtins
93 namespace PPC {
94 enum {
96#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
97#include "clang/Basic/BuiltinsPPC.def"
99 };
100 }
101
102 /// NVPTX builtins
103 namespace NVPTX {
104 enum {
106#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
107#include "clang/Basic/BuiltinsNVPTX.def"
109 };
110 }
111
112 /// AMDGPU builtins
113 namespace AMDGPU {
114 enum {
116 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
117 #include "clang/Basic/BuiltinsAMDGPU.def"
119 };
120 }
121
122 /// X86 builtins
123 namespace X86 {
124 enum {
126#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
127#include "clang/Basic/BuiltinsX86.inc"
130#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
131#include "clang/Basic/BuiltinsX86_64.inc"
133 };
134 }
135
136 /// VE builtins
137 namespace VE {
138 enum {
140#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
141#include "clang/Basic/BuiltinsVE.def"
143 };
144 }
145
146 namespace RISCVVector {
147 enum {
149#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
150#include "clang/Basic/BuiltinsRISCVVector.def"
152 };
153 }
154
155 /// RISCV builtins
156 namespace RISCV {
157 enum {
161#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
162#include "clang/Basic/BuiltinsRISCV.inc"
164 };
165 } // namespace RISCV
166
167 /// LoongArch builtins
168 namespace LoongArch {
169 enum {
171#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
172#include "clang/Basic/BuiltinsLoongArch.def"
174 };
175 } // namespace LoongArch
176
177 /// Flags to identify the types for overloaded Neon builtins.
178 ///
179 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
181 enum {
182 EltTypeMask = 0xf,
183 UnsignedFlag = 0x10,
184 QuadFlag = 0x20
185 };
186 uint32_t Flags;
187
188 public:
189 enum EltType {
202 };
203
204 NeonTypeFlags(unsigned F) : Flags(F) {}
205 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
206 if (IsUnsigned)
207 Flags |= UnsignedFlag;
208 if (IsQuad)
209 Flags |= QuadFlag;
210 }
211
212 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
213 bool isPoly() const {
214 EltType ET = getEltType();
215 return ET == Poly8 || ET == Poly16 || ET == Poly64;
216 }
217 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
218 bool isQuad() const { return (Flags & QuadFlag) != 0; }
219 unsigned getEltSizeInBits() const {
220 switch (getEltType()) {
221 case Int8:
222 case Poly8:
223 return 8;
224 case Int16:
225 case Float16:
226 case Poly16:
227 case BFloat16:
228 return 16;
229 case Int32:
230 case Float32:
231 return 32;
232 case Int64:
233 case Float64:
234 case Poly64:
235 return 64;
236 case Poly128:
237 return 128;
238 }
239 llvm_unreachable("Invalid NeonTypeFlag!");
240 }
241 };
242
243 // Shared between SVE/SME and NEON
245#define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
246#include "clang/Basic/arm_immcheck_types.inc"
247#undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
248 };
249
250 /// Flags to identify the types for overloaded SVE builtins.
252 uint64_t Flags;
253 unsigned EltTypeShift;
254 unsigned MemEltTypeShift;
255 unsigned MergeTypeShift;
256 unsigned SplatOperandMaskShift;
257
258 public:
259#define LLVM_GET_SVE_TYPEFLAGS
260#include "clang/Basic/arm_sve_typeflags.inc"
261#undef LLVM_GET_SVE_TYPEFLAGS
262
263 enum EltType {
264#define LLVM_GET_SVE_ELTTYPES
265#include "clang/Basic/arm_sve_typeflags.inc"
266#undef LLVM_GET_SVE_ELTTYPES
267 };
268
270#define LLVM_GET_SVE_MEMELTTYPES
271#include "clang/Basic/arm_sve_typeflags.inc"
272#undef LLVM_GET_SVE_MEMELTTYPES
273 };
274
276#define LLVM_GET_SVE_MERGETYPES
277#include "clang/Basic/arm_sve_typeflags.inc"
278#undef LLVM_GET_SVE_MERGETYPES
279 };
280
281 SVETypeFlags(uint64_t F) : Flags(F) {
282 EltTypeShift = llvm::countr_zero(EltTypeMask);
283 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
284 MergeTypeShift = llvm::countr_zero(MergeTypeMask);
285 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
286 }
287
289 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
290 }
291
293 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
294 }
295
297 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
298 }
299
300 unsigned getSplatOperand() const {
301 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
302 }
303
304 bool hasSplatOperand() const {
305 return Flags & SplatOperandMask;
306 }
307
308 bool isLoad() const { return Flags & IsLoad; }
309 bool isStore() const { return Flags & IsStore; }
310 bool isGatherLoad() const { return Flags & IsGatherLoad; }
311 bool isScatterStore() const { return Flags & IsScatterStore; }
312 bool isStructLoad() const { return Flags & IsStructLoad; }
313 bool isStructStore() const { return Flags & IsStructStore; }
314 bool isZExtReturn() const { return Flags & IsZExtReturn; }
315 bool isByteIndexed() const { return Flags & IsByteIndexed; }
316 bool isOverloadNone() const { return Flags & IsOverloadNone; }
318 return Flags & IsOverloadWhileOrMultiVecCvt;
319 }
320 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
321 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
322 bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
323 bool isPrefetch() const { return Flags & IsPrefetch; }
324 bool isReverseCompare() const { return Flags & ReverseCompare; }
325 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
326 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
327 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
328 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
329 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
330 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
331 bool isUndef() const { return Flags & IsUndef; }
332 bool isTupleCreate() const { return Flags & IsTupleCreate; }
333 bool isTupleGet() const { return Flags & IsTupleGet; }
334 bool isTupleSet() const { return Flags & IsTupleSet; }
335 bool isReadZA() const { return Flags & IsReadZA; }
336 bool isWriteZA() const { return Flags & IsWriteZA; }
337 bool setsFPMR() const { return Flags & SetsFPMR; }
338 bool isReductionQV() const { return Flags & IsReductionQV; }
339 uint64_t getBits() const { return Flags; }
340 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
341 };
342
343 /// Hexagon builtins
344 namespace Hexagon {
345 enum {
347#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
348#include "clang/Basic/BuiltinsHexagon.def"
350 };
351 }
352
353 /// MIPS builtins
354 namespace Mips {
355 enum {
357#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
358#include "clang/Basic/BuiltinsMips.def"
360 };
361 }
362
363 /// XCore builtins
364 namespace XCore {
365 enum {
367#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
368#include "clang/Basic/BuiltinsXCore.def"
370 };
371 }
372
373 /// SystemZ builtins
374 namespace SystemZ {
375 enum {
377#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
378#include "clang/Basic/BuiltinsSystemZ.def"
380 };
381 }
382
383 /// WebAssembly builtins
384 namespace WebAssembly {
385 enum {
387#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
388#include "clang/Basic/BuiltinsWebAssembly.def"
390 };
391 }
392
393 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
399
400} // end namespace clang.
401
402#endif
Defines enum values for all the target-independent builtin functions.
Flags to identify the types for overloaded Neon builtins.
bool isUnsigned() const
NeonTypeFlags(unsigned F)
unsigned getEltSizeInBits() const
EltType getEltType() const
NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad)
Flags to identify the types for overloaded SVE builtins.
bool isZExtReturn() const
bool isReverseUSDOT() const
bool isOverloadNone() const
bool isUndef() const
MemEltType getMemEltType() const
bool isWriteZA() const
uint64_t getBits() const
bool isGatherLoad() const
bool isOverloadCvt() const
EltType getEltType() const
bool isOverloadDefault() const
bool isPrefetch() const
bool isOverloadWhileRW() const
bool isReadZA() const
bool isTupleSet() const
bool isReverseMergeAnyAccOp() const
bool isReductionQV() const
bool isTupleGet() const
bool isFlagSet(uint64_t Flag) const
bool isInsertOp1SVALL() const
bool isAppendSVALL() const
bool isReverseMergeAnyBinOp() const
bool isStructStore() const
bool isTupleCreate() const
bool isGatherPrefetch() const
SVETypeFlags(uint64_t F)
bool hasSplatOperand() const
MergeType getMergeType() const
bool isByteIndexed() const
bool isStructLoad() const
bool setsFPMR() const
bool isOverloadWhileOrMultiVecCvt() const
unsigned getSplatOperand() const
bool isStore() const
bool isScatterStore() const
bool isReverseCompare() const
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr uint64_t LargestBuiltinID