mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-01 00:25:01 +00:00
Add code for save/restore of callee-saved registers
llvm-svn: 70739
This commit is contained in:
parent
6a63537ff0
commit
10d199fa80
@ -13,6 +13,7 @@
|
||||
|
||||
#include "MSP430.h"
|
||||
#include "MSP430InstrInfo.h"
|
||||
#include "MSP430MachineFunctionInfo.h"
|
||||
#include "MSP430TargetMachine.h"
|
||||
#include "MSP430GenInstrInfo.inc"
|
||||
#include "llvm/Function.h"
|
||||
@ -108,3 +109,43 @@ MSP430InstrInfo::isMoveInstr(const MachineInstr& MI,
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
MSP430InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||
if (CSI.empty())
|
||||
return false;
|
||||
|
||||
DebugLoc DL = DebugLoc::getUnknownLoc();
|
||||
if (MI != MBB.end()) DL = MI->getDebugLoc();
|
||||
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
MSP430MachineFunctionInfo *MFI = MF.getInfo<MSP430MachineFunctionInfo>();
|
||||
MFI->setCalleeSavedFrameSize(CSI.size() * 2);
|
||||
|
||||
for (unsigned i = CSI.size(); i != 0; --i) {
|
||||
unsigned Reg = CSI[i-1].getReg();
|
||||
// Add the callee-saved register as live-in. It's killed at the spill.
|
||||
MBB.addLiveIn(Reg);
|
||||
BuildMI(MBB, MI, DL, get(MSP430::PUSH16r))
|
||||
.addReg(Reg, /*isDef=*/false, /*isImp=*/false, /*isKill=*/true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
MSP430InstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
const std::vector<CalleeSavedInfo> &CSI) const {
|
||||
if (CSI.empty())
|
||||
return false;
|
||||
|
||||
DebugLoc DL = DebugLoc::getUnknownLoc();
|
||||
if (MI != MBB.end()) DL = MI->getDebugLoc();
|
||||
|
||||
for (unsigned i = 0, e = CSI.size(); i != e; ++i)
|
||||
BuildMI(MBB, MI, DL, get(MSP430::POP16r), CSI[i].getReg());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -44,12 +44,21 @@ public:
|
||||
|
||||
virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned SrcReg, bool isKill, int FrameIndex,
|
||||
unsigned SrcReg, bool isKill,
|
||||
int FrameIndex,
|
||||
const TargetRegisterClass *RC) const;
|
||||
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, int FrameIdx,
|
||||
const TargetRegisterClass *RC) const;
|
||||
|
||||
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -116,6 +116,17 @@ let isCall = 1 in
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Miscellaneous Instructions...
|
||||
//
|
||||
let Defs = [SPW], Uses = [SPW], neverHasSideEffects=1 in {
|
||||
let mayLoad = 1 in
|
||||
def POP16r : Pseudo<(outs GR16:$reg), (ins), "pop.w\t$reg", []>;
|
||||
|
||||
let mayStore = 1 in
|
||||
def PUSH16r : Pseudo<(outs), (ins GR16:$reg), "push.w\t$reg",[]>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Move Instructions
|
||||
|
||||
|
39
lib/Target/MSP430/MSP430MachineFunctionInfo.h
Normal file
39
lib/Target/MSP430/MSP430MachineFunctionInfo.h
Normal file
@ -0,0 +1,39 @@
|
||||
//===- MSP430MachineFuctionInfo.h - MSP430 machine function info -*- C++ -*-==//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares MSP430-specific per-machine-function information.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef MSP430MACHINEFUNCTIONINFO_H
|
||||
#define MSP430MACHINEFUNCTIONINFO_H
|
||||
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// MSP430MachineFunctionInfo - This class is derived from MachineFunction and
|
||||
/// contains private MSP430 target-specific information for each MachineFunction.
|
||||
class MSP430MachineFunctionInfo : public MachineFunctionInfo {
|
||||
/// CalleeSavedFrameSize - Size of the callee-saved register portion of the
|
||||
/// stack frame in bytes.
|
||||
unsigned CalleeSavedFrameSize;
|
||||
|
||||
public:
|
||||
MSP430MachineFunctionInfo() : CalleeSavedFrameSize(0) {}
|
||||
|
||||
MSP430MachineFunctionInfo(MachineFunction &MF) : CalleeSavedFrameSize(0) {}
|
||||
|
||||
unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; }
|
||||
void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user