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 /// SPIRV builtins
123 namespace SPIRV {
124 enum {
126#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
127#include "clang/Basic/BuiltinsSPIRV.inc"
129 };
130 } // namespace SPIRV
131
132 /// X86 builtins
133 namespace X86 {
134 enum {
136#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
137#include "clang/Basic/BuiltinsX86.inc"
140#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
141#include "clang/Basic/BuiltinsX86_64.inc"
143 };
144 }
145
146 /// VE builtins
147 namespace VE {
148 enum {
150#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
151#include "clang/Basic/BuiltinsVE.def"
153 };
154 }
155
156 namespace RISCVVector {
157 enum {
159#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
160#include "clang/Basic/BuiltinsRISCVVector.def"
162 };
163 }
164
165 /// RISCV builtins
166 namespace RISCV {
167 enum {
171#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
172#include "clang/Basic/BuiltinsRISCV.inc"
174 };
175 } // namespace RISCV
176
177 /// LoongArch builtins
178 namespace LoongArch {
179 enum {
181#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
182#include "clang/Basic/BuiltinsLoongArch.def"
184 };
185 } // namespace LoongArch
186
187 /// Flags to identify the types for overloaded Neon builtins.
188 ///
189 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
191 enum {
192 EltTypeMask = 0xf,
193 UnsignedFlag = 0x10,
194 QuadFlag = 0x20
195 };
196 uint32_t Flags;
197
198 public:
199 enum EltType {
212 };
213
214 NeonTypeFlags(unsigned F) : Flags(F) {}
215 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
216 if (IsUnsigned)
217 Flags |= UnsignedFlag;
218 if (IsQuad)
219 Flags |= QuadFlag;
220 }
221
222 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
223 bool isPoly() const {
224 EltType ET = getEltType();
225 return ET == Poly8 || ET == Poly16 || ET == Poly64;
226 }
227 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
228 bool isQuad() const { return (Flags & QuadFlag) != 0; }
229 unsigned getEltSizeInBits() const {
230 switch (getEltType()) {
231 case Int8:
232 case Poly8:
233 return 8;
234 case Int16:
235 case Float16:
236 case Poly16:
237 case BFloat16:
238 return 16;
239 case Int32:
240 case Float32:
241 return 32;
242 case Int64:
243 case Float64:
244 case Poly64:
245 return 64;
246 case Poly128:
247 return 128;
248 }
249 llvm_unreachable("Invalid NeonTypeFlag!");
250 }
251 };
252
253 // Shared between SVE/SME and NEON
255#define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
256#include "clang/Basic/arm_immcheck_types.inc"
257#undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
258 };
259
260 /// Flags to identify the types for overloaded SVE builtins.
262 uint64_t Flags;
263 unsigned EltTypeShift;
264 unsigned MemEltTypeShift;
265 unsigned MergeTypeShift;
266 unsigned SplatOperandMaskShift;
267
268 public:
269#define LLVM_GET_SVE_TYPEFLAGS
270#include "clang/Basic/arm_sve_typeflags.inc"
271#undef LLVM_GET_SVE_TYPEFLAGS
272
273 enum EltType {
274#define LLVM_GET_SVE_ELTTYPES
275#include "clang/Basic/arm_sve_typeflags.inc"
276#undef LLVM_GET_SVE_ELTTYPES
277 };
278
280#define LLVM_GET_SVE_MEMELTTYPES
281#include "clang/Basic/arm_sve_typeflags.inc"
282#undef LLVM_GET_SVE_MEMELTTYPES
283 };
284
286#define LLVM_GET_SVE_MERGETYPES
287#include "clang/Basic/arm_sve_typeflags.inc"
288#undef LLVM_GET_SVE_MERGETYPES
289 };
290
291 SVETypeFlags(uint64_t F) : Flags(F) {
292 EltTypeShift = llvm::countr_zero(EltTypeMask);
293 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
294 MergeTypeShift = llvm::countr_zero(MergeTypeMask);
295 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
296 }
297
299 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
300 }
301
303 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
304 }
305
307 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
308 }
309
310 unsigned getSplatOperand() const {
311 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
312 }
313
314 bool hasSplatOperand() const {
315 return Flags & SplatOperandMask;
316 }
317
318 bool isLoad() const { return Flags & IsLoad; }
319 bool isStore() const { return Flags & IsStore; }
320 bool isGatherLoad() const { return Flags & IsGatherLoad; }
321 bool isScatterStore() const { return Flags & IsScatterStore; }
322 bool isStructLoad() const { return Flags & IsStructLoad; }
323 bool isStructStore() const { return Flags & IsStructStore; }
324 bool isZExtReturn() const { return Flags & IsZExtReturn; }
325 bool isByteIndexed() const { return Flags & IsByteIndexed; }
326 bool isOverloadNone() const { return Flags & IsOverloadNone; }
328 return Flags & IsOverloadWhileOrMultiVecCvt;
329 }
330 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
331 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
332 bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
333 bool isPrefetch() const { return Flags & IsPrefetch; }
334 bool isReverseCompare() const { return Flags & ReverseCompare; }
335 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
336 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
337 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
338 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
339 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
340 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
341 bool isUndef() const { return Flags & IsUndef; }
342 bool isTupleCreate() const { return Flags & IsTupleCreate; }
343 bool isTupleGet() const { return Flags & IsTupleGet; }
344 bool isTupleSet() const { return Flags & IsTupleSet; }
345 bool isReadZA() const { return Flags & IsReadZA; }
346 bool isWriteZA() const { return Flags & IsWriteZA; }
347 bool setsFPMR() const { return Flags & SetsFPMR; }
348 bool isReductionQV() const { return Flags & IsReductionQV; }
349 uint64_t getBits() const { return Flags; }
350 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
351 };
352
353 /// Hexagon builtins
354 namespace Hexagon {
355 enum {
357#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
358#include "clang/Basic/BuiltinsHexagon.def"
360 };
361 }
362
363 /// MIPS builtins
364 namespace Mips {
365 enum {
367#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
368#include "clang/Basic/BuiltinsMips.def"
370 };
371 }
372
373 /// XCore builtins
374 namespace XCore {
375 enum {
377#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
378#include "clang/Basic/BuiltinsXCore.def"
380 };
381 }
382
383 /// SystemZ builtins
384 namespace SystemZ {
385 enum {
387#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
388#include "clang/Basic/BuiltinsSystemZ.def"
390 };
391 }
392
393 /// WebAssembly builtins
394 namespace WebAssembly {
395 enum {
397#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
398#include "clang/Basic/BuiltinsWebAssembly.def"
400 };
401 }
402
403 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
409
410} // end namespace clang.
411
412#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