1194179Sed//===--- TargetBuiltins.h - Target specific builtin IDs -------------------===//
2194179Sed//
3194179Sed//                     The LLVM Compiler Infrastructure
4194179Sed//
5194179Sed// This file is distributed under the University of Illinois Open Source
6194179Sed// License. See LICENSE.TXT for details.
7194179Sed//
8194179Sed//===----------------------------------------------------------------------===//
9239462Sdim///
10239462Sdim/// \file
11239462Sdim/// \brief Enumerates target-specific builtins in their own namespaces within
12239462Sdim/// namespace ::clang.
13239462Sdim///
14239462Sdim//===----------------------------------------------------------------------===//
15194179Sed
16194179Sed#ifndef LLVM_CLANG_BASIC_TARGET_BUILTINS_H
17194179Sed#define LLVM_CLANG_BASIC_TARGET_BUILTINS_H
18194179Sed
19194179Sed#include "clang/Basic/Builtins.h"
20194179Sed#undef PPC
21194179Sed
22194179Sednamespace clang {
23204793Srdivacky
24251662Sdim  /// \brief AArch64 builtins
25251662Sdim  namespace AArch64 {
26251662Sdim    enum {
27251662Sdim      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
28251662Sdim#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
29251662Sdim#include "clang/Basic/BuiltinsAArch64.def"
30251662Sdim      LastTSBuiltin
31251662Sdim    };
32251662Sdim  }
33239462Sdim  /// \brief ARM builtins
34204793Srdivacky  namespace ARM {
35194179Sed    enum {
36194179Sed        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
37194179Sed#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
38204793Srdivacky#include "clang/Basic/BuiltinsARM.def"
39194179Sed        LastTSBuiltin
40194179Sed    };
41194179Sed  }
42194179Sed
43239462Sdim  /// \brief PPC builtins
44194179Sed  namespace PPC {
45194179Sed    enum {
46194179Sed        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
47194179Sed#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
48194179Sed#include "clang/Basic/BuiltinsPPC.def"
49194179Sed        LastTSBuiltin
50194179Sed    };
51194179Sed  }
52204793Srdivacky
53239462Sdim  /// \brief NVPTX builtins
54239462Sdim  namespace NVPTX {
55221345Sdim    enum {
56221345Sdim        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
57221345Sdim#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
58239462Sdim#include "clang/Basic/BuiltinsNVPTX.def"
59221345Sdim        LastTSBuiltin
60221345Sdim    };
61221345Sdim  }
62221345Sdim
63221345Sdim
64239462Sdim  /// \brief X86 builtins
65204793Srdivacky  namespace X86 {
66204793Srdivacky    enum {
67204793Srdivacky        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
68204793Srdivacky#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
69204793Srdivacky#include "clang/Basic/BuiltinsX86.def"
70204793Srdivacky        LastTSBuiltin
71204793Srdivacky    };
72204793Srdivacky  }
73204793Srdivacky
74239462Sdim  /// \brief Flags to identify the types for overloaded Neon builtins.
75239462Sdim  ///
76239462Sdim  /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
77234353Sdim  class NeonTypeFlags {
78234353Sdim    enum {
79234353Sdim      EltTypeMask = 0xf,
80234353Sdim      UnsignedFlag = 0x10,
81234353Sdim      QuadFlag = 0x20
82234353Sdim    };
83234353Sdim    uint32_t Flags;
84234353Sdim
85234353Sdim  public:
86234353Sdim    enum EltType {
87234353Sdim      Int8,
88234353Sdim      Int16,
89234353Sdim      Int32,
90234353Sdim      Int64,
91234353Sdim      Poly8,
92234353Sdim      Poly16,
93234353Sdim      Float16,
94234353Sdim      Float32
95234353Sdim    };
96234353Sdim
97234353Sdim    NeonTypeFlags(unsigned F) : Flags(F) {}
98234353Sdim    NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
99234353Sdim      if (IsUnsigned)
100234353Sdim        Flags |= UnsignedFlag;
101234353Sdim      if (IsQuad)
102234353Sdim        Flags |= QuadFlag;
103234353Sdim    }
104234353Sdim
105234353Sdim    EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
106234353Sdim    bool isPoly() const {
107234353Sdim      EltType ET = getEltType();
108234353Sdim      return ET == Poly8 || ET == Poly16;
109234353Sdim    }
110234353Sdim    bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
111234353Sdim    bool isQuad() const { return (Flags & QuadFlag) != 0; }
112234353Sdim  };
113234353Sdim
114239462Sdim  /// \brief Hexagon builtins
115234353Sdim  namespace Hexagon {
116234353Sdim    enum {
117234353Sdim        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
118234353Sdim#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
119234353Sdim#include "clang/Basic/BuiltinsHexagon.def"
120234353Sdim        LastTSBuiltin
121234353Sdim    };
122234353Sdim  }
123239462Sdim
124239462Sdim  /// \brief MIPS builtins
125239462Sdim  namespace Mips {
126239462Sdim    enum {
127239462Sdim        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
128239462Sdim#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
129239462Sdim#include "clang/Basic/BuiltinsMips.def"
130239462Sdim        LastTSBuiltin
131239462Sdim    };
132239462Sdim  }
133194179Sed} // end namespace clang.
134194179Sed
135194179Sed#endif
136