diff options
Diffstat (limited to 'llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp')
| -rw-r--r-- | llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp | 67 | 
1 files changed, 44 insertions, 23 deletions
| diff --git a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp index b81f277d55f..49a5e864d3e 100644 --- a/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp +++ b/llvm/lib/Target/CellSPU/SPUISelDAGToDAG.cpp @@ -17,6 +17,7 @@  #include "SPUISelLowering.h"  #include "SPUHazardRecognizers.h"  #include "SPUFrameInfo.h" +#include "SPURegisterNames.h"  #include "llvm/CodeGen/MachineConstantPool.h"  #include "llvm/CodeGen/MachineInstrBuilder.h"  #include "llvm/CodeGen/MachineFunction.h" @@ -411,7 +412,10 @@ SPUDAGToDAGISel::SelectAFormAddr(SDOperand Op, SDOperand N, SDOperand &Base,  bool   SPUDAGToDAGISel::SelectDForm2Addr(SDOperand Op, SDOperand N, SDOperand &Disp,                                    SDOperand &Base) { -  return DFormAddressPredicate(Op, N, Disp, Base, -(1 << 7), (1 << 7) - 1); +  const int minDForm2Offset = -(1 << 7); +  const int maxDForm2Offset = (1 << 7) - 1; +  return DFormAddressPredicate(Op, N, Disp, Base, minDForm2Offset, +                               maxDForm2Offset);  }  /*! @@ -443,12 +447,13 @@ SPUDAGToDAGISel::DFormAddressPredicate(SDOperand Op, SDOperand N, SDOperand &Bas    if (Opc == ISD::FrameIndex) {      // Stack frame index must be less than 512 (divided by 16): -    FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N); +    FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N); +    int FI = int(FIN->getIndex());      DEBUG(cerr << "SelectDFormAddr: ISD::FrameIndex = " -          << FI->getIndex() << "\n"); -    if (FI->getIndex() < maxOffset) { +               << FI << "\n"); +    if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {        Base = CurDAG->getTargetConstant(0, PtrTy); -      Index = CurDAG->getTargetFrameIndex(FI->getIndex(), PtrTy); +      Index = CurDAG->getTargetFrameIndex(FI, PtrTy);        return true;      }    } else if (Opc == ISD::ADD) { @@ -467,13 +472,14 @@ SPUDAGToDAGISel::DFormAddressPredicate(SDOperand Op, SDOperand N, SDOperand &Bas        int32_t offset = int32_t(CN->getSignExtended());        if (Op0.getOpcode() == ISD::FrameIndex) { -        FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Op0); +        FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Op0); +        int FI = int(FIN->getIndex());          DEBUG(cerr << "SelectDFormAddr: ISD::ADD offset = " << offset -              << " frame index = " << FI->getIndex() << "\n"); +                   << " frame index = " << FI << "\n"); -        if (FI->getIndex() < maxOffset) { +        if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {            Base = CurDAG->getTargetConstant(offset, PtrTy); -          Index = CurDAG->getTargetFrameIndex(FI->getIndex(), PtrTy); +          Index = CurDAG->getTargetFrameIndex(FI, PtrTy);            return true;          }        } else if (offset > minOffset && offset < maxOffset) { @@ -487,13 +493,14 @@ SPUDAGToDAGISel::DFormAddressPredicate(SDOperand Op, SDOperand N, SDOperand &Bas        int32_t offset = int32_t(CN->getSignExtended());        if (Op1.getOpcode() == ISD::FrameIndex) { -        FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Op1); +        FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Op1); +        int FI = int(FIN->getIndex());          DEBUG(cerr << "SelectDFormAddr: ISD::ADD offset = " << offset -              << " frame index = " << FI->getIndex() << "\n"); +                   << " frame index = " << FI << "\n"); -        if (FI->getIndex() < maxOffset) { +        if (SPUFrameInfo::FItoStackOffset(FI) < maxOffset) {            Base = CurDAG->getTargetConstant(offset, PtrTy); -          Index = CurDAG->getTargetFrameIndex(FI->getIndex(), PtrTy); +          Index = CurDAG->getTargetFrameIndex(FI, PtrTy);            return true;          }        } else if (offset > minOffset && offset < maxOffset) { @@ -583,17 +590,31 @@ SPUDAGToDAGISel::Select(SDOperand Op) {    if (Opc >= ISD::BUILTIN_OP_END && Opc < SPUISD::FIRST_NUMBER) {      return NULL;   // Already selected.    } else if (Opc == ISD::FrameIndex) { -    // Selects to AIr32 FI, 0 which in turn will become AIr32 SP, imm. -    int FI = cast<FrameIndexSDNode>(N)->getIndex(); +    // Selects to (add $sp, FI * stackSlotSize) +    int FI = +      SPUFrameInfo::FItoStackOffset(cast<FrameIndexSDNode>(N)->getIndex());      MVT::ValueType PtrVT = SPUtli.getPointerTy(); -    SDOperand Zero = CurDAG->getTargetConstant(0, PtrVT); -    SDOperand TFI = CurDAG->getTargetFrameIndex(FI, PtrVT); - -    DEBUG(cerr << "SPUDAGToDAGISel: Replacing FrameIndex with AI32 <FI>, 0\n"); -    NewOpc = SPU::AIr32; -    Ops[0] = TFI; -    Ops[1] = Zero; -    n_ops = 2; + +    // Adjust stack slot to actual offset in frame: +    if (isS10Constant(FI)) { +      DEBUG(cerr << "SPUDAGToDAGISel: Replacing FrameIndex with AIr32 $sp, " +                 << FI +                 << "\n"); +      NewOpc = SPU::AIr32; +      Ops[0] = CurDAG->getRegister(SPU::R1, PtrVT); +      Ops[1] = CurDAG->getTargetConstant(FI, PtrVT); +      n_ops = 2; +    } else { +      DEBUG(cerr << "SPUDAGToDAGISel: Replacing FrameIndex with Ar32 $sp, " +                 << FI +                 << "\n"); +      NewOpc = SPU::Ar32; +      Ops[0] = CurDAG->getRegister(SPU::R1, PtrVT); +      Ops[1] = CurDAG->getConstant(FI, PtrVT); +      n_ops = 2; + +      AddToISelQueue(Ops[1]); +    }    } else if (Opc == ISD::ZERO_EXTEND) {      // (zero_extend:i16 (and:i8 <arg>, <const>))      const SDOperand &Op1 = N->getOperand(0); | 

