diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-10-17 17:42:56 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-10-17 17:42:56 +0000 | 
| commit | 83a535ff6b8d53a9ad3e8cc17feb7dea39c0a6c7 (patch) | |
| tree | 0d3df56e1ccb303f32e1a488df42d34452a00484 /llvm/lib/Target | |
| parent | ad2363f9ee845c682155858f4a9c114b47b640a3 (diff) | |
| download | bcm5719-llvm-83a535ff6b8d53a9ad3e8cc17feb7dea39c0a6c7.tar.gz bcm5719-llvm-83a535ff6b8d53a9ad3e8cc17feb7dea39c0a6c7.zip | |
R600/SI: Remove SI_BUFFER_RSRC pseudo
Just use REG_SEQUENCE directly, so there are fewer
instructions to need to deal with later.
llvm-svn: 220056
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp | 29 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 30 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/SIInstructions.td | 6 | 
3 files changed, 23 insertions, 42 deletions
| diff --git a/llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp b/llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp index c7539716597..8a9340289d8 100644 --- a/llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/R600/AMDGPUISelDAGToDAG.cpp @@ -944,21 +944,38 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,    return SelectMUBUFAddr64(Addr, SRsrc, VAddr, Offset);  } +static SDValue buildSMovImm32(SelectionDAG *DAG, SDLoc DL, uint64_t Val) { +  SDValue K = DAG->getTargetConstant(Val, MVT::i32); +  return SDValue(DAG->getMachineNode(AMDGPU::S_MOV_B32, DL, MVT::i32, K), 0); +} +  static SDValue buildRSRC(SelectionDAG *DAG, SDLoc DL, SDValue Ptr,                           uint32_t RsrcDword1, uint64_t RsrcDword2And3) {    SDValue PtrLo = DAG->getTargetExtractSubreg(AMDGPU::sub0, DL, MVT::i32, Ptr);    SDValue PtrHi = DAG->getTargetExtractSubreg(AMDGPU::sub1, DL, MVT::i32, Ptr); -  if (RsrcDword1) +  if (RsrcDword1) {      PtrHi = SDValue(DAG->getMachineNode(AMDGPU::S_OR_B32, DL, MVT::i32, PtrHi,                                      DAG->getConstant(RsrcDword1, MVT::i32)), 0); +  } -  SDValue DataLo = DAG->getTargetConstant( -      RsrcDword2And3 & APInt::getAllOnesValue(32).getZExtValue(), MVT::i32); -  SDValue DataHi = DAG->getTargetConstant(RsrcDword2And3 >> 32, MVT::i32); +  SDValue DataLo = buildSMovImm32(DAG, DL, +                                  RsrcDword2And3 & UINT64_C(0xFFFFFFFF)); +  SDValue DataHi = buildSMovImm32(DAG, DL, RsrcDword2And3 >> 32); + +  const SDValue Ops[] = { +    DAG->getTargetConstant(AMDGPU::SReg_128RegClassID, MVT::i32), +    PtrLo, +    DAG->getTargetConstant(AMDGPU::sub0, MVT::i32), +    PtrHi, +    DAG->getTargetConstant(AMDGPU::sub1, MVT::i32), +    DataLo, +    DAG->getTargetConstant(AMDGPU::sub2, MVT::i32), +    DataHi, +    DAG->getTargetConstant(AMDGPU::sub3, MVT::i32) +  }; -  const SDValue Ops[] = { PtrLo, PtrHi, DataLo, DataHi }; -  return SDValue(DAG->getMachineNode(AMDGPU::SI_BUFFER_RSRC, DL, +  return SDValue(DAG->getMachineNode(AMDGPU::REG_SEQUENCE, DL,                                       MVT::v4i32, Ops), 0);  } diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index 28881955156..dc9153d3e91 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -623,36 +623,6 @@ MachineBasicBlock * SITargetLowering::EmitInstrWithCustomInserter(      MI->eraseFromParent();      break;    } -  case AMDGPU::SI_BUFFER_RSRC: { -    unsigned SuperReg = MI->getOperand(0).getReg(); -    unsigned Args[4]; -    for (unsigned i = 0, e = 4; i < e; ++i) { -      MachineOperand &Arg = MI->getOperand(i + 1); - -      if (Arg.isReg()) { -        Args[i] = Arg.getReg(); -        continue; -      } - -      assert(Arg.isImm()); -      unsigned Reg = MRI.createVirtualRegister(&AMDGPU::SGPR_32RegClass); -      BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::S_MOV_B32), Reg) -              .addImm(Arg.getImm()); -      Args[i] = Reg; -    } -    BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::REG_SEQUENCE), -            SuperReg) -            .addReg(Args[0]) -            .addImm(AMDGPU::sub0) -            .addReg(Args[1]) -            .addImm(AMDGPU::sub1) -            .addReg(Args[2]) -            .addImm(AMDGPU::sub2) -            .addReg(Args[3]) -            .addImm(AMDGPU::sub3); -    MI->eraseFromParent(); -    break; -  }    case AMDGPU::V_SUB_F64: {      unsigned DestReg = MI->getOperand(0).getReg();      BuildMI(*BB, I, MI->getDebugLoc(), TII->get(AMDGPU::V_ADD_F64), DestReg) diff --git a/llvm/lib/Target/R600/SIInstructions.td b/llvm/lib/Target/R600/SIInstructions.td index 1b94c2b9c5a..6e4321d7c67 100644 --- a/llvm/lib/Target/R600/SIInstructions.td +++ b/llvm/lib/Target/R600/SIInstructions.td @@ -1794,12 +1794,6 @@ def SI_ADDR64_RSRC : InstSI <    "", []  >; -def SI_BUFFER_RSRC : InstSI < -  (outs SReg_128:$srsrc), -  (ins SReg_32:$ptr_lo, SReg_32:$ptr_hi, SSrc_32:$data_lo, SSrc_32:$data_hi), -  "", [] ->; -  def V_SUB_F64 : InstSI <    (outs VReg_64:$dst),    (ins VReg_64:$src0, VReg_64:$src1), | 

