Optimize away unnecessary address casts.
[oota-llvm.git] / lib / Target / NVPTX / NVPTX.h
1 //===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the entry points for global functions defined in
11 // the LLVM NVPTX back-end.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_TARGET_NVPTX_H
16 #define LLVM_TARGET_NVPTX_H
17
18 #include "MCTargetDesc/NVPTXBaseInfo.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/IR/Module.h"
21 #include "llvm/IR/Value.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Target/TargetMachine.h"
24 #include <cassert>
25 #include <iosfwd>
26
27 namespace llvm {
28 class NVPTXTargetMachine;
29 class FunctionPass;
30 class MachineFunctionPass;
31 class formatted_raw_ostream;
32
33 namespace NVPTXCC {
34 enum CondCodes {
35   EQ,
36   NE,
37   LT,
38   LE,
39   GT,
40   GE
41 };
42 }
43
44 inline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
45   switch (CC) {
46   case NVPTXCC::NE:
47     return "ne";
48   case NVPTXCC::EQ:
49     return "eq";
50   case NVPTXCC::LT:
51     return "lt";
52   case NVPTXCC::LE:
53     return "le";
54   case NVPTXCC::GT:
55     return "gt";
56   case NVPTXCC::GE:
57     return "ge";
58   }
59   llvm_unreachable("Unknown condition code");
60 }
61
62 FunctionPass *
63 createNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
64 ModulePass *createNVPTXAssignValidGlobalNamesPass();
65 ModulePass *createGenericToNVVMPass();
66 FunctionPass *createNVPTXFavorNonGenericAddrSpacesPass();
67 ModulePass *createNVVMReflectPass();
68 ModulePass *createNVVMReflectPass(const StringMap<int>& Mapping);
69 MachineFunctionPass *createNVPTXPrologEpilogPass();
70
71 bool isImageOrSamplerVal(const Value *, const Module *);
72
73 extern Target TheNVPTXTarget32;
74 extern Target TheNVPTXTarget64;
75
76 namespace NVPTX {
77 enum DrvInterface {
78   NVCL,
79   CUDA
80 };
81
82 // A field inside TSFlags needs a shift and a mask. The usage is
83 // always as follows :
84 // ((TSFlags & fieldMask) >> fieldShift)
85 // The enum keeps the mask, the shift, and all valid values of the
86 // field in one place.
87 enum VecInstType {
88   VecInstTypeShift = 0,
89   VecInstTypeMask = 0xF,
90
91   VecNOP = 0,
92   VecLoad = 1,
93   VecStore = 2,
94   VecBuild = 3,
95   VecShuffle = 4,
96   VecExtract = 5,
97   VecInsert = 6,
98   VecDest = 7,
99   VecOther = 15
100 };
101
102 enum SimpleMove {
103   SimpleMoveMask = 0x10,
104   SimpleMoveShift = 4
105 };
106 enum LoadStore {
107   isLoadMask = 0x20,
108   isLoadShift = 5,
109   isStoreMask = 0x40,
110   isStoreShift = 6
111 };
112
113 namespace PTXLdStInstCode {
114 enum AddressSpace {
115   GENERIC = 0,
116   GLOBAL = 1,
117   CONSTANT = 2,
118   SHARED = 3,
119   PARAM = 4,
120   LOCAL = 5
121 };
122 enum FromType {
123   Unsigned = 0,
124   Signed,
125   Float
126 };
127 enum VecType {
128   Scalar = 1,
129   V2 = 2,
130   V4 = 4
131 };
132 }
133
134 /// PTXCvtMode - Conversion code enumeration
135 namespace PTXCvtMode {
136 enum CvtMode {
137   NONE = 0,
138   RNI,
139   RZI,
140   RMI,
141   RPI,
142   RN,
143   RZ,
144   RM,
145   RP,
146
147   BASE_MASK = 0x0F,
148   FTZ_FLAG = 0x10,
149   SAT_FLAG = 0x20
150 };
151 }
152
153 /// PTXCmpMode - Comparison mode enumeration
154 namespace PTXCmpMode {
155 enum CmpMode {
156   EQ = 0,
157   NE,
158   LT,
159   LE,
160   GT,
161   GE,
162   LO,
163   LS,
164   HI,
165   HS,
166   EQU,
167   NEU,
168   LTU,
169   LEU,
170   GTU,
171   GEU,
172   NUM,
173   // NAN is a MACRO
174   NotANumber,
175
176   BASE_MASK = 0xFF,
177   FTZ_FLAG = 0x100
178 };
179 }
180 }
181 } // end namespace llvm;
182
183 // Defines symbolic names for NVPTX registers.  This defines a mapping from
184 // register name to register number.
185 #define GET_REGINFO_ENUM
186 #include "NVPTXGenRegisterInfo.inc"
187
188 // Defines symbolic names for the NVPTX instructions.
189 #define GET_INSTRINFO_ENUM
190 #include "NVPTXGenInstrInfo.inc"
191
192 #endif