SIRegisterInfo.cpp revision b52bf6a3b31596a309f4b12884522e9b4a344654
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
19using namespace llvm;
20
21SIRegisterInfo::SIRegisterInfo(AMDGPUTargetMachine &tm)
22: AMDGPURegisterInfo(tm),
23  TM(tm)
24  { }
25
26BitVector SIRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
27  BitVector Reserved(getNumRegs());
28  Reserved.set(AMDGPU::EXEC);
29  return Reserved;
30}
31
32unsigned SIRegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
33                                             MachineFunction &MF) const {
34  return RC->getNumRegs();
35}
36
37const TargetRegisterClass *
38SIRegisterInfo::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
46const TargetRegisterClass * SIRegisterInfo::getCFGStructurizerRegClass(
47                                                                   MVT VT) const {
48  switch(VT.SimpleTy) {
49    default:
50    case MVT::i32: return &AMDGPU::VReg_32RegClass;
51  }
52}
53
54const 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
75bool SIRegisterInfo::isSGPRClass(const TargetRegisterClass *RC) const {
76  if (!RC) {
77    return false;
78  }
79  return !hasVGPRs(RC);
80}
81
82bool 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
90const 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
108const 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}
121