e06a02257fecaea3e1be3fb30b6cb613f750a118
[oota-llvm.git] / lib / Target / R600 / SIRegisterInfo.cpp
1 //===-- SIRegisterInfo.cpp - SI Register Information ---------------------===//
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 /// \file
11 /// \brief SI implementation of the TargetRegisterInfo class.
12 //
13 //===----------------------------------------------------------------------===//
14
15
16 #include "SIRegisterInfo.h"
17 #include "AMDGPUTargetMachine.h"
18
19 using namespace llvm;
20
21 SIRegisterInfo::SIRegisterInfo(AMDGPUTargetMachine &tm)
22 : AMDGPURegisterInfo(tm),
23   TM(tm)
24   { }
25
26 BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
27   BitVector Reserved(getNumRegs());
28   Reserved.set(AMDGPU::EXEC);
29   return Reserved;
30 }
31
32 unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
33                                              MachineFunction &MF) const {
34   return RC->getNumRegs();
35 }
36
37 const TargetRegisterClass *
38 SIRegisterInfo::getISARegClass(const TargetRegisterClass * rc) const {
39   switch (rc->getID()) {
40   case AMDGPU::GPRF32RegClassID:
41     return &AMDGPU::VReg_32RegClass;
42   default: return rc;
43   }
44 }
45
46 const TargetRegisterClass * SIRegisterInfo::getCFGStructurizerRegClass(
47                                                                    MVT VT) const {
48   switch(VT.SimpleTy) {
49     default:
50     case MVT::i32: return &AMDGPU::VReg_32RegClass;
51   }
52 }
53
54 const TargetRegisterClass *SIRegisterInfo::getPhysRegClass(unsigned Reg) const {
55   assert(!TargetRegisterInfo::isVirtualRegister(Reg));
56
57   const TargetRegisterClass *BaseClasses[] = {
58     &AMDGPU::VReg_32RegClass,
59     &AMDGPU::SReg_32RegClass,
60     &AMDGPU::VReg_64RegClass,
61     &AMDGPU::SReg_64RegClass,
62     &AMDGPU::SReg_128RegClass,
63     &AMDGPU::SReg_256RegClass
64   };
65
66   for (unsigned i = 0, e = sizeof(BaseClasses) /
67                            sizeof(const TargetRegisterClass*); i != e; ++i) {
68     if (BaseClasses[i]->contains(Reg)) {
69       return BaseClasses[i];
70     }
71   }
72   return NULL;
73 }
74
75 bool SIRegisterInfo::isSGPRClass(const TargetRegisterClass *RC) const {
76   if (!RC) {
77     return false;
78   }
79   return !hasVGPRs(RC);
80 }
81
82 bool SIRegisterInfo::hasVGPRs(const TargetRegisterClass *RC) const {
83   return getCommonSubClass(&AMDGPU::VReg_32RegClass, RC) ||
84          getCommonSubClass(&AMDGPU::VReg_64RegClass, RC) ||
85          getCommonSubClass(&AMDGPU::VReg_128RegClass, RC) ||
86          getCommonSubClass(&AMDGPU::VReg_256RegClass, RC) ||
87          getCommonSubClass(&AMDGPU::VReg_512RegClass, RC);
88 }
89
90 const TargetRegisterClass *SIRegisterInfo::getEquivalentVGPRClass(
91                                          const TargetRegisterClass *SRC) const {
92     if (hasVGPRs(SRC)) {
93       return SRC;
94     } else if (getCommonSubClass(SRC, &AMDGPU::SGPR_32RegClass)) {
95       return &AMDGPU::VReg_32RegClass;
96     } else if (getCommonSubClass(SRC, &AMDGPU::SGPR_64RegClass)) {
97       return &AMDGPU::VReg_64RegClass;
98     } else if (getCommonSubClass(SRC, &AMDGPU::SReg_128RegClass)) {
99       return &AMDGPU::VReg_128RegClass;
100     } else if (getCommonSubClass(SRC, &AMDGPU::SReg_256RegClass)) {
101       return &AMDGPU::VReg_256RegClass;
102     } else if (getCommonSubClass(SRC, &AMDGPU::SReg_512RegClass)) {
103       return &AMDGPU::VReg_512RegClass;
104     }
105     return NULL;
106 }
107
108 const TargetRegisterClass *SIRegisterInfo::getSubRegClass(
109                          const TargetRegisterClass *RC, unsigned SubIdx) const {
110   if (SubIdx == AMDGPU::NoSubRegister)
111     return RC;
112
113   // If this register has a sub-register, we can safely assume it is a 32-bit
114   // register, becuase all of SI's sub-registers are 32-bit.
115   if (isSGPRClass(RC)) {
116     return &AMDGPU::SGPR_32RegClass;
117   } else {
118     return &AMDGPU::VGPR_32RegClass;
119   }
120 }