63b359ffc145a16eb0b399485f42f01ce3d46083
[oota-llvm.git] / lib / Target / AMDGPU / AMDGPUUtil.cpp
1 //===-- AMDGPUUtil.cpp - AMDGPU Utility functions -------------------------===//
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 // Common utility functions used by hw codegen targets
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "AMDGPUUtil.h"
15 #include "AMDGPURegisterInfo.h"
16 #include "AMDIL.h"
17 #include "llvm/CodeGen/MachineFunction.h"
18 #include "llvm/CodeGen/MachineInstrBuilder.h"
19 #include "llvm/CodeGen/MachineRegisterInfo.h"
20 #include "llvm/Target/TargetInstrInfo.h"
21 #include "llvm/Target/TargetMachine.h"
22 #include "llvm/Target/TargetRegisterInfo.h"
23
24 using namespace llvm;
25
26 // Some instructions act as place holders to emulate operations that the GPU
27 // hardware does automatically. This function can be used to check if
28 // an opcode falls into this category.
29 bool AMDGPU::isPlaceHolderOpcode(unsigned opcode)
30 {
31   switch (opcode) {
32   default: return false;
33   case AMDGPU::RETURN:
34   case AMDGPU::LOAD_INPUT:
35   case AMDGPU::LAST:
36   case AMDGPU::MASK_WRITE:
37   case AMDGPU::RESERVE_REG:
38     return true;
39   }
40 }
41
42 bool AMDGPU::isTransOp(unsigned opcode)
43 {
44   switch(opcode) {
45     default: return false;
46
47     case AMDGPU::COS_r600:
48     case AMDGPU::COS_eg:
49     case AMDGPU::MULLIT:
50     case AMDGPU::MUL_LIT_r600:
51     case AMDGPU::MUL_LIT_eg:
52     case AMDGPU::EXP_IEEE_r600:
53     case AMDGPU::EXP_IEEE_eg:
54     case AMDGPU::LOG_CLAMPED_r600:
55     case AMDGPU::LOG_IEEE_r600:
56     case AMDGPU::LOG_CLAMPED_eg:
57     case AMDGPU::LOG_IEEE_eg:
58       return true;
59   }
60 }
61
62 bool AMDGPU::isTexOp(unsigned opcode)
63 {
64   switch(opcode) {
65   default: return false;
66   case AMDGPU::TEX_LD:
67   case AMDGPU::TEX_GET_TEXTURE_RESINFO:
68   case AMDGPU::TEX_SAMPLE:
69   case AMDGPU::TEX_SAMPLE_C:
70   case AMDGPU::TEX_SAMPLE_L:
71   case AMDGPU::TEX_SAMPLE_C_L:
72   case AMDGPU::TEX_SAMPLE_LB:
73   case AMDGPU::TEX_SAMPLE_C_LB:
74   case AMDGPU::TEX_SAMPLE_G:
75   case AMDGPU::TEX_SAMPLE_C_G:
76   case AMDGPU::TEX_GET_GRADIENTS_H:
77   case AMDGPU::TEX_GET_GRADIENTS_V:
78   case AMDGPU::TEX_SET_GRADIENTS_H:
79   case AMDGPU::TEX_SET_GRADIENTS_V:
80     return true;
81   }
82 }
83
84 bool AMDGPU::isReductionOp(unsigned opcode)
85 {
86   switch(opcode) {
87     default: return false;
88     case AMDGPU::DOT4_r600:
89     case AMDGPU::DOT4_eg:
90       return true;
91   }
92 }
93
94 bool AMDGPU::isCubeOp(unsigned opcode)
95 {
96   switch(opcode) {
97     default: return false;
98     case AMDGPU::CUBE_r600:
99     case AMDGPU::CUBE_eg:
100       return true;
101   }
102 }
103
104
105 bool AMDGPU::isFCOp(unsigned opcode)
106 {
107   switch(opcode) {
108   default: return false;
109   case AMDGPU::BREAK_LOGICALZ_f32:
110   case AMDGPU::BREAK_LOGICALNZ_i32:
111   case AMDGPU::BREAK_LOGICALZ_i32:
112   case AMDGPU::BREAK_LOGICALNZ_f32:
113   case AMDGPU::CONTINUE_LOGICALNZ_f32:
114   case AMDGPU::IF_LOGICALNZ_i32:
115   case AMDGPU::IF_LOGICALZ_f32:
116   case AMDGPU::ELSE:
117   case AMDGPU::ENDIF:
118   case AMDGPU::ENDLOOP:
119   case AMDGPU::IF_LOGICALNZ_f32:
120   case AMDGPU::WHILELOOP:
121     return true;
122   }
123 }
124
125 void AMDGPU::utilAddLiveIn(MachineFunction * MF,
126                            MachineRegisterInfo & MRI,
127                            const TargetInstrInfo * TII,
128                            unsigned physReg, unsigned virtReg)
129 {
130     if (!MRI.isLiveIn(physReg)) {
131       MRI.addLiveIn(physReg, virtReg);
132       MF->front().addLiveIn(physReg);
133       BuildMI(MF->front(), MF->front().begin(), DebugLoc(),
134               TII->get(TargetOpcode::COPY), virtReg)
135                 .addReg(physReg);
136     } else {
137       MRI.replaceRegWith(virtReg, MRI.getLiveInVirtReg(physReg));
138     }
139 }