Merging r258471:
[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_LIB_TARGET_NVPTX_NVPTX_H
16 #define LLVM_LIB_TARGET_NVPTX_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 FunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM,
45                                  llvm::CodeGenOpt::Level OptLevel);
46 ModulePass *createNVPTXAssignValidGlobalNamesPass();
47 ModulePass *createGenericToNVVMPass();
48 FunctionPass *createNVPTXFavorNonGenericAddrSpacesPass();
49 ModulePass *createNVVMReflectPass();
50 ModulePass *createNVVMReflectPass(const StringMap<int>& Mapping);
51 MachineFunctionPass *createNVPTXPrologEpilogPass();
52 MachineFunctionPass *createNVPTXReplaceImageHandlesPass();
53 FunctionPass *createNVPTXImageOptimizerPass();
54 FunctionPass *createNVPTXLowerKernelArgsPass(const NVPTXTargetMachine *TM);
55 BasicBlockPass *createNVPTXLowerAllocaPass();
56 MachineFunctionPass *createNVPTXPeephole();
57
58 bool isImageOrSamplerVal(const Value *, const Module *);
59
60 extern Target TheNVPTXTarget32;
61 extern Target TheNVPTXTarget64;
62
63 namespace NVPTX {
64 enum DrvInterface {
65   NVCL,
66   CUDA
67 };
68
69 // A field inside TSFlags needs a shift and a mask. The usage is
70 // always as follows :
71 // ((TSFlags & fieldMask) >> fieldShift)
72 // The enum keeps the mask, the shift, and all valid values of the
73 // field in one place.
74 enum VecInstType {
75   VecInstTypeShift = 0,
76   VecInstTypeMask = 0xF,
77
78   VecNOP = 0,
79   VecLoad = 1,
80   VecStore = 2,
81   VecBuild = 3,
82   VecShuffle = 4,
83   VecExtract = 5,
84   VecInsert = 6,
85   VecDest = 7,
86   VecOther = 15
87 };
88
89 enum SimpleMove {
90   SimpleMoveMask = 0x10,
91   SimpleMoveShift = 4
92 };
93 enum LoadStore {
94   isLoadMask = 0x20,
95   isLoadShift = 5,
96   isStoreMask = 0x40,
97   isStoreShift = 6
98 };
99
100 namespace PTXLdStInstCode {
101 enum AddressSpace {
102   GENERIC = 0,
103   GLOBAL = 1,
104   CONSTANT = 2,
105   SHARED = 3,
106   PARAM = 4,
107   LOCAL = 5
108 };
109 enum FromType {
110   Unsigned = 0,
111   Signed,
112   Float
113 };
114 enum VecType {
115   Scalar = 1,
116   V2 = 2,
117   V4 = 4
118 };
119 }
120
121 /// PTXCvtMode - Conversion code enumeration
122 namespace PTXCvtMode {
123 enum CvtMode {
124   NONE = 0,
125   RNI,
126   RZI,
127   RMI,
128   RPI,
129   RN,
130   RZ,
131   RM,
132   RP,
133
134   BASE_MASK = 0x0F,
135   FTZ_FLAG = 0x10,
136   SAT_FLAG = 0x20
137 };
138 }
139
140 /// PTXCmpMode - Comparison mode enumeration
141 namespace PTXCmpMode {
142 enum CmpMode {
143   EQ = 0,
144   NE,
145   LT,
146   LE,
147   GT,
148   GE,
149   LO,
150   LS,
151   HI,
152   HS,
153   EQU,
154   NEU,
155   LTU,
156   LEU,
157   GTU,
158   GEU,
159   NUM,
160   // NAN is a MACRO
161   NotANumber,
162
163   BASE_MASK = 0xFF,
164   FTZ_FLAG = 0x100
165 };
166 }
167 }
168 } // end namespace llvm;
169
170 // Defines symbolic names for NVPTX registers.  This defines a mapping from
171 // register name to register number.
172 #define GET_REGINFO_ENUM
173 #include "NVPTXGenRegisterInfo.inc"
174
175 // Defines symbolic names for the NVPTX instructions.
176 #define GET_INSTRINFO_ENUM
177 #include "NVPTXGenInstrInfo.inc"
178
179 #endif