diff options
author | Akira Hatanaka <ahatanaka@mips.com> | 2012-07-31 23:52:55 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@mips.com> | 2012-07-31 23:52:55 +0000 |
commit | 71746220d3d1c3e8efba35038ac2ff14b4a4d3ae (patch) | |
tree | 81731141188a20b620b74a7e1fb6dc16c86f0859 /lib/Target/Mips/MipsSERegisterInfo.cpp | |
parent | 8589010e3d1d5a902992a5039cffa9d4116982c5 (diff) | |
download | llvm-71746220d3d1c3e8efba35038ac2ff14b4a4d3ae.tar.gz llvm-71746220d3d1c3e8efba35038ac2ff14b4a4d3ae.tar.bz2 llvm-71746220d3d1c3e8efba35038ac2ff14b4a4d3ae.tar.xz |
Implement MipsSERegisterInfo::eliminateCallFramePseudoInstr. The function emits
instructions that decrement and increment the stack pointer before and after a
call when the function does not have a reserved call frame.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161093 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips/MipsSERegisterInfo.cpp')
-rw-r--r-- | lib/Target/Mips/MipsSERegisterInfo.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/lib/Target/Mips/MipsSERegisterInfo.cpp b/lib/Target/Mips/MipsSERegisterInfo.cpp index 0165a6109c..5fa04ac1bf 100644 --- a/lib/Target/Mips/MipsSERegisterInfo.cpp +++ b/lib/Target/Mips/MipsSERegisterInfo.cpp @@ -15,7 +15,7 @@ #include "MipsSERegisterInfo.h" #include "Mips.h" #include "MipsAnalyzeImmediate.h" -#include "MipsInstrInfo.h" +#include "MipsSEInstrInfo.h" #include "MipsSubtarget.h" #include "MipsMachineFunction.h" #include "llvm/Constants.h" @@ -43,6 +43,29 @@ MipsSERegisterInfo::MipsSERegisterInfo(const MipsSubtarget &ST, const TargetInstrInfo &TII) : MipsRegisterInfo(ST, TII) {} +// This function eliminate ADJCALLSTACKDOWN, +// ADJCALLSTACKUP pseudo instructions +void MipsSERegisterInfo:: +eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, + MachineBasicBlock::iterator I) const { + const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering(); + + if (!TFI->hasReservedCallFrame(MF)) { + DebugLoc DL = I->getDebugLoc(); + int64_t Amount = I->getOperand(0).getImm(); + + if (I->getOpcode() == Mips::ADJCALLSTACKDOWN) + Amount = -Amount; + + const MipsSEInstrInfo *II = static_cast<const MipsSEInstrInfo*>(&TII); + unsigned SP = Subtarget.isABI_N64() ? Mips::SP_64 : Mips::SP; + + II->adjustStackPtr(SP, Amount, MBB, I); + } + + MBB.erase(I); +} + void MipsSERegisterInfo::eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo, int FrameIndex, uint64_t StackSize, |