1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines//===--- TargetBuiltins.h - Target specific builtin IDs ---------*- C++ -*-===//
2c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson//
3c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson//                     The LLVM Compiler Infrastructure
4c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson//
8c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson//===----------------------------------------------------------------------===//
92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file
112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Enumerates target-specific builtins in their own namespaces within
122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// namespace ::clang.
132f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
142f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett//===----------------------------------------------------------------------===//
15c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_BASIC_TARGETBUILTINS_H
18c099b9a94f52f9d2c9135cfcfbc32bc17401500bAnders Carlsson
196b15cdc1312f8fc45c86ee75e2a85106700e97f6Chris Lattner#include "clang/Basic/Builtins.h"
20e9484fc09a82b0bcd9f4921083440df4aea04f52Matthijs Kooijman#undef PPC
21c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson
22fb344d3ddd538746be75941d50b78ff148441abcChris Lattnernamespace clang {
232752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace NEON {
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum {
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/BuiltinsNEON.def"
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    FirstTSBuiltin
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
33af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief ARM builtins
342752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner  namespace ARM {
35c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson    enum {
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
38c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
392752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner#include "clang/Basic/BuiltinsARM.def"
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LastTSBuiltin
41c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson    };
42fb344d3ddd538746be75941d50b78ff148441abcChris Lattner  }
43c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// \brief AArch64 builtins
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  namespace AArch64 {
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum {
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  #include "clang/Basic/BuiltinsAArch64.def"
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LastTSBuiltin
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
55af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief PPC builtins
56fb344d3ddd538746be75941d50b78ff148441abcChris Lattner  namespace PPC {
57c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson    enum {
58c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
59c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
606b15cdc1312f8fc45c86ee75e2a85106700e97f6Chris Lattner#include "clang/Basic/BuiltinsPPC.def"
61c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson        LastTSBuiltin
62c916d70e0b65bbf6c2800e2818995ab1ce31388eAnders Carlsson    };
63fb344d3ddd538746be75941d50b78ff148441abcChris Lattner  }
642752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner
65af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief NVPTX builtins
662c585b991596859f39860b6094247ba027a03530Justin Holewinski  namespace NVPTX {
67285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski    enum {
68285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
69285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
702c585b991596859f39860b6094247ba027a03530Justin Holewinski#include "clang/Basic/BuiltinsNVPTX.def"
71285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski        LastTSBuiltin
72285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski    };
73285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski  }
74285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski
75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// \brief R600 builtins
76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  namespace R600 {
77c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  enum {
78c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
79c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
80c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  #include "clang/Basic/BuiltinsR600.def"
81c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    LastTSBuiltin
82c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  };
83c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
84285dc6530b37d632cd858bac444d29044de4d283Justin Holewinski
85af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief X86 builtins
862752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner  namespace X86 {
872752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner    enum {
882752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
892752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
902752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner#include "clang/Basic/BuiltinsX86.def"
912752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner        LastTSBuiltin
922752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner    };
932752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner  }
942752c0137d95aa2f4ee1cdff4b564bac842e041bChris Lattner
95af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Flags to identify the types for overloaded Neon builtins.
96af50aab0c317462129d73ae8000c6394c718598dJames Dennett  ///
97af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
98da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  class NeonTypeFlags {
99da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    enum {
100da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      EltTypeMask = 0xf,
101da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      UnsignedFlag = 0x10,
102da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      QuadFlag = 0x20
103da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    };
104da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    uint32_t Flags;
105da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
106da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  public:
107da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    enum EltType {
108da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Int8,
109da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Int16,
110da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Int32,
111da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Int64,
112da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Poly8,
113da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Poly16,
114624bb5e59dbcc24efeee7dff12c9b48d2b5077e9Kevin Qin      Poly64,
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Poly128,
116da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      Float16,
117b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover      Float32,
118b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover      Float64
119da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    };
120da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
121da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    NeonTypeFlags(unsigned F) : Flags(F) {}
122da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
123da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      if (IsUnsigned)
124da95f73b59f9af964e33725c515139d34c90c863Bob Wilson        Flags |= UnsignedFlag;
125da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      if (IsQuad)
126da95f73b59f9af964e33725c515139d34c90c863Bob Wilson        Flags |= QuadFlag;
127da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    }
128da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
129da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
130da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    bool isPoly() const {
131da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      EltType ET = getEltType();
132da95f73b59f9af964e33725c515139d34c90c863Bob Wilson      return ET == Poly8 || ET == Poly16;
133da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    }
134da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
135da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    bool isQuad() const { return (Flags & QuadFlag) != 0; }
136da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  };
137da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
138af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief Hexagon builtins
1399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  namespace Hexagon {
1409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    enum {
1419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
1429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
1439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum#include "clang/Basic/BuiltinsHexagon.def"
1449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        LastTSBuiltin
1459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    };
1469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
147fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan
148af50aab0c317462129d73ae8000c6394c718598dJames Dennett  /// \brief MIPS builtins
149fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan  namespace Mips {
150fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan    enum {
151fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
152fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
153fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan#include "clang/Basic/BuiltinsMips.def"
154fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan        LastTSBuiltin
155fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan    };
156fbf7005138d199bad238f0dd1ff509931a24ab10Simon Atanasyan  }
1575f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton
1585f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton  /// \brief XCore builtins
1595f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton  namespace XCore {
1605f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton    enum {
1615f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
1625f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
1635f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton#include "clang/Basic/BuiltinsXCore.def"
1645f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton        LastTSBuiltin
1655f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton    };
1665f15f4daf0e225ea8463fe2ef522c009c95ffc9cRobert Lytton  }
167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  /// \brief Le64 builtins
169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace Le64 {
170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  enum {
171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  #include "clang/Basic/BuiltinsLe64.def"
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    LastTSBuiltin
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
17833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  /// \brief SystemZ builtins
17933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  namespace SystemZ {
18033337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    enum {
18133337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
18233337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
18333337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar#include "clang/Basic/BuiltinsSystemZ.def"
18433337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar        LastTSBuiltin
18533337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar    };
18633337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  }
187fb344d3ddd538746be75941d50b78ff148441abcChris Lattner} // end namespace clang.
188c099b9a94f52f9d2c9135cfcfbc32bc17401500bAnders Carlsson
189c099b9a94f52f9d2c9135cfcfbc32bc17401500bAnders Carlsson#endif
190