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>
20 #include "clang/Basic/Builtins.h"
21 #include "llvm/Support/MathExtras.h"
22 #undef PPC
23 
24 namespace 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.def"
130 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
131 #include "clang/Basic/BuiltinsX86_64.def"
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 {
201  BFloat16
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  };
220 
221  /// Flags to identify the types for overloaded SVE builtins.
222  class SVETypeFlags {
223  uint64_t Flags;
224  unsigned EltTypeShift;
225  unsigned MemEltTypeShift;
226  unsigned MergeTypeShift;
227  unsigned SplatOperandMaskShift;
228 
229  public:
230 #define LLVM_GET_SVE_TYPEFLAGS
231 #include "clang/Basic/arm_sve_typeflags.inc"
232 #undef LLVM_GET_SVE_TYPEFLAGS
233 
234  enum EltType {
235 #define LLVM_GET_SVE_ELTTYPES
236 #include "clang/Basic/arm_sve_typeflags.inc"
237 #undef LLVM_GET_SVE_ELTTYPES
238  };
239 
240  enum MemEltType {
241 #define LLVM_GET_SVE_MEMELTTYPES
242 #include "clang/Basic/arm_sve_typeflags.inc"
243 #undef LLVM_GET_SVE_MEMELTTYPES
244  };
245 
246  enum MergeType {
247 #define LLVM_GET_SVE_MERGETYPES
248 #include "clang/Basic/arm_sve_typeflags.inc"
249 #undef LLVM_GET_SVE_MERGETYPES
250  };
251 
253 #define LLVM_GET_SVE_IMMCHECKTYPES
254 #include "clang/Basic/arm_sve_typeflags.inc"
255 #undef LLVM_GET_SVE_IMMCHECKTYPES
256  };
257 
258  SVETypeFlags(uint64_t F) : Flags(F) {
259  EltTypeShift = llvm::countr_zero(EltTypeMask);
260  MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
261  MergeTypeShift = llvm::countr_zero(MergeTypeMask);
262  SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
263  }
264 
265  EltType getEltType() const {
266  return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
267  }
268 
270  return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
271  }
272 
274  return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
275  }
276 
277  unsigned getSplatOperand() const {
278  return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
279  }
280 
281  bool hasSplatOperand() const {
282  return Flags & SplatOperandMask;
283  }
284 
285  bool isLoad() const { return Flags & IsLoad; }
286  bool isStore() const { return Flags & IsStore; }
287  bool isGatherLoad() const { return Flags & IsGatherLoad; }
288  bool isScatterStore() const { return Flags & IsScatterStore; }
289  bool isStructLoad() const { return Flags & IsStructLoad; }
290  bool isStructStore() const { return Flags & IsStructStore; }
291  bool isZExtReturn() const { return Flags & IsZExtReturn; }
292  bool isByteIndexed() const { return Flags & IsByteIndexed; }
293  bool isOverloadNone() const { return Flags & IsOverloadNone; }
295  return Flags & IsOverloadWhileOrMultiVecCvt;
296  }
297  bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
298  bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
299  bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
300  bool isPrefetch() const { return Flags & IsPrefetch; }
301  bool isReverseCompare() const { return Flags & ReverseCompare; }
302  bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
303  bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
304  bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
305  bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
306  bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
307  bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
308  bool isUndef() const { return Flags & IsUndef; }
309  bool isTupleCreate() const { return Flags & IsTupleCreate; }
310  bool isTupleGet() const { return Flags & IsTupleGet; }
311  bool isTupleSet() const { return Flags & IsTupleSet; }
312  bool isReadZA() const { return Flags & IsReadZA; }
313  bool isWriteZA() const { return Flags & IsWriteZA; }
314  bool isReductionQV() const { return Flags & IsReductionQV; }
315  uint64_t getBits() const { return Flags; }
316  bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
317  };
318 
319  /// Hexagon builtins
320  namespace Hexagon {
321  enum {
323 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
324 #include "clang/Basic/BuiltinsHexagon.def"
326  };
327  }
328 
329  /// MIPS builtins
330  namespace Mips {
331  enum {
333 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
334 #include "clang/Basic/BuiltinsMips.def"
336  };
337  }
338 
339  /// XCore builtins
340  namespace XCore {
341  enum {
343 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
344 #include "clang/Basic/BuiltinsXCore.def"
346  };
347  }
348 
349  /// SystemZ builtins
350  namespace SystemZ {
351  enum {
353 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
354 #include "clang/Basic/BuiltinsSystemZ.def"
356  };
357  }
358 
359  /// WebAssembly builtins
360  namespace WebAssembly {
361  enum {
363 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
364 #include "clang/Basic/BuiltinsWebAssembly.def"
366  };
367  }
368 
369  static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
375 
376 } // end namespace clang.
377 
378 #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)
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 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
unsigned long uint64_t
unsigned int uint32_t