[AArch64] Fix NZCV reg live-in bug in F128CSEL codegen.
[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 RC == &AMDGPU::SReg_32RegClass ||
80          RC == &AMDGPU::SReg_64RegClass ||
81          RC == &AMDGPU::SReg_128RegClass ||
82          RC == &AMDGPU::SReg_256RegClass ||
83          RC == &AMDGPU::SReg_512RegClass;
84 }