diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp index 72d5d6d09fe..af75aee7410 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -50,6 +50,24 @@ AMDGPURegisterBankInfo::AMDGPURegisterBankInfo(const TargetRegisterInfo &TRI) } +static bool isConstant(const MachineOperand &MO, int64_t &C) { + const MachineFunction *MF = MO.getParent()->getParent()->getParent(); + const MachineRegisterInfo &MRI = MF->getRegInfo(); + const MachineInstr *Def = MRI.getVRegDef(MO.getReg()); + if (!Def) + return false; + + if (Def->getOpcode() == AMDGPU::G_CONSTANT) { + C = Def->getOperand(1).getCImm()->getSExtValue(); + return true; + } + + if (Def->getOpcode() == AMDGPU::COPY) + return isConstant(Def->getOperand(1), C); + + return false; +} + unsigned AMDGPURegisterBankInfo::copyCost(const RegisterBank &Dst, const RegisterBank &Src, unsigned Size) const { @@ -415,6 +433,47 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { OpdsMapping[3] = AMDGPU::getValueMapping(Op3Bank, Size); break; } + + + case AMDGPU::G_EXTRACT_VECTOR_ELT: { + unsigned IdxOp = 2; + int64_t Imm; + // XXX - Do we really need to fully handle these? The constant case should + // be legalized away before RegBankSelect? + + unsigned OutputBankID = isSALUMapping(MI) && isConstant(MI.getOperand(IdxOp), Imm) ? + AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; + + unsigned IdxBank = getRegBankID(MI.getOperand(2).getReg(), MRI, *TRI); + OpdsMapping[0] = AMDGPU::getValueMapping(OutputBankID, MRI.getType(MI.getOperand(0).getReg()).getSizeInBits()); + OpdsMapping[1] = AMDGPU::getValueMapping(OutputBankID, MRI.getType(MI.getOperand(1).getReg()).getSizeInBits()); + + // The index can be either if the source vector is VGPR. + OpdsMapping[2] = AMDGPU::getValueMapping(IdxBank, MRI.getType(MI.getOperand(2).getReg()).getSizeInBits()); + break; + } + case AMDGPU::G_INSERT_VECTOR_ELT: { + // XXX - Do we really need to fully handle these? The constant case should + // be legalized away before RegBankSelect? + + int64_t Imm; + + unsigned IdxOp = MI.getOpcode() == AMDGPU::G_EXTRACT_VECTOR_ELT ? 2 : 3; + unsigned BankID = isSALUMapping(MI) && isConstant(MI.getOperand(IdxOp), Imm) ? + AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID; + + + + // TODO: Can do SGPR indexing, which would obviate the need for the + // isConstant check. + for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { + unsigned Size = getSizeInBits(MI.getOperand(i).getReg(), MRI, *TRI); + OpdsMapping[i] = AMDGPU::getValueMapping(BankID, Size); + } + + + break; + } case AMDGPU::G_INTRINSIC: { switch(MI.getOperand(1).getIntrinsicID()) { default: |

