diff options
Diffstat (limited to 'llvm/lib/Target/Mips')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.h | 4 | 
2 files changed, 22 insertions, 0 deletions
| diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 4479c48a915..77f1bac8776 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -2676,6 +2676,24 @@ IsEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, bool IsVarArg,    return MipsCCInfo.reservedArgArea() == NextStackOffset;  } +SDValue +MipsTargetLowering::passArgOnStack(SDValue StackPtr, unsigned Offset, +                                   SDValue Chain, SDValue Arg, DebugLoc DL, +                                   bool IsTailCall, SelectionDAG &DAG) const { +  if (!IsTailCall) { +    SDValue PtrOff = DAG.getNode(ISD::ADD, DL, getPointerTy(), StackPtr, +                                 DAG.getIntPtrConstant(Offset)); +    return DAG.getStore(Chain, DL, Arg, PtrOff, MachinePointerInfo(), false, +                        false, 0); +  } + +  MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); +  int FI = MFI->CreateFixedObject(Arg.getValueSizeInBits() / 8, Offset, false); +  SDValue FIN = DAG.getFrameIndex(FI, getPointerTy()); +  return DAG.getStore(Chain, DL, Arg, FIN, MachinePointerInfo(), +                      /*isVolatile=*/ true, false, 0); +} +  /// LowerCall - functions arguments are copied from virtual regs to  /// (physical regs)/(stack frame), CALLSEQ_START and CALLSEQ_END are emitted.  SDValue diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h index 9e8c659829f..4f1ce0cd1c6 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.h +++ b/llvm/lib/Target/Mips/MipsISelLowering.h @@ -309,6 +309,10 @@ namespace llvm {                             DebugLoc dl, SelectionDAG &DAG,                             SmallVectorImpl<SDValue> &InVals) const; +    SDValue passArgOnStack(SDValue StackPtr, unsigned Offset, SDValue Chain, +                           SDValue Arg, DebugLoc DL, bool IsTailCall, +                           SelectionDAG &DAG) const; +      virtual SDValue        LowerCall(TargetLowering::CallLoweringInfo &CLI,                  SmallVectorImpl<SDValue> &InVals) const; | 

