clang 22.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 GET_NEON_BUILTIN_ENUMERATORS
30#include "clang/Basic/arm_neon.inc"
33#include "clang/Basic/arm_fp16.inc"
34#undef GET_NEON_BUILTIN_ENUMERATORS
36 };
37 }
38
39 /// ARM builtins
40 namespace ARM {
41 enum {
44#define GET_MVE_BUILTIN_ENUMERATORS
45#include "clang/Basic/arm_mve_builtins.inc"
46#undef GET_MVE_BUILTIN_ENUMERATORS
49#define GET_CDE_BUILTIN_ENUMERATORS
50#include "clang/Basic/arm_cde_builtins.inc"
51#undef GET_CDE_BUILTIN_ENUMERATORS
54#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
55#include "clang/Basic/BuiltinsARM.def"
57 };
58 }
59
60 namespace SVE {
61 enum {
63#define GET_SVE_BUILTIN_ENUMERATORS
64#include "clang/Basic/arm_sve_builtins.inc"
65#undef GET_SVE_BUILTIN_ENUMERATORS
68#define GET_SVE_BUILTINS
69#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
70#include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def"
71#undef TARGET_BUILTIN
72#undef GET_SVE_BUILTINS
74 };
75 }
76
77 namespace SME {
78 enum {
80#define GET_SME_BUILTIN_ENUMERATORS
81#include "clang/Basic/arm_sme_builtins.inc"
82#undef GET_SME_BUILTIN_ENUMERATORS
84 };
85 }
86
87 /// AArch64 builtins
88 namespace AArch64 {
89 enum {
96 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
97 #include "clang/Basic/BuiltinsAArch64.def"
99 };
100 }
101
102 /// BPF builtins
103 namespace BPF {
104 enum {
106#define GET_BUILTIN_ENUMERATORS
107#include "clang/Basic/BuiltinsBPF.inc"
108#undef GET_BUILTIN_ENUMERATORS
110 };
111 }
112
113 /// PPC builtins
114 namespace PPC {
115 enum {
117#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
118#include "clang/Basic/BuiltinsPPC.def"
120 };
121 }
122
123 /// NVPTX builtins
124 namespace NVPTX {
125 enum {
127#define GET_BUILTIN_ENUMERATORS
128#include "clang/Basic/BuiltinsNVPTX.inc"
129#undef GET_BUILTIN_ENUMERATORS
131 };
132 }
133
134 /// AMDGPU builtins
135 namespace AMDGPU {
136 enum {
138 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
139 #include "clang/Basic/BuiltinsAMDGPU.def"
141 };
142 }
143
144 /// DirectX builtins
145 namespace DirectX {
146 enum {
148#define GET_BUILTIN_ENUMERATORS
149#include "clang/Basic/BuiltinsDirectX.inc"
150#undef GET_BUILTIN_ENUMERATORS
152 };
153 } // namespace DirectX
154
155 /// SPIRV builtins
156 namespace SPIRV {
157 enum {
159#define GET_BUILTIN_ENUMERATORS
160#include "clang/Basic/BuiltinsSPIRVCommon.inc"
161#undef GET_BUILTIN_ENUMERATORS
164#define GET_BUILTIN_ENUMERATORS
165#include "clang/Basic/BuiltinsSPIRVVK.inc"
166#undef GET_BUILTIN_ENUMERATORS
169#define GET_BUILTIN_ENUMERATORS
170#include "clang/Basic/BuiltinsSPIRVCL.inc"
171#undef GET_BUILTIN_ENUMERATORS
173 };
174 } // namespace SPIRV
175
176 /// X86 builtins
177 namespace X86 {
178 enum {
180#define GET_BUILTIN_ENUMERATORS
181#include "clang/Basic/BuiltinsX86.inc"
182#undef GET_BUILTIN_ENUMERATORS
185#define GET_BUILTIN_ENUMERATORS
186#include "clang/Basic/BuiltinsX86_64.inc"
187#undef GET_BUILTIN_ENUMERATORS
189 };
190 }
191
192 /// VE builtins
193 namespace VE {
194 enum {
196#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
197#include "clang/Basic/BuiltinsVE.def"
199 };
200 }
201
202 namespace RISCVVector {
203 enum {
205#define GET_RISCVV_BUILTIN_ENUMERATORS
206#include "clang/Basic/riscv_vector_builtins.inc"
209#include "clang/Basic/riscv_sifive_vector_builtins.inc"
212#include "clang/Basic/riscv_andes_vector_builtins.inc"
213#undef GET_RISCVV_BUILTIN_ENUMERATORS
215 };
216 }
217
218 /// RISCV builtins
219 namespace RISCV {
220 enum {
224#define GET_BUILTIN_ENUMERATORS
225#include "clang/Basic/BuiltinsRISCV.inc"
226#undef GET_BUILTIN_ENUMERATORS
228 };
229 } // namespace RISCV
230
231 /// LoongArch builtins
232 namespace LoongArch {
233 enum {
235#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
236#include "clang/Basic/BuiltinsLoongArchBase.def"
239#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
240#include "clang/Basic/BuiltinsLoongArchLSX.def"
243#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
244#include "clang/Basic/BuiltinsLoongArchLASX.def"
246 };
247 } // namespace LoongArch
248
249 /// Flags to identify the types for overloaded Neon builtins.
250 ///
251 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
253 enum {
254 EltTypeMask = 0xf,
255 UnsignedFlag = 0x10,
256 QuadFlag = 0x20
257 };
258 uint32_t Flags;
259
260 public:
261 enum EltType {
274 MFloat8
275 };
276
277 NeonTypeFlags(unsigned F) : Flags(F) {}
278 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
279 if (IsUnsigned)
280 Flags |= UnsignedFlag;
281 if (IsQuad)
282 Flags |= QuadFlag;
283 }
284
285 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
286 bool isPoly() const {
287 EltType ET = getEltType();
288 return ET == Poly8 || ET == Poly16 || ET == Poly64;
289 }
290 bool isFloatingPoint() const {
291 EltType ET = getEltType();
292 return ET == Float16 || ET == Float32 || ET == Float64 || ET == BFloat16;
293 }
294 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
295 bool isQuad() const { return (Flags & QuadFlag) != 0; }
296 unsigned getEltSizeInBits() const {
297 switch (getEltType()) {
298 case Int8:
299 case Poly8:
300 case MFloat8:
301 return 8;
302 case Int16:
303 case Float16:
304 case Poly16:
305 case BFloat16:
306 return 16;
307 case Int32:
308 case Float32:
309 return 32;
310 case Int64:
311 case Float64:
312 case Poly64:
313 return 64;
314 case Poly128:
315 return 128;
316 }
317 llvm_unreachable("Invalid NeonTypeFlag!");
318 }
319 };
320
321 // Shared between SVE/SME and NEON
323#define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
324#include "clang/Basic/arm_immcheck_types.inc"
325#undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
326 };
327
328 /// Flags to identify the types for overloaded SVE builtins.
330 uint64_t Flags;
331 unsigned EltTypeShift;
332 unsigned MemEltTypeShift;
333 unsigned MergeTypeShift;
334 unsigned SplatOperandMaskShift;
335
336 public:
337#define LLVM_GET_SVE_TYPEFLAGS
338#include "clang/Basic/arm_sve_typeflags.inc"
339#undef LLVM_GET_SVE_TYPEFLAGS
340
341 enum EltType {
342#define LLVM_GET_SVE_ELTTYPES
343#include "clang/Basic/arm_sve_typeflags.inc"
344#undef LLVM_GET_SVE_ELTTYPES
345 };
346
348#define LLVM_GET_SVE_MEMELTTYPES
349#include "clang/Basic/arm_sve_typeflags.inc"
350#undef LLVM_GET_SVE_MEMELTTYPES
351 };
352
354#define LLVM_GET_SVE_MERGETYPES
355#include "clang/Basic/arm_sve_typeflags.inc"
356#undef LLVM_GET_SVE_MERGETYPES
357 };
358
359 SVETypeFlags(uint64_t F) : Flags(F) {
360 EltTypeShift = llvm::countr_zero(EltTypeMask);
361 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
362 MergeTypeShift = llvm::countr_zero(MergeTypeMask);
363 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
364 }
365
367 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
368 }
369
371 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
372 }
373
375 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
376 }
377
378 unsigned getSplatOperand() const {
379 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
380 }
381
382 bool hasSplatOperand() const {
383 return Flags & SplatOperandMask;
384 }
385
386 bool isLoad() const { return Flags & IsLoad; }
387 bool isStore() const { return Flags & IsStore; }
388 bool isGatherLoad() const { return Flags & IsGatherLoad; }
389 bool isScatterStore() const { return Flags & IsScatterStore; }
390 bool isStructLoad() const { return Flags & IsStructLoad; }
391 bool isStructStore() const { return Flags & IsStructStore; }
392 bool isZExtReturn() const { return Flags & IsZExtReturn; }
393 bool isByteIndexed() const { return Flags & IsByteIndexed; }
394 bool isOverloadNone() const { return Flags & IsOverloadNone; }
396 return Flags & IsOverloadWhileOrMultiVecCvt;
397 }
398 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
399 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
400 bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
401 bool isPrefetch() const { return Flags & IsPrefetch; }
402 bool isReverseCompare() const { return Flags & ReverseCompare; }
403 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
404 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
405 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
406 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
407 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
408 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
409 bool isUndef() const { return Flags & IsUndef; }
410 bool isTupleCreate() const { return Flags & IsTupleCreate; }
411 bool isTupleGet() const { return Flags & IsTupleGet; }
412 bool isTupleSet() const { return Flags & IsTupleSet; }
413 bool isReadZA() const { return Flags & IsReadZA; }
414 bool isWriteZA() const { return Flags & IsWriteZA; }
415 bool setsFPMR() const { return Flags & SetsFPMR; }
416 bool isReductionQV() const { return Flags & IsReductionQV; }
417 uint64_t getBits() const { return Flags; }
418 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
419 };
420
421 /// Hexagon builtins
422 namespace Hexagon {
423 enum {
425#define GET_BUILTIN_ENUMERATORS
426#include "clang/Basic/BuiltinsHexagon.inc"
427#undef GET_BUILTIN_ENUMERATORS
429 };
430 }
431
432 /// MIPS builtins
433 namespace Mips {
434 enum {
436#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
437#include "clang/Basic/BuiltinsMips.def"
439 };
440 }
441
442 /// XCore builtins
443 namespace XCore {
444 enum {
446#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
447#include "clang/Basic/BuiltinsXCore.def"
449 };
450 }
451
452 /// SystemZ builtins
453 namespace SystemZ {
454 enum {
456#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
457#include "clang/Basic/BuiltinsSystemZ.def"
459 };
460 }
461
462 /// WebAssembly builtins
463 namespace WebAssembly {
464 enum {
466#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
467#include "clang/Basic/BuiltinsWebAssembly.def"
469 };
470 }
471
472 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
478
479} // end namespace clang.
480
481#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)
bool isFloatingPoint() const
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
@ FirstNeonBridgeBuiltin
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr uint64_t LargestBuiltinID