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