diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-31 19:27:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-31 19:27:28 +0000 | 
| commit | ec304151b74f9254d7029ee4d197ce1f7cbe501a (patch) | |
| tree | 63e4ed55e4fbb581fd4731d44a327a7b3278e0a1 /lib/Target/R600/AMDGPUISelDAGToDAG.cpp | |
| parent | 67c32a98315f785a9ec9d531c1f571a0196c7463 (diff) | |
Diffstat (limited to 'lib/Target/R600/AMDGPUISelDAGToDAG.cpp')
| -rw-r--r-- | lib/Target/R600/AMDGPUISelDAGToDAG.cpp | 59 | 
1 files changed, 38 insertions, 21 deletions
diff --git a/lib/Target/R600/AMDGPUISelDAGToDAG.cpp b/lib/Target/R600/AMDGPUISelDAGToDAG.cpp index eaa506db96c3c..15112c7e54d4e 100644 --- a/lib/Target/R600/AMDGPUISelDAGToDAG.cpp +++ b/lib/Target/R600/AMDGPUISelDAGToDAG.cpp @@ -417,6 +417,28 @@ SDNode *AMDGPUDAGToDAGISel::Select(SDNode *N) {                                    N->getValueType(0), Ops);    } +  case ISD::LOAD: { +    // To simplify the TableGen patters, we replace all i64 loads with +    // v2i32 loads.  Alternatively, we could promote i64 loads to v2i32 +    // during DAG legalization, however, so places (ExpandUnalignedLoad) +    // in the DAG legalizer assume that if i64 is legal, so doing this +    // promotion early can cause problems. +    EVT VT = N->getValueType(0); +    LoadSDNode *LD = cast<LoadSDNode>(N); +    if (VT != MVT::i64 || LD->getExtensionType() != ISD::NON_EXTLOAD) +      break; + +    SDValue NewLoad = CurDAG->getLoad(MVT::v2i32, SDLoc(N), LD->getChain(), +                                     LD->getBasePtr(), LD->getMemOperand()); +    SDValue BitCast = CurDAG->getNode(ISD::BITCAST, SDLoc(N), +                                      MVT::i64, NewLoad); +    CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 1), NewLoad.getValue(1)); +    CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 0), BitCast); +    SelectCode(NewLoad.getNode()); +    N = BitCast.getNode(); +    break; +  } +    case AMDGPUISD::REGISTER_LOAD: {      if (ST.getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS)        break; @@ -962,16 +984,27 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFScratch(SDValue Addr, SDValue &Rsrc,    const SITargetLowering& Lowering =      *static_cast<const SITargetLowering*>(getTargetLowering()); -  unsigned ScratchPtrReg = -      TRI->getPreloadedValue(MF, SIRegisterInfo::SCRATCH_PTR);    unsigned ScratchOffsetReg =        TRI->getPreloadedValue(MF, SIRegisterInfo::SCRATCH_WAVE_OFFSET);    Lowering.CreateLiveInRegister(*CurDAG, &AMDGPU::SReg_32RegClass,                                  ScratchOffsetReg, MVT::i32); +  SDValue Sym0 = CurDAG->getExternalSymbol("SCRATCH_RSRC_DWORD0", MVT::i32); +  SDValue ScratchRsrcDword0 = +      SDValue(CurDAG->getMachineNode(AMDGPU::S_MOV_B32, DL, MVT::i32, Sym0), 0); -  SDValue ScratchPtr = -    CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, -                           MRI.getLiveInVirtReg(ScratchPtrReg), MVT::i64); +  SDValue Sym1 = CurDAG->getExternalSymbol("SCRATCH_RSRC_DWORD1", MVT::i32); +  SDValue ScratchRsrcDword1 = +      SDValue(CurDAG->getMachineNode(AMDGPU::S_MOV_B32, DL, MVT::i32, Sym1), 0); + +  const SDValue RsrcOps[] = { +      CurDAG->getTargetConstant(AMDGPU::SReg_64RegClassID, MVT::i32), +      ScratchRsrcDword0, +      CurDAG->getTargetConstant(AMDGPU::sub0, MVT::i32), +      ScratchRsrcDword1, +      CurDAG->getTargetConstant(AMDGPU::sub1, MVT::i32), +  }; +  SDValue ScratchPtr = SDValue(CurDAG->getMachineNode(AMDGPU::REG_SEQUENCE, DL, +                                              MVT::v2i32, RsrcOps), 0);    Rsrc = SDValue(Lowering.buildScratchRSRC(*CurDAG, DL, ScratchPtr), 0);    SOffset = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,        MRI.getLiveInVirtReg(ScratchOffsetReg), MVT::i32); @@ -988,22 +1021,6 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFScratch(SDValue Addr, SDValue &Rsrc,      }    } -  // (add FI, n0) -  if ((Addr.getOpcode() == ISD::ADD || Addr.getOpcode() == ISD::OR) && -       isa<FrameIndexSDNode>(Addr.getOperand(0))) { -    VAddr = Addr.getOperand(1); -    ImmOffset = Addr.getOperand(0); -    return true; -  } - -  // (FI) -  if (isa<FrameIndexSDNode>(Addr)) { -    VAddr = SDValue(CurDAG->getMachineNode(AMDGPU::V_MOV_B32_e32, DL, MVT::i32, -                                          CurDAG->getConstant(0, MVT::i32)), 0); -    ImmOffset = Addr; -    return true; -  } -    // (node)    VAddr = Addr;    ImmOffset = CurDAG->getTargetConstant(0, MVT::i16);  | 
