diff options
author | Reed Kotler <rkotler@mips.com> | 2013-12-10 14:29:38 +0000 |
---|---|---|
committer | Reed Kotler <rkotler@mips.com> | 2013-12-10 14:29:38 +0000 |
commit | 0ff40017815297785c8b634ec03a47f12ca19f86 (patch) | |
tree | b8d77285ab0ebfcdd64f9df19f3d766272535fa4 /llvm/lib/Target/Mips/Mips16FrameLowering.cpp | |
parent | 0508125cd41e3d89bf419049ab547dc1df5be0db (diff) | |
download | llvm-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.cpp | 27 |
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) |