mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
Provide proper stack offsets for outgoing arguments
llvm-svn: 75945
This commit is contained in:
parent
4906b76843
commit
57bf9a3426
@ -38,6 +38,8 @@ using namespace llvm;
|
||||
SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm) :
|
||||
TargetLowering(tm), Subtarget(*tm.getSubtargetImpl()), TM(tm) {
|
||||
|
||||
RegInfo = TM.getRegisterInfo();
|
||||
|
||||
// Set up the register classes.
|
||||
addRegisterClass(MVT::i32, SystemZ::GR32RegisterClass);
|
||||
addRegisterClass(MVT::i64, SystemZ::GR64RegisterClass);
|
||||
@ -190,6 +192,7 @@ SDValue SystemZTargetLowering::LowerCCCCallTo(SDValue Op, SelectionDAG &DAG,
|
||||
SDValue Callee = TheCall->getCallee();
|
||||
bool isVarArg = TheCall->isVarArg();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
|
||||
// Analyze operands of the call, assigning locations to each operand.
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
@ -237,12 +240,16 @@ SDValue SystemZTargetLowering::LowerCCCCallTo(SDValue Op, SelectionDAG &DAG,
|
||||
assert(VA.isMemLoc());
|
||||
|
||||
if (StackPtr.getNode() == 0)
|
||||
StackPtr = DAG.getCopyFromReg(Chain, dl, SystemZ::R15D, getPointerTy());
|
||||
|
||||
SDValue PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
StackPtr,
|
||||
DAG.getIntPtrConstant(VA.getLocMemOffset()));
|
||||
StackPtr =
|
||||
DAG.getCopyFromReg(Chain, dl,
|
||||
(RegInfo->hasFP(MF) ?
|
||||
SystemZ::R11D : SystemZ::R15D),
|
||||
getPointerTy());
|
||||
|
||||
SDValue PtrOff =
|
||||
DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
StackPtr,
|
||||
DAG.getIntPtrConstant(160+VA.getLocMemOffset()));
|
||||
|
||||
MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff,
|
||||
PseudoSourceValue::getStack(),
|
||||
|
@ -16,6 +16,7 @@
|
||||
#define LLVM_TARGET_SystemZ_ISELLOWERING_H
|
||||
|
||||
#include "SystemZ.h"
|
||||
#include "SystemZRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
|
||||
@ -61,6 +62,7 @@ namespace llvm {
|
||||
private:
|
||||
const SystemZSubtarget &Subtarget;
|
||||
const SystemZTargetMachine &TM;
|
||||
const SystemZRegisterInfo *RegInfo;
|
||||
};
|
||||
} // namespace llvm
|
||||
|
||||
|
@ -33,7 +33,7 @@ public:
|
||||
/// such, whenever a client has an instance of instruction info, it should
|
||||
/// always be able to get register info as well (through this method).
|
||||
///
|
||||
virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
|
||||
virtual const SystemZRegisterInfo &getRegisterInfo() const { return RI; }
|
||||
|
||||
bool copyRegToReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
virtual const TargetData *getTargetData() const { return &DataLayout;}
|
||||
virtual const SystemZSubtarget *getSubtargetImpl() const { return &Subtarget; }
|
||||
|
||||
virtual const TargetRegisterInfo *getRegisterInfo() const {
|
||||
virtual const SystemZRegisterInfo *getRegisterInfo() const {
|
||||
return &InstrInfo.getRegisterInfo();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user