From 6378a7cb0b0997f017115a714c262fdb30cadc8d Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Wed, 11 Feb 2015 00:34:32 +0000 Subject: [PATCH] R600/SI: Add soffset operand to mubuf addr64 instruction We were previously hard-coding soffset to 0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228775 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/R600/AMDGPUISelDAGToDAG.cpp | 15 +++++++------- lib/Target/R600/SIISelLowering.cpp | 1 + lib/Target/R600/SIInstrInfo.cpp | 5 ++--- lib/Target/R600/SIInstrInfo.td | 36 +++++++++++++++++++--------------- lib/Target/R600/SIInstructions.td | 4 ++-- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/lib/Target/R600/AMDGPUISelDAGToDAG.cpp b/lib/Target/R600/AMDGPUISelDAGToDAG.cpp index 36296f52e68..ebe34431da2 100644 --- a/lib/Target/R600/AMDGPUISelDAGToDAG.cpp +++ b/lib/Target/R600/AMDGPUISelDAGToDAG.cpp @@ -95,9 +95,9 @@ private: SDValue &Idxen, SDValue &Addr64, SDValue &GLC, SDValue &SLC, SDValue &TFE) const; bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, SDValue &VAddr, - SDValue &Offset) const; + SDValue &SOffset, SDValue &Offset) const; bool SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, - SDValue &VAddr, SDValue &Offset, + SDValue &VAddr, SDValue &SOffset, SDValue &Offset, SDValue &SLC) const; bool SelectMUBUFScratch(SDValue Addr, SDValue &RSrc, SDValue &VAddr, SDValue &SOffset, SDValue &ImmOffset) const; @@ -964,9 +964,9 @@ void AMDGPUDAGToDAGISel::SelectMUBUF(SDValue Addr, SDValue &Ptr, } bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, - SDValue &VAddr, + SDValue &VAddr, SDValue &SOffset, SDValue &Offset) const { - SDValue Ptr, SOffset, Offen, Idxen, Addr64, GLC, SLC, TFE; + SDValue Ptr, Offen, Idxen, Addr64, GLC, SLC, TFE; SelectMUBUF(Addr, Ptr, VAddr, SOffset, Offset, Offen, Idxen, Addr64, GLC, SLC, TFE); @@ -986,11 +986,12 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, } bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc, - SDValue &VAddr, SDValue &Offset, - SDValue &SLC) const { + SDValue &VAddr, SDValue &SOffset, + SDValue &Offset, + SDValue &SLC) const { SLC = CurDAG->getTargetConstant(0, MVT::i1); - return SelectMUBUFAddr64(Addr, SRsrc, VAddr, Offset); + return SelectMUBUFAddr64(Addr, SRsrc, VAddr, SOffset, Offset); } bool AMDGPUDAGToDAGISel::SelectMUBUFScratch(SDValue Addr, SDValue &Rsrc, diff --git a/lib/Target/R600/SIISelLowering.cpp b/lib/Target/R600/SIISelLowering.cpp index aeb3d131fb5..d8cee5ae428 100644 --- a/lib/Target/R600/SIISelLowering.cpp +++ b/lib/Target/R600/SIISelLowering.cpp @@ -2124,6 +2124,7 @@ MachineSDNode *SITargetLowering::AdjustRegClass(MachineSDNode *N, SmallVector Ops; Ops.push_back(SDValue(RSrc, 0)); Ops.push_back(N->getOperand(0)); + Ops.push_back(DAG.getTargetConstant(0, MVT::i32)); // soffset // The immediate offset is in dwords on SI and in bytes on VI. if (Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) diff --git a/lib/Target/R600/SIInstrInfo.cpp b/lib/Target/R600/SIInstrInfo.cpp index 7e2c0bd9ec2..80e9c865961 100644 --- a/lib/Target/R600/SIInstrInfo.cpp +++ b/lib/Target/R600/SIInstrInfo.cpp @@ -1729,9 +1729,6 @@ void SIInstrInfo::legalizeOperands(MachineInstr *MI) const { MachineOperand *VData = getNamedOperand(*MI, AMDGPU::OpName::vdata); MachineOperand *Offset = getNamedOperand(*MI, AMDGPU::OpName::offset); MachineOperand *SOffset = getNamedOperand(*MI, AMDGPU::OpName::soffset); - assert(SOffset->isImm() && SOffset->getImm() == 0 && "Legalizing MUBUF " - "with non-zero soffset is not implemented"); - (void)SOffset; // Create the new instruction. unsigned Addr64Opcode = AMDGPU::getAddr64Inst(MI->getOpcode()); @@ -1742,6 +1739,7 @@ void SIInstrInfo::legalizeOperands(MachineInstr *MI) const { .addReg(AMDGPU::NoRegister) // Dummy value for vaddr. // This will be replaced later // with the new value of vaddr. + .addOperand(*SOffset) .addOperand(*Offset); MI->removeFromParent(); @@ -1920,6 +1918,7 @@ void SIInstrInfo::moveSMRDToVALU(MachineInstr *MI, MachineRegisterInfo &MRI) con MI->getOperand(2).ChangeToRegister(MI->getOperand(1).getReg(), false); } MI->getOperand(1).setReg(SRsrc); + MI->addOperand(*MBB->getParent(), MachineOperand::CreateImm(0)); MI->addOperand(*MBB->getParent(), MachineOperand::CreateImm(ImmOffset)); const TargetRegisterClass *NewDstRC = diff --git a/lib/Target/R600/SIInstrInfo.td b/lib/Target/R600/SIInstrInfo.td index 7677641c0f1..14c517a3ed7 100644 --- a/lib/Target/R600/SIInstrInfo.td +++ b/lib/Target/R600/SIInstrInfo.td @@ -292,8 +292,8 @@ def DS1Addr1Offset : ComplexPattern; def DS64Bit4ByteAligned : ComplexPattern; def MUBUFAddr32 : ComplexPattern; -def MUBUFAddr64 : ComplexPattern; -def MUBUFAddr64Atomic : ComplexPattern; +def MUBUFAddr64 : ComplexPattern; +def MUBUFAddr64Atomic : ComplexPattern; def MUBUFScratch : ComplexPattern; def MUBUFOffset : ComplexPattern; def MUBUFOffsetAtomic : ComplexPattern; @@ -1743,7 +1743,7 @@ multiclass MUBUFAtomicAddr64_m , AtomicNoRet; - let offen = 0, idxen = 0, addr64 = 1, tfe = 0, soffset = 128 in { + let offen = 0, idxen = 0, addr64 = 1, tfe = 0 in { def _si : MUBUF_Real_si ; } @@ -1781,11 +1781,11 @@ multiclass MUBUF_Atomic ; defm _RTN_OFFSET : MUBUFAtomicOffset_m < @@ -1842,12 +1842,14 @@ multiclass MUBUF_Load_Helper ; } - let offen = 0, idxen = 0, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in { + let offen = 0, idxen = 0, glc = 0, slc = 0, tfe = 0 in { defm _ADDR64 : MUBUFAddr64_m ; + i64:$vaddr, i32:$soffset, + i16:$offset)))]>; } } } @@ -1879,13 +1881,15 @@ multiclass MUBUF_Store_Helper ; } // end offen = 1, idxen = 0 - let offen = 0, idxen = 0, glc = 0, slc = 0, tfe = 0, - soffset = 128 /* ZERO */ in { + let offen = 0, idxen = 0, glc = 0, slc = 0, tfe = 0 in { defm _ADDR64 : MUBUFAddr64_m ; + (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, + i32:$soffset, i16:$offset))]>; } } // End mayLoad = 0, mayStore = 1 } diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td index 4c57187c3d9..9ec79945b7a 100644 --- a/lib/Target/R600/SIInstructions.td +++ b/lib/Target/R600/SIInstructions.td @@ -2877,8 +2877,8 @@ def : DSAtomicCmpXChg; multiclass MUBUFLoad_Pattern { def : Pat < - (vt (constant_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i16:$offset))), - (Instr_ADDR64 $srsrc, $vaddr, $offset) + (vt (constant_ld (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset))), + (Instr_ADDR64 $srsrc, $vaddr, $soffset, $offset) >; } -- 2.11.0