aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
diff options
context:
space:
mode:
authorReed Kotler <rkotler@mips.com>2013-12-10 14:29:38 +0000
committerReed Kotler <rkotler@mips.com>2013-12-10 14:29:38 +0000
commit0ff40017815297785c8b634ec03a47f12ca19f86 (patch)
treeb8d77285ab0ebfcdd64f9df19f3d766272535fa4 /llvm/lib/Target/Mips/Mips16FrameLowering.cpp
parent0508125cd41e3d89bf419049ab547dc1df5be0db (diff)
downloadllvm-0ff40017815297785c8b634ec03a47f12ca19f86.zip
llvm-0ff40017815297785c8b634ec03a47f12ca19f86.tar.gz
llvm-0ff40017815297785c8b634ec03a47f12ca19f86.tar.bz2
Next step in Mips16 prologue/epilogue cleanup.
Save S2(reg 18) only when we are calling floating point stubs that have a return value of float or complex. Some more work to make this better but this is the first step. llvm-svn: 196921
Diffstat (limited to 'llvm/lib/Target/Mips/Mips16FrameLowering.cpp')
-rw-r--r--llvm/lib/Target/Mips/Mips16FrameLowering.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/llvm/lib/Target/Mips/Mips16FrameLowering.cpp b/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
index 6655ff9..ae6be05 100644
--- a/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
+++ b/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
@@ -15,6 +15,7 @@
#include "MCTargetDesc/MipsBaseInfo.h"
#include "Mips16InstrInfo.h"
#include "MipsInstrInfo.h"
+#include "MipsRegisterInfo.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
@@ -56,17 +57,31 @@ void Mips16FrameLowering::emitPrologue(MachineFunction &MF) const {
MCSymbol *CSLabel = MMI.getContext().CreateTempSymbol();
BuildMI(MBB, MBBI, dl,
TII.get(TargetOpcode::PROLOG_LABEL)).addSym(CSLabel);
- unsigned S2 = MRI->getDwarfRegNum(Mips::S2, true);
- MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S2, -8));
+
+
+ const MipsRegisterInfo &RI = TII.getRegisterInfo();
+ const BitVector Reserved = RI.getReservedRegs(MF);
+ bool SaveS2 = Reserved[Mips::S2];
+ int Offset=-4;
+ unsigned RA = MRI->getDwarfRegNum(Mips::RA, true);
+ MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, RA, Offset));
+ Offset -= 4;
+
+ if (SaveS2) {
+ unsigned S2 = MRI->getDwarfRegNum(Mips::S2, true);
+ MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S2, Offset));
+ Offset -= 4;
+ }
+
unsigned S1 = MRI->getDwarfRegNum(Mips::S1, true);
- MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S1, -12));
+ MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S1, Offset));
+ Offset -= 4;
unsigned S0 = MRI->getDwarfRegNum(Mips::S0, true);
- MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S0, -16));
+ MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, S0, Offset));
+
- unsigned RA = MRI->getDwarfRegNum(Mips::RA, true);
- MMI.addFrameInst(MCCFIInstruction::createOffset(CSLabel, RA, -4));
if (hasFP(MF))
BuildMI(MBB, MBBI, dl, TII.get(Mips::MoveR3216), Mips::S0)