TargetBuiltins.h revision 360784
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 <stdint.h>
19#include "clang/Basic/Builtins.h"
20#undef PPC
21
22namespace clang {
23
24  namespace NEON {
25  enum {
26    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
27#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
28#include "clang/Basic/BuiltinsNEON.def"
29    FirstTSBuiltin
30  };
31  }
32
33  /// ARM builtins
34  namespace ARM {
35    enum {
36      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
37      LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
38#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
39#include "clang/Basic/BuiltinsARM.def"
40      LastTSBuiltin
41    };
42  }
43
44  /// AArch64 builtins
45  namespace AArch64 {
46  enum {
47    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
48    LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
49  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
50  #include "clang/Basic/BuiltinsAArch64.def"
51    LastTSBuiltin
52  };
53  }
54
55  /// BPF builtins
56  namespace BPF {
57  enum {
58    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
59  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
60  #include "clang/Basic/BuiltinsBPF.def"
61    LastTSBuiltin
62  };
63  }
64
65  /// PPC builtins
66  namespace PPC {
67    enum {
68        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
69#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
70#include "clang/Basic/BuiltinsPPC.def"
71        LastTSBuiltin
72    };
73  }
74
75  /// NVPTX builtins
76  namespace NVPTX {
77    enum {
78        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
79#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
80#include "clang/Basic/BuiltinsNVPTX.def"
81        LastTSBuiltin
82    };
83  }
84
85  /// AMDGPU builtins
86  namespace AMDGPU {
87  enum {
88    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
89  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
90  #include "clang/Basic/BuiltinsAMDGPU.def"
91    LastTSBuiltin
92  };
93  }
94
95  /// X86 builtins
96  namespace X86 {
97  enum {
98    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
99#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
100#include "clang/Basic/BuiltinsX86.def"
101    FirstX86_64Builtin,
102    LastX86CommonBuiltin = FirstX86_64Builtin - 1,
103#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
104#include "clang/Basic/BuiltinsX86_64.def"
105    LastTSBuiltin
106  };
107  }
108
109  /// Flags to identify the types for overloaded Neon builtins.
110  ///
111  /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
112  class NeonTypeFlags {
113    enum {
114      EltTypeMask = 0xf,
115      UnsignedFlag = 0x10,
116      QuadFlag = 0x20
117    };
118    uint32_t Flags;
119
120  public:
121    enum EltType {
122      Int8,
123      Int16,
124      Int32,
125      Int64,
126      Poly8,
127      Poly16,
128      Poly64,
129      Poly128,
130      Float16,
131      Float32,
132      Float64
133    };
134
135    NeonTypeFlags(unsigned F) : Flags(F) {}
136    NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
137      if (IsUnsigned)
138        Flags |= UnsignedFlag;
139      if (IsQuad)
140        Flags |= QuadFlag;
141    }
142
143    EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
144    bool isPoly() const {
145      EltType ET = getEltType();
146      return ET == Poly8 || ET == Poly16;
147    }
148    bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
149    bool isQuad() const { return (Flags & QuadFlag) != 0; }
150  };
151
152  /// Hexagon builtins
153  namespace Hexagon {
154    enum {
155        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
156#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
157#include "clang/Basic/BuiltinsHexagon.def"
158        LastTSBuiltin
159    };
160  }
161
162  /// MIPS builtins
163  namespace Mips {
164    enum {
165        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
166#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
167#include "clang/Basic/BuiltinsMips.def"
168        LastTSBuiltin
169    };
170  }
171
172  /// XCore builtins
173  namespace XCore {
174    enum {
175        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
176#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
177#include "clang/Basic/BuiltinsXCore.def"
178        LastTSBuiltin
179    };
180  }
181
182  /// Le64 builtins
183  namespace Le64 {
184  enum {
185    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
186  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
187  #include "clang/Basic/BuiltinsLe64.def"
188    LastTSBuiltin
189  };
190  }
191
192  /// SystemZ builtins
193  namespace SystemZ {
194    enum {
195        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
196#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
197#include "clang/Basic/BuiltinsSystemZ.def"
198        LastTSBuiltin
199    };
200  }
201
202  /// WebAssembly builtins
203  namespace WebAssembly {
204    enum {
205      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
206#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
207#include "clang/Basic/BuiltinsWebAssembly.def"
208      LastTSBuiltin
209    };
210  }
211
212} // end namespace clang.
213
214#endif
215