1*9880d681SAndroid Build Coastguard Worker //===-- R600RegisterInfo.cpp - R600 Register Information ------------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker /// \file 11*9880d681SAndroid Build Coastguard Worker /// \brief R600 implementation of the TargetRegisterInfo class. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "R600RegisterInfo.h" 16*9880d681SAndroid Build Coastguard Worker #include "AMDGPUTargetMachine.h" 17*9880d681SAndroid Build Coastguard Worker #include "R600Defines.h" 18*9880d681SAndroid Build Coastguard Worker #include "R600InstrInfo.h" 19*9880d681SAndroid Build Coastguard Worker #include "R600MachineFunctionInfo.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker using namespace llvm; 22*9880d681SAndroid Build Coastguard Worker R600RegisterInfo()23*9880d681SAndroid Build Coastguard WorkerR600RegisterInfo::R600RegisterInfo() : AMDGPURegisterInfo() { 24*9880d681SAndroid Build Coastguard Worker RCW.RegWeight = 0; 25*9880d681SAndroid Build Coastguard Worker RCW.WeightLimit = 0; 26*9880d681SAndroid Build Coastguard Worker } 27*9880d681SAndroid Build Coastguard Worker getReservedRegs(const MachineFunction & MF) const28*9880d681SAndroid Build Coastguard WorkerBitVector R600RegisterInfo::getReservedRegs(const MachineFunction &MF) const { 29*9880d681SAndroid Build Coastguard Worker BitVector Reserved(getNumRegs()); 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker const R600Subtarget &ST = MF.getSubtarget<R600Subtarget>(); 32*9880d681SAndroid Build Coastguard Worker const R600InstrInfo *TII = ST.getInstrInfo(); 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::ZERO); 35*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::HALF); 36*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::ONE); 37*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::ONE_INT); 38*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::NEG_HALF); 39*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::NEG_ONE); 40*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::PV_X); 41*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::ALU_LITERAL_X); 42*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::ALU_CONST); 43*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::PREDICATE_BIT); 44*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::PRED_SEL_OFF); 45*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::PRED_SEL_ZERO); 46*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::PRED_SEL_ONE); 47*9880d681SAndroid Build Coastguard Worker Reserved.set(AMDGPU::INDIRECT_BASE_ADDR); 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker for (TargetRegisterClass::iterator I = AMDGPU::R600_AddrRegClass.begin(), 50*9880d681SAndroid Build Coastguard Worker E = AMDGPU::R600_AddrRegClass.end(); I != E; ++I) { 51*9880d681SAndroid Build Coastguard Worker Reserved.set(*I); 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker TII->reserveIndirectRegisters(Reserved, MF); 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker return Reserved; 57*9880d681SAndroid Build Coastguard Worker } 58*9880d681SAndroid Build Coastguard Worker getHWRegChan(unsigned reg) const59*9880d681SAndroid Build Coastguard Workerunsigned R600RegisterInfo::getHWRegChan(unsigned reg) const { 60*9880d681SAndroid Build Coastguard Worker return this->getEncodingValue(reg) >> HW_CHAN_SHIFT; 61*9880d681SAndroid Build Coastguard Worker } 62*9880d681SAndroid Build Coastguard Worker getHWRegIndex(unsigned Reg) const63*9880d681SAndroid Build Coastguard Workerunsigned R600RegisterInfo::getHWRegIndex(unsigned Reg) const { 64*9880d681SAndroid Build Coastguard Worker return GET_REG_INDEX(getEncodingValue(Reg)); 65*9880d681SAndroid Build Coastguard Worker } 66*9880d681SAndroid Build Coastguard Worker getCFGStructurizerRegClass(MVT VT) const67*9880d681SAndroid Build Coastguard Workerconst TargetRegisterClass * R600RegisterInfo::getCFGStructurizerRegClass( 68*9880d681SAndroid Build Coastguard Worker MVT VT) const { 69*9880d681SAndroid Build Coastguard Worker switch(VT.SimpleTy) { 70*9880d681SAndroid Build Coastguard Worker default: 71*9880d681SAndroid Build Coastguard Worker case MVT::i32: return &AMDGPU::R600_TReg32RegClass; 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker } 74*9880d681SAndroid Build Coastguard Worker getRegClassWeight(const TargetRegisterClass * RC) const75*9880d681SAndroid Build Coastguard Workerconst RegClassWeight &R600RegisterInfo::getRegClassWeight( 76*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *RC) const { 77*9880d681SAndroid Build Coastguard Worker return RCW; 78*9880d681SAndroid Build Coastguard Worker } 79*9880d681SAndroid Build Coastguard Worker isPhysRegLiveAcrossClauses(unsigned Reg) const80*9880d681SAndroid Build Coastguard Workerbool R600RegisterInfo::isPhysRegLiveAcrossClauses(unsigned Reg) const { 81*9880d681SAndroid Build Coastguard Worker assert(!TargetRegisterInfo::isVirtualRegister(Reg)); 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker switch (Reg) { 84*9880d681SAndroid Build Coastguard Worker case AMDGPU::OQAP: 85*9880d681SAndroid Build Coastguard Worker case AMDGPU::OQBP: 86*9880d681SAndroid Build Coastguard Worker case AMDGPU::AR_X: 87*9880d681SAndroid Build Coastguard Worker return false; 88*9880d681SAndroid Build Coastguard Worker default: 89*9880d681SAndroid Build Coastguard Worker return true; 90*9880d681SAndroid Build Coastguard Worker } 91*9880d681SAndroid Build Coastguard Worker } 92*9880d681SAndroid Build Coastguard Worker eliminateFrameIndex(MachineBasicBlock::iterator MI,int SPAdj,unsigned FIOperandNum,RegScavenger * RS) const93*9880d681SAndroid Build Coastguard Workervoid R600RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, 94*9880d681SAndroid Build Coastguard Worker int SPAdj, 95*9880d681SAndroid Build Coastguard Worker unsigned FIOperandNum, 96*9880d681SAndroid Build Coastguard Worker RegScavenger *RS) const { 97*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Subroutines not supported yet"); 98*9880d681SAndroid Build Coastguard Worker } 99