145bb48eaSTom Stellard //===-- R600RegisterInfo.cpp - R600 Register Information ------------------===//
245bb48eaSTom Stellard //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
645bb48eaSTom Stellard //
745bb48eaSTom Stellard //===----------------------------------------------------------------------===//
845bb48eaSTom Stellard //
945bb48eaSTom Stellard /// \file
105f8f34e4SAdrian Prantl /// R600 implementation of the TargetRegisterInfo class.
1145bb48eaSTom Stellard //
1245bb48eaSTom Stellard //===----------------------------------------------------------------------===//
1345bb48eaSTom Stellard 
1445bb48eaSTom Stellard #include "R600RegisterInfo.h"
1548958d02SDaniil Fukalov #include "MCTargetDesc/R600MCTargetDesc.h"
1645bb48eaSTom Stellard #include "R600Defines.h"
17560d7e04Sdfukalov #include "R600Subtarget.h"
1845bb48eaSTom Stellard 
1945bb48eaSTom Stellard using namespace llvm;
2045bb48eaSTom Stellard 
21c5a154dbSTom Stellard #define GET_REGINFO_TARGET_DESC
22c5a154dbSTom Stellard #include "R600GenRegisterInfo.inc"
23c5a154dbSTom Stellard 
getSubRegFromChannel(unsigned Channel)24ed3527c6SStanislav Mekhanoshin unsigned R600RegisterInfo::getSubRegFromChannel(unsigned Channel) {
25ed3527c6SStanislav Mekhanoshin   static const uint16_t SubRegFromChannelTable[] = {
26ed3527c6SStanislav Mekhanoshin     R600::sub0, R600::sub1, R600::sub2, R600::sub3,
27ed3527c6SStanislav Mekhanoshin     R600::sub4, R600::sub5, R600::sub6, R600::sub7,
28ed3527c6SStanislav Mekhanoshin     R600::sub8, R600::sub9, R600::sub10, R600::sub11,
29ed3527c6SStanislav Mekhanoshin     R600::sub12, R600::sub13, R600::sub14, R600::sub15
30ed3527c6SStanislav Mekhanoshin   };
31ed3527c6SStanislav Mekhanoshin 
32*f15014ffSBenjamin Kramer   assert(Channel < array_lengthof(SubRegFromChannelTable));
33ed3527c6SStanislav Mekhanoshin   return SubRegFromChannelTable[Channel];
34ed3527c6SStanislav Mekhanoshin }
35ed3527c6SStanislav Mekhanoshin 
getReservedRegs(const MachineFunction & MF) const3645bb48eaSTom Stellard BitVector R600RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
3745bb48eaSTom Stellard   BitVector Reserved(getNumRegs());
3845bb48eaSTom Stellard 
3943e92fe3SMatt Arsenault   const R600Subtarget &ST = MF.getSubtarget<R600Subtarget>();
4043e92fe3SMatt Arsenault   const R600InstrInfo *TII = ST.getInstrInfo();
4145bb48eaSTom Stellard 
42c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::ZERO);
43c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::HALF);
44c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::ONE);
45c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::ONE_INT);
46c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::NEG_HALF);
47c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::NEG_ONE);
48c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::PV_X);
49c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::ALU_LITERAL_X);
50c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::ALU_CONST);
51c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::PREDICATE_BIT);
52c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::PRED_SEL_OFF);
53c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::PRED_SEL_ZERO);
54c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::PRED_SEL_ONE);
55c5a154dbSTom Stellard   reserveRegisterTuples(Reserved, R600::INDIRECT_BASE_ADDR);
5645bb48eaSTom Stellard 
57f78c1b07SKazu Hirata   for (MCPhysReg R : R600::R600_AddrRegClass)
58f78c1b07SKazu Hirata     reserveRegisterTuples(Reserved, R);
5945bb48eaSTom Stellard 
60c4796d47SGeoff Berry   TII->reserveIndirectRegisters(Reserved, MF, *this);
6145bb48eaSTom Stellard 
6245bb48eaSTom Stellard   return Reserved;
6345bb48eaSTom Stellard }
6445bb48eaSTom Stellard 
652b1f9aa5SMatt Arsenault // Dummy to not crash RegisterClassInfo.
66c5a154dbSTom Stellard static const MCPhysReg CalleeSavedReg = R600::NoRegister;
672b1f9aa5SMatt Arsenault 
getCalleeSavedRegs(const MachineFunction *) const682b1f9aa5SMatt Arsenault const MCPhysReg *R600RegisterInfo::getCalleeSavedRegs(
692b1f9aa5SMatt Arsenault   const MachineFunction *) const {
702b1f9aa5SMatt Arsenault   return &CalleeSavedReg;
712b1f9aa5SMatt Arsenault }
722b1f9aa5SMatt Arsenault 
getFrameRegister(const MachineFunction & MF) const73e3a676e9SMatt Arsenault Register R600RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
74c5a154dbSTom Stellard   return R600::NoRegister;
752b1f9aa5SMatt Arsenault }
762b1f9aa5SMatt Arsenault 
getHWRegChan(unsigned reg) const7745bb48eaSTom Stellard unsigned R600RegisterInfo::getHWRegChan(unsigned reg) const {
7845bb48eaSTom Stellard   return this->getEncodingValue(reg) >> HW_CHAN_SHIFT;
7945bb48eaSTom Stellard }
8045bb48eaSTom Stellard 
getHWRegIndex(unsigned Reg) const8145bb48eaSTom Stellard unsigned R600RegisterInfo::getHWRegIndex(unsigned Reg) const {
8245bb48eaSTom Stellard   return GET_REG_INDEX(getEncodingValue(Reg));
8345bb48eaSTom Stellard }
8445bb48eaSTom Stellard 
getCFGStructurizerRegClass(MVT VT) const8545bb48eaSTom Stellard const TargetRegisterClass * R600RegisterInfo::getCFGStructurizerRegClass(
8645bb48eaSTom Stellard                                                                    MVT VT) const {
8745bb48eaSTom Stellard   switch(VT.SimpleTy) {
8845bb48eaSTom Stellard   default:
89c5a154dbSTom Stellard   case MVT::i32: return &R600::R600_TReg32RegClass;
9045bb48eaSTom Stellard   }
9145bb48eaSTom Stellard }
9245bb48eaSTom Stellard 
isPhysRegLiveAcrossClauses(Register Reg) const9334978602SJay Foad bool R600RegisterInfo::isPhysRegLiveAcrossClauses(Register Reg) const {
9434978602SJay Foad   assert(!Reg.isVirtual());
9545bb48eaSTom Stellard 
9645bb48eaSTom Stellard   switch (Reg) {
97c5a154dbSTom Stellard   case R600::OQAP:
98c5a154dbSTom Stellard   case R600::OQBP:
99c5a154dbSTom Stellard   case R600::AR_X:
10045bb48eaSTom Stellard     return false;
10145bb48eaSTom Stellard   default:
10245bb48eaSTom Stellard     return true;
10345bb48eaSTom Stellard   }
10445bb48eaSTom Stellard }
10552a4d9b4SMatt Arsenault 
eliminateFrameIndex(MachineBasicBlock::iterator MI,int SPAdj,unsigned FIOperandNum,RegScavenger * RS) const10652a4d9b4SMatt Arsenault void R600RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
10752a4d9b4SMatt Arsenault                                            int SPAdj,
10852a4d9b4SMatt Arsenault                                            unsigned FIOperandNum,
10952a4d9b4SMatt Arsenault                                            RegScavenger *RS) const {
11052a4d9b4SMatt Arsenault   llvm_unreachable("Subroutines not supported yet");
11152a4d9b4SMatt Arsenault }
112c5a154dbSTom Stellard 
reserveRegisterTuples(BitVector & Reserved,unsigned Reg) const113c5a154dbSTom Stellard void R600RegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const {
114c5a154dbSTom Stellard   MCRegAliasIterator R(Reg, this, true);
115c5a154dbSTom Stellard 
116c5a154dbSTom Stellard   for (; R.isValid(); ++R)
117c5a154dbSTom Stellard     Reserved.set(*R);
118c5a154dbSTom Stellard }
119