4029f2780db8167865897d3ab20cd4c2637182c9
[oota-llvm.git] / lib / Target / AMDGPU / AMDIL.h
1 //===-- AMDIL.h - Top-level interface for AMDIL 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 the LLVM
11 // AMDIL back-end.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef AMDIL_H_
16 #define AMDIL_H_
17
18 #include "llvm/CodeGen/MachineFunction.h"
19 #include "llvm/Target/TargetMachine.h"
20
21 #define AMDIL_MAJOR_VERSION 2
22 #define AMDIL_MINOR_VERSION 0
23 #define AMDIL_REVISION_NUMBER 74
24 #define ARENA_SEGMENT_RESERVED_UAVS 12
25 #define DEFAULT_ARENA_UAV_ID 8
26 #define DEFAULT_RAW_UAV_ID 7
27 #define GLOBAL_RETURN_RAW_UAV_ID 11
28 #define HW_MAX_NUM_CB 8
29 #define MAX_NUM_UNIQUE_UAVS 8
30 #define OPENCL_MAX_NUM_ATOMIC_COUNTERS 8
31 #define OPENCL_MAX_READ_IMAGES 128
32 #define OPENCL_MAX_WRITE_IMAGES 8
33 #define OPENCL_MAX_SAMPLERS 16
34
35 // The next two values can never be zero, as zero is the ID that is
36 // used to assert against.
37 #define DEFAULT_LDS_ID     1
38 #define DEFAULT_GDS_ID     1
39 #define DEFAULT_SCRATCH_ID 1
40 #define DEFAULT_VEC_SLOTS  8
41
42 // SC->CAL version matchings.
43 #define CAL_VERSION_SC_150               1700
44 #define CAL_VERSION_SC_149               1700
45 #define CAL_VERSION_SC_148               1525
46 #define CAL_VERSION_SC_147               1525
47 #define CAL_VERSION_SC_146               1525
48 #define CAL_VERSION_SC_145               1451
49 #define CAL_VERSION_SC_144               1451
50 #define CAL_VERSION_SC_143               1441
51 #define CAL_VERSION_SC_142               1441
52 #define CAL_VERSION_SC_141               1420
53 #define CAL_VERSION_SC_140               1400
54 #define CAL_VERSION_SC_139               1387
55 #define CAL_VERSION_SC_138               1387
56 #define CAL_APPEND_BUFFER_SUPPORT        1340
57 #define CAL_VERSION_SC_137               1331
58 #define CAL_VERSION_SC_136                982
59 #define CAL_VERSION_SC_135                950
60 #define CAL_VERSION_GLOBAL_RETURN_BUFFER  990
61
62 #define OCL_DEVICE_RV710        0x0001
63 #define OCL_DEVICE_RV730        0x0002
64 #define OCL_DEVICE_RV770        0x0004
65 #define OCL_DEVICE_CEDAR        0x0008
66 #define OCL_DEVICE_REDWOOD      0x0010
67 #define OCL_DEVICE_JUNIPER      0x0020
68 #define OCL_DEVICE_CYPRESS      0x0040
69 #define OCL_DEVICE_CAICOS       0x0080
70 #define OCL_DEVICE_TURKS        0x0100
71 #define OCL_DEVICE_BARTS        0x0200
72 #define OCL_DEVICE_CAYMAN       0x0400
73 #define OCL_DEVICE_ALL          0x3FFF
74
75 /// The number of function ID's that are reserved for 
76 /// internal compiler usage.
77 const unsigned int RESERVED_FUNCS = 1024;
78
79 #define AMDIL_OPT_LEVEL_DECL
80 #define  AMDIL_OPT_LEVEL_VAR
81 #define AMDIL_OPT_LEVEL_VAR_NO_COMMA
82
83 namespace llvm {
84 class AMDILInstrPrinter;
85 class FunctionPass;
86 class MCAsmInfo;
87 class raw_ostream;
88 class Target;
89 class TargetMachine;
90
91 /// Instruction selection passes.
92 FunctionPass*
93   createAMDILISelDag(TargetMachine &TM AMDIL_OPT_LEVEL_DECL);
94 FunctionPass*
95   createAMDILPeepholeOpt(TargetMachine &TM AMDIL_OPT_LEVEL_DECL);
96
97 /// Pre emit passes.
98 FunctionPass*
99   createAMDILCFGPreparationPass(TargetMachine &TM AMDIL_OPT_LEVEL_DECL);
100 FunctionPass*
101   createAMDILCFGStructurizerPass(TargetMachine &TM AMDIL_OPT_LEVEL_DECL);
102
103 extern Target TheAMDILTarget;
104 extern Target TheAMDGPUTarget;
105 } // end namespace llvm;
106
107 #define GET_REGINFO_ENUM
108 #include "AMDGPUGenRegisterInfo.inc"
109 #define GET_INSTRINFO_ENUM
110 #include "AMDGPUGenInstrInfo.inc"
111
112 /// Include device information enumerations
113 #include "AMDILDeviceInfo.h"
114
115 namespace llvm {
116 /// OpenCL uses address spaces to differentiate between
117 /// various memory regions on the hardware. On the CPU
118 /// all of the address spaces point to the same memory,
119 /// however on the GPU, each address space points to
120 /// a seperate piece of memory that is unique from other
121 /// memory locations.
122 namespace AMDILAS {
123 enum AddressSpaces {
124   PRIVATE_ADDRESS  = 0, // Address space for private memory.
125   GLOBAL_ADDRESS   = 1, // Address space for global memory (RAT0, VTX0).
126   CONSTANT_ADDRESS = 2, // Address space for constant memory.
127   LOCAL_ADDRESS    = 3, // Address space for local memory.
128   REGION_ADDRESS   = 4, // Address space for region memory.
129   ADDRESS_NONE     = 5, // Address space for unknown memory.
130   PARAM_D_ADDRESS  = 6, // Address space for direct addressible parameter memory (CONST0)
131   PARAM_I_ADDRESS  = 7, // Address space for indirect addressible parameter memory (VTX1)
132   USER_SGPR_ADDRESS = 8, // Address space for USER_SGPRS on SI
133   LAST_ADDRESS     = 9
134 };
135
136 // This union/struct combination is an easy way to read out the
137 // exact bits that are needed.
138 typedef union ResourceRec {
139   struct {
140 #ifdef __BIG_ENDIAN__
141     unsigned short isImage       : 1;  // Reserved for future use/llvm.
142     unsigned short ResourceID    : 10; // Flag to specify the resourece ID for
143                                        // the op.
144     unsigned short HardwareInst  : 1;  // Flag to specify that this instruction
145                                        // is a hardware instruction.
146     unsigned short ConflictPtr   : 1;  // Flag to specify that the pointer has a
147                                        // conflict.
148     unsigned short ByteStore     : 1;  // Flag to specify if the op is a byte
149                                        // store op.
150     unsigned short PointerPath   : 1;  // Flag to specify if the op is on the
151                                        // pointer path.
152     unsigned short CacheableRead : 1;  // Flag to specify if the read is
153                                        // cacheable.
154 #else
155     unsigned short CacheableRead : 1;  // Flag to specify if the read is
156                                        // cacheable.
157     unsigned short PointerPath   : 1;  // Flag to specify if the op is on the
158                                        // pointer path.
159     unsigned short ByteStore     : 1;  // Flag to specify if the op is byte
160                                        // store op.
161     unsigned short ConflictPtr   : 1;  // Flag to specify that the pointer has
162                                        // a conflict.
163     unsigned short HardwareInst  : 1;  // Flag to specify that this instruction
164                                        // is a hardware instruction.
165     unsigned short ResourceID    : 10; // Flag to specify the resource ID for
166                                        // the op.
167     unsigned short isImage       : 1;  // Reserved for future use.
168 #endif
169   } bits;
170   unsigned short u16all;
171 } InstrResEnc;
172
173 } // namespace AMDILAS
174
175 // Enums corresponding to AMDIL condition codes for IL.  These
176 // values must be kept in sync with the ones in the .td file.
177 namespace AMDILCC {
178 enum CondCodes {
179   // AMDIL specific condition codes. These correspond to the IL_CC_*
180   // in AMDILInstrInfo.td and must be kept in the same order.
181   IL_CC_D_EQ  =  0,   // DEQ instruction.
182   IL_CC_D_GE  =  1,   // DGE instruction.
183   IL_CC_D_LT  =  2,   // DLT instruction.
184   IL_CC_D_NE  =  3,   // DNE instruction.
185   IL_CC_F_EQ  =  4,   //  EQ instruction.
186   IL_CC_F_GE  =  5,   //  GE instruction.
187   IL_CC_F_LT  =  6,   //  LT instruction.
188   IL_CC_F_NE  =  7,   //  NE instruction.
189   IL_CC_I_EQ  =  8,   // IEQ instruction.
190   IL_CC_I_GE  =  9,   // IGE instruction.
191   IL_CC_I_LT  = 10,   // ILT instruction.
192   IL_CC_I_NE  = 11,   // INE instruction.
193   IL_CC_U_GE  = 12,   // UGE instruction.
194   IL_CC_U_LT  = 13,   // ULE instruction.
195   // Pseudo IL Comparison instructions here.
196   IL_CC_F_GT  = 14,   //  GT instruction.
197   IL_CC_U_GT  = 15,
198   IL_CC_I_GT  = 16,
199   IL_CC_D_GT  = 17,
200   IL_CC_F_LE  = 18,   //  LE instruction
201   IL_CC_U_LE  = 19,
202   IL_CC_I_LE  = 20,
203   IL_CC_D_LE  = 21,
204   IL_CC_F_UNE = 22,
205   IL_CC_F_UEQ = 23,
206   IL_CC_F_ULT = 24,
207   IL_CC_F_UGT = 25,
208   IL_CC_F_ULE = 26,
209   IL_CC_F_UGE = 27,
210   IL_CC_F_ONE = 28,
211   IL_CC_F_OEQ = 29,
212   IL_CC_F_OLT = 30,
213   IL_CC_F_OGT = 31,
214   IL_CC_F_OLE = 32,
215   IL_CC_F_OGE = 33,
216   IL_CC_D_UNE = 34,
217   IL_CC_D_UEQ = 35,
218   IL_CC_D_ULT = 36,
219   IL_CC_D_UGT = 37,
220   IL_CC_D_ULE = 38,
221   IL_CC_D_UGE = 39,
222   IL_CC_D_ONE = 40,
223   IL_CC_D_OEQ = 41,
224   IL_CC_D_OLT = 42,
225   IL_CC_D_OGT = 43,
226   IL_CC_D_OLE = 44,
227   IL_CC_D_OGE = 45,
228   IL_CC_U_EQ  = 46,
229   IL_CC_U_NE  = 47,
230   IL_CC_F_O   = 48,
231   IL_CC_D_O   = 49,
232   IL_CC_F_UO  = 50,
233   IL_CC_D_UO  = 51,
234   IL_CC_L_LE  = 52,
235   IL_CC_L_GE  = 53,
236   IL_CC_L_EQ  = 54,
237   IL_CC_L_NE  = 55,
238   IL_CC_L_LT  = 56,
239   IL_CC_L_GT  = 57,
240   IL_CC_UL_LE = 58,
241   IL_CC_UL_GE = 59,
242   IL_CC_UL_EQ = 60,
243   IL_CC_UL_NE = 61,
244   IL_CC_UL_LT = 62,
245   IL_CC_UL_GT = 63,
246   COND_ERROR  = 64
247 };
248
249 } // end namespace AMDILCC
250 } // end namespace llvm
251 #endif // AMDIL_H_