1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- AMDGPU.h - MachineFunction passes hw codegen --------------*- C++ -*-=//
2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//                     The LLVM Compiler Infrastructure
4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source
6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details.
7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \file
9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#ifndef AMDGPU_H
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#define AMDGPU_H
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/Support/TargetRegistry.h"
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/Target/TargetMachine.h"
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace llvm {
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
193ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass AMDGPUInstrPrinter;
20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass AMDGPUSubtarget;
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardclass AMDGPUTargetMachine;
223ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass FunctionPass;
233ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass MCAsmInfo;
243ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass raw_ostream;
253ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass Target;
263ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardclass TargetMachine;
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// R600 Passes
29f3d6e32c09ac73b49628f5ec7066af5eca2737b5Vincent LejeuneFunctionPass *createR600VectorRegMerger(TargetMachine &tm);
303ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom StellardFunctionPass *createR600TextureIntrinsicsReplacer();
31f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardFunctionPass *createR600ExpandSpecialInstrsPass(TargetMachine &tm);
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *createR600EmitClauseMarkers();
33dfef7cbfc6a96d129b99750f554c7dbc000d3228Vincent LejeuneFunctionPass *createR600ClauseMergePass(TargetMachine &tm);
3425f259cde28860ea76c2f5628010968945a28edbVincent LejeuneFunctionPass *createR600Packetizer(TargetMachine &tm);
3508001a5a1565adb8ce18b97537dd75075992d09aVincent LejeuneFunctionPass *createR600ControlFlowFinalizer(TargetMachine &tm);
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *createAMDGPUCFGStructurizerPass();
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// SI Passes
3968db37b952be497c94c7aa98cf26f3baadb5afd3Tom StellardFunctionPass *createSITypeRewriter();
406b7d99d47321ebb478b22afd2e317fe89d2149dbTom StellardFunctionPass *createSIAnnotateControlFlowPass();
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionPass *createSILowerI1CopiesPass();
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardFunctionPass *createSILowerControlFlowPass(TargetMachine &tm);
433492eefa4b2509c87598678a6977074a3f6a50e6Tom StellardFunctionPass *createSIFixSGPRCopiesPass(TargetMachine &tm);
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesFunctionPass *createSIFixSGPRLiveRangesPass();
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardFunctionPass *createSICodeEmitterPass(formatted_raw_ostream &OS);
4682d3d4524f2595b2dce617e963b6d67876b4f9baTom StellardFunctionPass *createSIInsertWaits(TargetMachine &tm);
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid initializeSILowerI1CopiesPass(PassRegistry &);
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesextern char &SILowerI1CopiesID;
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
51f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Passes common to R600 and SI
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesFunctionPass *createAMDGPUPromoteAlloca(const AMDGPUSubtarget &ST);
536b7d99d47321ebb478b22afd2e317fe89d2149dbTom StellardPass *createAMDGPUStructurizeCFGPass();
543ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom StellardFunctionPass *createAMDGPUISelDag(TargetMachine &tm);
553ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard
5657e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard/// \brief Creates an AMDGPU-specific Target Transformation Info pass.
5757e6b2d1f3de0bf459e96f7038e692d624f7e580Tom StellardImmutablePass *
5857e6b2d1f3de0bf459e96f7038e692d624f7e580Tom StellardcreateAMDGPUTargetTransformInfoPass(const AMDGPUTargetMachine *TM);
5957e6b2d1f3de0bf459e96f7038e692d624f7e580Tom Stellard
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid initializeSIFixSGPRLiveRangesPass(PassRegistry&);
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesextern char &SIFixSGPRLiveRangesID;
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
643ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardextern Target TheAMDGPUTarget;
65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // End namespace llvm
67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace ShaderType {
69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  enum Type {
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    PIXEL = 0,
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    VERTEX = 1,
72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    GEOMETRY = 2,
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    COMPUTE = 3
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  };
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
773ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard/// OpenCL uses address spaces to differentiate between
783ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard/// various memory regions on the hardware. On the CPU
793ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard/// all of the address spaces point to the same memory,
803ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard/// however on the GPU, each address space points to
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// a separate piece of memory that is unique from other
823ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard/// memory locations.
833ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardnamespace AMDGPUAS {
843ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellardenum AddressSpaces {
853ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  PRIVATE_ADDRESS  = 0, ///< Address space for private memory.
863ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  GLOBAL_ADDRESS   = 1, ///< Address space for global memory (RAT0, VTX0).
873ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_ADDRESS = 2, ///< Address space for constant memory
883ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  LOCAL_ADDRESS    = 3, ///< Address space for local memory.
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  FLAT_ADDRESS     = 4, ///< Address space for flat memory.
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  REGION_ADDRESS   = 5, ///< Address space for region memory.
913ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  PARAM_D_ADDRESS  = 6, ///< Address space for direct addressible parameter memory (CONST0)
923ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  PARAM_I_ADDRESS  = 7, ///< Address space for indirect addressible parameter memory (VTX1)
93a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard
94a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard  // Do not re-order the CONSTANT_BUFFER_* enums.  Several places depend on this
95a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard  // order to be able to dynamically index a constant buffer, for example:
96a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard  //
97a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard  // ConstantBufferAS = CONSTANT_BUFFER_0 + CBIdx
98a7eea0568c16f8e25b9e3ba9b7b73ae506738b63Tom Stellard
993ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_0 = 8,
1003ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_1 = 9,
1013ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_2 = 10,
1023ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_3 = 11,
1033ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_4 = 12,
1043ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_5 = 13,
1053ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_6 = 14,
1063ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_7 = 15,
1073ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_8 = 16,
1083ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_9 = 17,
1093ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_10 = 18,
1103ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_11 = 19,
1113ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_12 = 20,
1123ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_13 = 21,
1133ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_14 = 22,
1143ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard  CONSTANT_BUFFER_15 = 23,
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  ADDRESS_NONE = 24, ///< Address space for unknown memory.
116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LAST_ADDRESS = ADDRESS_NONE
1173ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard};
1183ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard
1193ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard} // namespace AMDGPUAS
1203ff0abfaabc2c7f604d490be587b9c27e7c91ac0Tom Stellard
121f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#endif // AMDGPU_H
122