mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-17 00:50:58 +00:00
R600/SI: Rework MUBUF store instructions
The lowering of stores is now mostly handled in the tablegen files. No more BUFFER_STORE nodes I generated during legalization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183130 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c92287985
commit
4956bc61e1
@ -115,7 +115,6 @@ enum {
|
||||
RET_FLAG,
|
||||
BRANCH_COND,
|
||||
// End AMDIL ISD Opcodes
|
||||
BUFFER_STORE,
|
||||
DWORDADDR,
|
||||
FRACT,
|
||||
FMAX,
|
||||
|
@ -25,6 +25,8 @@
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
||||
const uint64_t RSRC_DATA_FORMAT = 0xf00000000000LL;
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
SITargetLowering::SITargetLowering(TargetMachine &TM) :
|
||||
@ -72,9 +74,6 @@ SITargetLowering::SITargetLowering(TargetMachine &TM) :
|
||||
|
||||
setOperationAction(ISD::SELECT_CC, MVT::Other, Expand);
|
||||
|
||||
setOperationAction(ISD::STORE, MVT::i32, Custom);
|
||||
setOperationAction(ISD::STORE, MVT::i64, Custom);
|
||||
|
||||
setTargetDAGCombine(ISD::SELECT_CC);
|
||||
|
||||
setTargetDAGCombine(ISD::SETCC);
|
||||
@ -214,10 +213,38 @@ SDValue SITargetLowering::LowerFormalArguments(
|
||||
MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter(
|
||||
MachineInstr * MI, MachineBasicBlock * BB) const {
|
||||
|
||||
MachineBasicBlock::iterator I = *MI;
|
||||
|
||||
switch (MI->getOpcode()) {
|
||||
default:
|
||||
return AMDGPUTargetLowering::EmitInstrWithCustomInserter(MI, BB);
|
||||
case AMDGPU::BRANCH: return BB;
|
||||
case AMDGPU::SI_ADDR64_RSRC: {
|
||||
MachineRegisterInfo &MRI = BB->getParent()->getRegInfo();
|
||||
unsigned SuperReg = MI->getOperand(0).getReg();
|
||||
unsigned SubRegLo = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
|
||||
unsigned SubRegHi = MRI.createVirtualRegister(&AMDGPU::SReg_64RegClass);
|
||||
unsigned SubRegHiHi = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
|
||||
unsigned SubRegHiLo = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
|
||||
BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::S_MOV_B64), SubRegLo)
|
||||
.addOperand(MI->getOperand(1));
|
||||
BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::S_MOV_B32), SubRegHiLo)
|
||||
.addImm(0);
|
||||
BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::S_MOV_B32), SubRegHiHi)
|
||||
.addImm(RSRC_DATA_FORMAT >> 32);
|
||||
BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::REG_SEQUENCE), SubRegHi)
|
||||
.addReg(SubRegHiLo)
|
||||
.addImm(AMDGPU::sub0)
|
||||
.addReg(SubRegHiHi)
|
||||
.addImm(AMDGPU::sub1);
|
||||
BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::REG_SEQUENCE), SuperReg)
|
||||
.addReg(SubRegLo)
|
||||
.addImm(AMDGPU::sub0_sub1)
|
||||
.addReg(SubRegHi)
|
||||
.addImm(AMDGPU::sub2_sub3);
|
||||
MI->eraseFromParent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BB;
|
||||
}
|
||||
@ -239,7 +266,6 @@ SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
||||
default: return AMDGPUTargetLowering::LowerOperation(Op, DAG);
|
||||
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
||||
case ISD::SELECT_CC: return LowerSELECT_CC(Op, DAG);
|
||||
case ISD::STORE: return LowerSTORE(Op, DAG);
|
||||
}
|
||||
return SDValue();
|
||||
}
|
||||
@ -338,32 +364,6 @@ SDValue SITargetLowering::LowerBRCOND(SDValue BRCOND,
|
||||
return Chain;
|
||||
}
|
||||
|
||||
const uint64_t RSRC_DATA_FORMAT = 0xf00000000000LL;
|
||||
|
||||
SDValue SITargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const {
|
||||
StoreSDNode *StoreNode = cast<StoreSDNode>(Op);
|
||||
SDValue Chain = Op.getOperand(0);
|
||||
SDValue Value = Op.getOperand(1);
|
||||
SDValue VirtualAddress = Op.getOperand(2);
|
||||
SDLoc DL(Op);
|
||||
|
||||
if (StoreNode->getAddressSpace() != AMDGPUAS::GLOBAL_ADDRESS) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue Zero = DAG.getConstant(0, MVT::i64);
|
||||
SDValue Format = DAG.getConstant(RSRC_DATA_FORMAT, MVT::i64);
|
||||
SDValue SrcSrc = DAG.getNode(ISD::BUILD_PAIR, DL, MVT::i128, Zero, Format);
|
||||
|
||||
SDValue Ops[2];
|
||||
Ops[0] = DAG.getNode(AMDGPUISD::BUFFER_STORE, DL, MVT::Other, Chain,
|
||||
Value, SrcSrc, VirtualAddress);
|
||||
Ops[1] = Chain;
|
||||
|
||||
return DAG.getMergeValues(Ops, 2, DL);
|
||||
|
||||
}
|
||||
|
||||
SDValue SITargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue LHS = Op.getOperand(0);
|
||||
SDValue RHS = Op.getOperand(1);
|
||||
|
@ -24,7 +24,6 @@ class SITargetLowering : public AMDGPUTargetLowering {
|
||||
const SIInstrInfo * TII;
|
||||
const TargetRegisterInfo * TRI;
|
||||
|
||||
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -26,10 +26,6 @@ def HI32 : SDNodeXForm<imm, [{
|
||||
return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
|
||||
}]>;
|
||||
|
||||
def SIbuffer_store : SDNode<"AMDGPUISD::BUFFER_STORE",
|
||||
SDTypeProfile<0, 3, [SDTCisPtrTy<1>, SDTCisInt<2>]>,
|
||||
[SDNPHasChain, SDNPMayStore]>;
|
||||
|
||||
def IMM8bitDWORD : ImmLeaf <
|
||||
i32, [{
|
||||
return (Imm & ~0x3FC) == 0;
|
||||
@ -327,16 +323,14 @@ multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
|
||||
|
||||
class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
|
||||
ValueType VT> :
|
||||
MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr),
|
||||
name#" $vdata, $srsrc + $vaddr",
|
||||
[(SIbuffer_store (VT vdataClass:$vdata), (i128 SReg_128:$srsrc),
|
||||
(i64 VReg_64:$vaddr))]> {
|
||||
MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
|
||||
name#" $vdata, $srsrc + $vaddr + $offset",
|
||||
[]> {
|
||||
|
||||
let mayLoad = 0;
|
||||
let mayStore = 1;
|
||||
|
||||
// Encoding
|
||||
let offset = 0;
|
||||
let offen = 0;
|
||||
let idxen = 0;
|
||||
let glc = 0;
|
||||
|
@ -416,7 +416,10 @@ def BUFFER_STORE_DWORD : MUBUF_Store_Helper <
|
||||
def BUFFER_STORE_DWORDX2 : MUBUF_Store_Helper <
|
||||
0x0000001d, "BUFFER_STORE_DWORDX2", VReg_64, i64
|
||||
>;
|
||||
//def BUFFER_STORE_DWORDX4 : MUBUF_DWORDX4 <0x0000001e, "BUFFER_STORE_DWORDX4", []>;
|
||||
|
||||
def BUFFER_STORE_DWORDX4 : MUBUF_Store_Helper <
|
||||
0x0000001e, "BUFFER_STORE_DWORDX4", VReg_128, v4i32
|
||||
>;
|
||||
//def BUFFER_ATOMIC_SWAP : MUBUF_ <0x00000030, "BUFFER_ATOMIC_SWAP", []>;
|
||||
//def BUFFER_ATOMIC_CMPSWAP : MUBUF_ <0x00000031, "BUFFER_ATOMIC_CMPSWAP", []>;
|
||||
//def BUFFER_ATOMIC_ADD : MUBUF_ <0x00000032, "BUFFER_ATOMIC_ADD", []>;
|
||||
@ -1200,6 +1203,19 @@ def SI_INDIRECT_DST_V16 : SI_INDIRECT_DST<VReg_512>;
|
||||
|
||||
} // Uses = [EXEC,VCC,M0], Defs = [EXEC,VCC,M0]
|
||||
|
||||
// This psuedo instruction takes a pointer as input and outputs a resource
|
||||
// constant that can be used with the ADDR64 MUBUF instructions.
|
||||
|
||||
let usesCustomInserter = 1 in {
|
||||
|
||||
def SI_ADDR64_RSRC : InstSI <
|
||||
(outs SReg_128:$srsrc),
|
||||
(ins SReg_64:$ptr),
|
||||
"", []
|
||||
>;
|
||||
|
||||
} // end usesCustomInserter
|
||||
|
||||
} // end IsCodeGenOnly, isPseudo
|
||||
|
||||
def : Pat<
|
||||
@ -1591,6 +1607,27 @@ defm : SMRD_Pattern <S_LOAD_DWORDX2_IMM, S_LOAD_DWORDX2_SGPR, i64>;
|
||||
defm : SMRD_Pattern <S_LOAD_DWORDX4_IMM, S_LOAD_DWORDX4_SGPR, v16i8>;
|
||||
defm : SMRD_Pattern <S_LOAD_DWORDX8_IMM, S_LOAD_DWORDX8_SGPR, v32i8>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// MUBUF Patterns
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
multiclass MUBUFStore_Pattern <MUBUF Instr, ValueType vt> {
|
||||
|
||||
def : Pat <
|
||||
(global_store vt:$value, i64:$ptr),
|
||||
(Instr $value, (SI_ADDR64_RSRC (i64 0)), $ptr, 0)
|
||||
>;
|
||||
|
||||
def : Pat <
|
||||
(global_store vt:$value, (add i64:$ptr, i64:$offset)),
|
||||
(Instr $value, (SI_ADDR64_RSRC $ptr), $offset, 0)
|
||||
>;
|
||||
}
|
||||
|
||||
defm : MUBUFStore_Pattern <BUFFER_STORE_DWORD, i32>;
|
||||
defm : MUBUFStore_Pattern <BUFFER_STORE_DWORDX2, i64>;
|
||||
defm : MUBUFStore_Pattern <BUFFER_STORE_DWORDX4, v4i32>;
|
||||
|
||||
/********** ====================== **********/
|
||||
/********** Indirect adressing **********/
|
||||
/********** ====================== **********/
|
||||
|
Loading…
Reference in New Issue
Block a user