mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-03 18:29:48 +00:00
The AMDGPUIndirectAddressing pass was previously responsible for lowering private loads and stores to indirect addressing instructions. However, this pass was buggy and way too complicated. The only advantage it had over the new simplified code was that it saved one instruction per direct write to private memory. This optimization likely has a minimal impact on performance, and we may be able to duplicate it using some other transformation. For the private address space, we now: 1. Lower private loads/store to Register(Load|Store) instructions 2. Reserve part of the register file as 'private memory' 3. After regalloc lower the Register(Load|Store) instructions to MOV instructions that use indirect addressing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193179 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
2.7 KiB
C++
88 lines
2.7 KiB
C++
//===-- R600RegisterInfo.cpp - R600 Register Information ------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file
|
|
/// \brief R600 implementation of the TargetRegisterInfo class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "R600RegisterInfo.h"
|
|
#include "AMDGPUTargetMachine.h"
|
|
#include "R600Defines.h"
|
|
#include "R600InstrInfo.h"
|
|
#include "R600MachineFunctionInfo.h"
|
|
|
|
using namespace llvm;
|
|
|
|
R600RegisterInfo::R600RegisterInfo(AMDGPUTargetMachine &tm)
|
|
: AMDGPURegisterInfo(tm),
|
|
TM(tm)
|
|
{ RCW.RegWeight = 0; RCW.WeightLimit = 0;}
|
|
|
|
BitVector R600RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
|
BitVector Reserved(getNumRegs());
|
|
|
|
Reserved.set(AMDGPU::ZERO);
|
|
Reserved.set(AMDGPU::HALF);
|
|
Reserved.set(AMDGPU::ONE);
|
|
Reserved.set(AMDGPU::ONE_INT);
|
|
Reserved.set(AMDGPU::NEG_HALF);
|
|
Reserved.set(AMDGPU::NEG_ONE);
|
|
Reserved.set(AMDGPU::PV_X);
|
|
Reserved.set(AMDGPU::ALU_LITERAL_X);
|
|
Reserved.set(AMDGPU::ALU_CONST);
|
|
Reserved.set(AMDGPU::PREDICATE_BIT);
|
|
Reserved.set(AMDGPU::PRED_SEL_OFF);
|
|
Reserved.set(AMDGPU::PRED_SEL_ZERO);
|
|
Reserved.set(AMDGPU::PRED_SEL_ONE);
|
|
Reserved.set(AMDGPU::INDIRECT_BASE_ADDR);
|
|
|
|
for (TargetRegisterClass::iterator I = AMDGPU::R600_AddrRegClass.begin(),
|
|
E = AMDGPU::R600_AddrRegClass.end(); I != E; ++I) {
|
|
Reserved.set(*I);
|
|
}
|
|
|
|
const R600InstrInfo *RII =
|
|
static_cast<const R600InstrInfo*>(TM.getInstrInfo());
|
|
std::vector<unsigned> IndirectRegs = RII->getIndirectReservedRegs(MF);
|
|
for (std::vector<unsigned>::iterator I = IndirectRegs.begin(),
|
|
E = IndirectRegs.end();
|
|
I != E; ++I) {
|
|
Reserved.set(*I);
|
|
}
|
|
return Reserved;
|
|
}
|
|
|
|
const TargetRegisterClass *
|
|
R600RegisterInfo::getISARegClass(const TargetRegisterClass * rc) const {
|
|
switch (rc->getID()) {
|
|
case AMDGPU::GPRF32RegClassID:
|
|
case AMDGPU::GPRI32RegClassID:
|
|
return &AMDGPU::R600_Reg32RegClass;
|
|
default: return rc;
|
|
}
|
|
}
|
|
|
|
unsigned R600RegisterInfo::getHWRegChan(unsigned reg) const {
|
|
return this->getEncodingValue(reg) >> HW_CHAN_SHIFT;
|
|
}
|
|
|
|
const TargetRegisterClass * R600RegisterInfo::getCFGStructurizerRegClass(
|
|
MVT VT) const {
|
|
switch(VT.SimpleTy) {
|
|
default:
|
|
case MVT::i32: return &AMDGPU::R600_TReg32RegClass;
|
|
}
|
|
}
|
|
|
|
const RegClassWeight &R600RegisterInfo::getRegClassWeight(
|
|
const TargetRegisterClass *RC) const {
|
|
return RCW;
|
|
}
|