| //===-- SIMachineFunctionInfo.cpp - SI Machine Function Info -------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| /// \file |
| //===----------------------------------------------------------------------===// |
| |
| |
| #include "SIMachineFunctionInfo.h" |
| #include "SIRegisterInfo.h" |
| #include "llvm/CodeGen/MachineRegisterInfo.h" |
| |
| #define MAX_LANES 64 |
| |
| using namespace llvm; |
| |
| |
| // Pin the vtable to this file. |
| void SIMachineFunctionInfo::anchor() {} |
| |
| SIMachineFunctionInfo::SIMachineFunctionInfo(const MachineFunction &MF) |
| : AMDGPUMachineFunction(MF), |
| PSInputAddr(0), |
| SpillTracker() { } |
| |
| static unsigned createLaneVGPR(MachineRegisterInfo &MRI) { |
| return MRI.createVirtualRegister(&AMDGPU::VReg_32RegClass); |
| } |
| |
| unsigned SIMachineFunctionInfo::RegSpillTracker::getNextLane(MachineRegisterInfo &MRI) { |
| if (!LaneVGPR) { |
| LaneVGPR = createLaneVGPR(MRI); |
| } else { |
| CurrentLane++; |
| if (CurrentLane == MAX_LANES) { |
| CurrentLane = 0; |
| LaneVGPR = createLaneVGPR(MRI); |
| } |
| } |
| return CurrentLane; |
| } |
| |
| void SIMachineFunctionInfo::RegSpillTracker::addSpilledReg(unsigned FrameIndex, |
| unsigned Reg, |
| int Lane) { |
| SpilledRegisters[FrameIndex] = SpilledReg(Reg, Lane); |
| } |
| |
| const SIMachineFunctionInfo::SpilledReg& |
| SIMachineFunctionInfo::RegSpillTracker::getSpilledReg(unsigned FrameIndex) { |
| return SpilledRegisters[FrameIndex]; |
| } |