clang 23.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 GET_BUILTIN_ENUMERATORS
139#include "clang/Basic/BuiltinsAMDGPU.inc"
140#undef GET_BUILTIN_ENUMERATORS
142 };
143 }
144
145 /// DirectX builtins
146 namespace DirectX {
147 enum {
149#define GET_BUILTIN_ENUMERATORS
150#include "clang/Basic/BuiltinsDirectX.inc"
151#undef GET_BUILTIN_ENUMERATORS
153 };
154 } // namespace DirectX
155
156 /// SPIRV builtins
157 namespace SPIRV {
158 enum {
160#define GET_BUILTIN_ENUMERATORS
161#include "clang/Basic/BuiltinsSPIRVCommon.inc"
162#undef GET_BUILTIN_ENUMERATORS
165#define GET_BUILTIN_ENUMERATORS
166#include "clang/Basic/BuiltinsSPIRVVK.inc"
167#undef GET_BUILTIN_ENUMERATORS
170#define GET_BUILTIN_ENUMERATORS
171#include "clang/Basic/BuiltinsSPIRVCL.inc"
172#undef GET_BUILTIN_ENUMERATORS
174 };
175 } // namespace SPIRV
176
177 /// X86 builtins
178 namespace X86 {
179 enum {
181#define GET_BUILTIN_ENUMERATORS
182#include "clang/Basic/BuiltinsX86.inc"
183#undef GET_BUILTIN_ENUMERATORS
186#define GET_BUILTIN_ENUMERATORS
187#include "clang/Basic/BuiltinsX86_64.inc"
188#undef GET_BUILTIN_ENUMERATORS
190 };
191 }
192
193 /// VE builtins
194 namespace VE {
195 enum {
197#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
198#include "clang/Basic/BuiltinsVE.def"
200 };
201 }
202
203 namespace RISCVVector {
204 enum {
206#define GET_RISCVV_BUILTIN_ENUMERATORS
207#include "clang/Basic/riscv_vector_builtins.inc"
210#include "clang/Basic/riscv_sifive_vector_builtins.inc"
213#include "clang/Basic/riscv_andes_vector_builtins.inc"
214#undef GET_RISCVV_BUILTIN_ENUMERATORS
216 };
217 }
218
219 /// RISCV builtins
220 namespace RISCV {
221 enum {
225#define GET_BUILTIN_ENUMERATORS
226#include "clang/Basic/BuiltinsRISCV.inc"
227#undef GET_BUILTIN_ENUMERATORS
229 };
230 } // namespace RISCV
231
232 /// LoongArch builtins
233 namespace LoongArch {
234 enum {
236#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
237#include "clang/Basic/BuiltinsLoongArchBase.def"
240#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
241#include "clang/Basic/BuiltinsLoongArchLSX.def"
244#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
245#include "clang/Basic/BuiltinsLoongArchLASX.def"
247 };
248 } // namespace LoongArch
249
250 /// Flags to identify the types for overloaded Neon builtins.
251 ///
252 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
254 enum {
255 EltTypeMask = 0xf,
256 UnsignedFlag = 0x10,
257 QuadFlag = 0x20
258 };
259 uint32_t Flags;
260
261 public:
277
278 NeonTypeFlags(unsigned F) : Flags(F) {}
279 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
280 if (IsUnsigned)
281 Flags |= UnsignedFlag;
282 if (IsQuad)
283 Flags |= QuadFlag;
284 }
285
286 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
287 bool isPoly() const {
288 EltType ET = getEltType();
289 return ET == Poly8 || ET == Poly16 || ET == Poly64;
290 }
291 bool isFloatingPoint() const {
292 EltType ET = getEltType();
293 return ET == Float16 || ET == Float32 || ET == Float64 || ET == BFloat16;
294 }
295 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
296 bool isQuad() const { return (Flags & QuadFlag) != 0; }
297 unsigned getEltSizeInBits() const {
298 switch (getEltType()) {
299 case Int8:
300 case Poly8:
301 case MFloat8:
302 return 8;
303 case Int16:
304 case Float16:
305 case Poly16:
306 case BFloat16:
307 return 16;
308 case Int32:
309 case Float32:
310 return 32;
311 case Int64:
312 case Float64:
313 case Poly64:
314 return 64;
315 case Poly128:
316 return 128;
317 }
318 llvm_unreachable("Invalid NeonTypeFlag!");
319 }
320 };
321
322 // Shared between SVE/SME and NEON
324#define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
325#include "clang/Basic/arm_immcheck_types.inc"
326#undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
327 };
328
329 /// Flags to identify the types for overloaded SVE builtins.
331 uint64_t Flags;
332 unsigned EltTypeShift;
333 unsigned MemEltTypeShift;
334 unsigned MergeTypeShift;
335 unsigned SplatOperandMaskShift;
336
337 public:
338#define LLVM_GET_SVE_TYPEFLAGS
339#include "clang/Basic/arm_sve_typeflags.inc"
340#undef LLVM_GET_SVE_TYPEFLAGS
341
342 enum EltType {
343#define LLVM_GET_SVE_ELTTYPES
344#include "clang/Basic/arm_sve_typeflags.inc"
345#undef LLVM_GET_SVE_ELTTYPES
346 };
347
349#define LLVM_GET_SVE_MEMELTTYPES
350#include "clang/Basic/arm_sve_typeflags.inc"
351#undef LLVM_GET_SVE_MEMELTTYPES
352 };
353
355#define LLVM_GET_SVE_MERGETYPES
356#include "clang/Basic/arm_sve_typeflags.inc"
357#undef LLVM_GET_SVE_MERGETYPES
358 };
359
360 SVETypeFlags(uint64_t F) : Flags(F) {
361 EltTypeShift = llvm::countr_zero(EltTypeMask);
362 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
363 MergeTypeShift = llvm::countr_zero(MergeTypeMask);
364 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
365 }
366
368 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
369 }
370
372 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
373 }
374
376 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
377 }
378
379 unsigned getSplatOperand() const {
380 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
381 }
382
383 bool hasSplatOperand() const {
384 return Flags & SplatOperandMask;
385 }
386
387 bool isLoad() const { return Flags & IsLoad; }
388 bool isStore() const { return Flags & IsStore; }
389 bool isGatherLoad() const { return Flags & IsGatherLoad; }
390 bool isScatterStore() const { return Flags & IsScatterStore; }
391 bool isStructLoad() const { return Flags & IsStructLoad; }
392 bool isStructStore() const { return Flags & IsStructStore; }
393 bool isZExtReturn() const { return Flags & IsZExtReturn; }
394 bool isByteIndexed() const { return Flags & IsByteIndexed; }
395 bool isOverloadNone() const { return Flags & IsOverloadNone; }
397 return Flags & IsOverloadWhileOrMultiVecCvt;
398 }
399 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
400 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
402 return Flags & IsOverloadFirstandLast;
403 }
404 bool isPrefetch() const { return Flags & IsPrefetch; }
405 bool isReverseCompare() const { return Flags & ReverseCompare; }
406 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
407 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
408 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
409 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
410 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
411 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
412 bool isUndef() const { return Flags & IsUndef; }
413 bool isTupleCreate() const { return Flags & IsTupleCreate; }
414 bool isTupleGet() const { return Flags & IsTupleGet; }
415 bool isTupleSet() const { return Flags & IsTupleSet; }
416 bool isReadZA() const { return Flags & IsReadZA; }
417 bool isWriteZA() const { return Flags & IsWriteZA; }
418 bool setsFPMR() const { return Flags & SetsFPMR; }
419 bool isReductionQV() const { return Flags & IsReductionQV; }
420 uint64_t getBits() const { return Flags; }
421 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
422 };
423
424 /// Hexagon builtins
425 namespace Hexagon {
426 enum {
428#define GET_BUILTIN_ENUMERATORS
429#include "clang/Basic/BuiltinsHexagon.inc"
430#undef GET_BUILTIN_ENUMERATORS
432 };
433 }
434
435 /// MIPS builtins
436 namespace Mips {
437 enum {
439#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
440#include "clang/Basic/BuiltinsMips.def"
442 };
443 }
444
445 /// XCore builtins
446 namespace XCore {
447 enum {
449#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
450#include "clang/Basic/BuiltinsXCore.def"
452 };
453 }
454
455 /// SystemZ builtins
456 namespace SystemZ {
457 enum {
459#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
460#include "clang/Basic/BuiltinsSystemZ.def"
462 };
463 }
464
465 /// WebAssembly builtins
466 namespace WebAssembly {
467 enum {
469#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
470#include "clang/Basic/BuiltinsWebAssembly.def"
472 };
473 }
474
475 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
481
482} // end namespace clang.
483
484#endif
Defines enum values for all the target-independent builtin functions.
bool isFloatingPoint() const
unsigned getEltSizeInBits() const
EltType getEltType() const
NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad)
bool isZExtReturn() const
bool isReverseUSDOT() const
bool isOverloadNone() const
MemEltType getMemEltType() const
uint64_t getBits() const
bool isGatherLoad() const
EltType getEltType() const
bool isOverloadFirstandLast() const
bool isOverloadDefault() const
bool isPrefetch() const
bool isOverloadWhileRW() 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
bool hasSplatOperand() const
MergeType getMergeType() const
bool isByteIndexed() const
bool isStructLoad() const
bool isOverloadWhileOrMultiVecCvt() const
unsigned getSplatOperand() const
bool isScatterStore() const
bool isReverseCompare() const
AArch64 builtins.
AMDGPU builtins.
ARM builtins.
BPF builtins.
DirectX builtins.
Hexagon builtins.
LoongArch builtins.
MIPS builtins.
NVPTX builtins.
PPC builtins.
RISCV builtins.
SPIRV builtins.
SystemZ builtins.
VE builtins.
WebAssembly builtins.
X86 builtins.
XCore builtins.
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr uint64_t LargestBuiltinID