diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-01-06 17:06:27 -0500 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2015-01-06 17:06:27 -0500 |
commit | 6b36c5d38ca03f6a44737e64d9ffb94c36821c67 (patch) | |
tree | 5d978137874067536358bc1a600c24af79ab4463 | |
parent | 3ea36df984658bb46c93407a3a66e950fbda1fd9 (diff) |
R600/SI: Add soffset operand to mubuf addr64 instruction
We were previously hard-coding soffset to 0.
-rw-r--r-- | lib/Target/R600/AMDGPUISelDAGToDAG.cpp | 15 | ||||
-rw-r--r-- | lib/Target/R600/SIISelLowering.cpp | 1 | ||||
-rw-r--r-- | lib/Target/R600/SIInstrInfo.cpp | 5 | ||||
-rw-r--r-- | lib/Target/R600/SIInstrInfo.td | 35 | ||||
-rw-r--r-- | lib/Target/R600/SIInstructions.td | 4 |
5 files changed, 32 insertions, 28 deletions
diff --git a/lib/Target/R600/AMDGPUISelDAGToDAG.cpp b/lib/Target/R600/AMDGPUISelDAGToDAG.cpp index 10c5b47c097..f55d5eeccd4 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; @@ -918,9 +918,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); @@ -940,11 +940,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 5bb767875fa..448044eb823 100644 --- a/lib/Target/R600/SIISelLowering.cpp +++ b/lib/Target/R600/SIISelLowering.cpp @@ -1967,6 +1967,7 @@ MachineSDNode *SITargetLowering::AdjustRegClass(MachineSDNode *N, SmallVector<SDValue, 8> 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 c0fb68edb7c..e513604680c 100644 --- a/lib/Target/R600/SIInstrInfo.cpp +++ b/lib/Target/R600/SIInstrInfo.cpp @@ -1650,9 +1650,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()); @@ -1663,6 +1660,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(); @@ -1841,6 +1839,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 0976c72429f..81a3a287929 100644 --- a/lib/Target/R600/SIInstrInfo.td +++ b/lib/Target/R600/SIInstrInfo.td @@ -271,8 +271,8 @@ def DS1Addr1Offset : ComplexPattern<i32, 2, "SelectDS1Addr1Offset">; def DS64Bit4ByteAligned : ComplexPattern<i32, 3, "SelectDS64Bit4ByteAligned">; def MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">; -def MUBUFAddr64 : ComplexPattern<i64, 3, "SelectMUBUFAddr64">; -def MUBUFAddr64Atomic : ComplexPattern<i64, 4, "SelectMUBUFAddr64">; +def MUBUFAddr64 : ComplexPattern<i64, 4, "SelectMUBUFAddr64">; +def MUBUFAddr64Atomic : ComplexPattern<i64, 5, "SelectMUBUFAddr64">; def MUBUFScratch : ComplexPattern<i64, 4, "SelectMUBUFScratch">; def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">; def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">; @@ -1594,11 +1594,11 @@ multiclass MUBUF_Atomic <bits<7> op, string name, RegisterClass rc, def _RTN_ADDR64 : MUBUFAtomicAddr64 < op, (outs rc:$vdata), (ins rc:$vdata_in, SReg_128:$srsrc, VReg_64:$vaddr, - mbuf_offset:$offset, slc:$slc), - name#" $vdata, $vaddr, $srsrc, 0 addr64"#"$offset"#" glc"#"$slc", + mbuf_offset:$offset, SSrc_32:$soffset, slc:$slc), + name#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset"#" glc"#"$slc", [(set vt:$vdata, - (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i16:$offset, - i1:$slc), vt:$vdata_in))] + (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset, + i16:$offset, i1:$slc), vt:$vdata_in))] >, MUBUFAddr64Table<1, "_RTN">, AtomicNoRet<NAME#"_ADDR64", 1>; def _RTN_OFFSET : MUBUFAtomicOffset < @@ -1632,7 +1632,7 @@ multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass, asm#" $vdata, $srsrc, $soffset"#"$offset"#"$glc"#"$slc"#"$tfe", [(set load_vt:$vdata, (ld (MUBUFOffset v4i32:$srsrc, i32:$soffset, i16:$offset, - i1:$glc, i1:$slc, i1:$tfe)))]>, + glc:$glc, slc:$slc, tfe:$tfe)))]>, MUBUFAddr64Table<0>; } @@ -1656,16 +1656,18 @@ multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass, def _BOTHEN : MUBUF_si <op, (outs regClass:$vdata), (ins SReg_128:$srsrc, VReg_64:$vaddr, SSrc_32:$soffset, glc:$glc, slc:$slc, tfe:$tfe), - asm#" $vdata, $vaddr, $srsrc, $soffset, idxen offen"#"$glc"#"$slc"#"$tfe", []>; + asm#" $vdata, $vaddr, $srsrc, $soffset idxen offen"#"$glc"#"$slc"#"$tfe", []>; } } - let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in { + let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0 in { def _ADDR64 : MUBUF_si <op, (outs regClass:$vdata), - (ins SReg_128:$srsrc, VReg_64:$vaddr, mbuf_offset:$offset), - asm#" $vdata, $vaddr, $srsrc, 0 addr64"#"$offset", + (ins SReg_128:$srsrc, VReg_64:$vaddr, + SSrc_32:$soffset, mbuf_offset:$offset), + asm#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset", [(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc, - i64:$vaddr, i16:$offset)))]>, MUBUFAddr64Table<1>; + i64:$vaddr, i32:$soffset, + i16:$offset)))]>, MUBUFAddr64Table<1>; } } } @@ -1754,10 +1756,12 @@ multiclass MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass def _ADDR64 : MUBUF_si < op, (outs), - (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, mbuf_offset:$offset), - name#" $vdata, $vaddr, $srsrc, 0 addr64"#"$offset", + (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, + mbuf_offset:$offset, SSrc_32:$soffset), + name#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset", [(st store_vt:$vdata, - (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i16:$offset))]>, MUBUFAddr64Table<1> + (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, i32:$soffset, i16:$offset))]>, + MUBUFAddr64Table<1> { let mayLoad = 0; @@ -1770,7 +1774,6 @@ multiclass MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass let addr64 = 1; let slc = 0; let tfe = 0; - let soffset = 128; // ZERO } } diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td index b5a4b778fa9..ae789ed391a 100644 --- a/lib/Target/R600/SIInstructions.td +++ b/lib/Target/R600/SIInstructions.td @@ -2837,8 +2837,8 @@ def : DSAtomicCmpXChg<DS_CMPST_RTN_B64, i64, atomic_cmp_swap_64_local>; multiclass MUBUFLoad_Pattern <MUBUF Instr_ADDR64, ValueType vt, PatFrag constant_ld> { 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) >; } |