mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 16:37:42 +00:00
[AArch64] Refactor out codes that depend on specific CS save sequence.
No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236143 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4a43cd24af
commit
38f2883ff9
@ -250,6 +250,31 @@ void AArch64FrameLowering::emitCalleeSavedFrameMoves(
|
||||
}
|
||||
}
|
||||
|
||||
/// Get FPOffset by analyzing the first instruction.
|
||||
static int getFPOffsetInPrologue(MachineInstr *MBBI) {
|
||||
// First instruction must a) allocate the stack and b) have an immediate
|
||||
// that is a multiple of -2.
|
||||
assert(((MBBI->getOpcode() == AArch64::STPXpre ||
|
||||
MBBI->getOpcode() == AArch64::STPDpre) &&
|
||||
MBBI->getOperand(3).getReg() == AArch64::SP &&
|
||||
MBBI->getOperand(4).getImm() < 0 &&
|
||||
(MBBI->getOperand(4).getImm() & 1) == 0));
|
||||
|
||||
// Frame pointer is fp = sp - 16. Since the STPXpre subtracts the space
|
||||
// required for the callee saved register area we get the frame pointer
|
||||
// by addding that offset - 16 = -getImm()*8 - 2*8 = -(getImm() + 2) * 8.
|
||||
int FPOffset = -(MBBI->getOperand(4).getImm() + 2) * 8;
|
||||
assert(FPOffset >= 0 && "Bad Framepointer Offset");
|
||||
return FPOffset;
|
||||
}
|
||||
|
||||
static bool isCSSave(MachineInstr *MBBI) {
|
||||
return MBBI->getOpcode() == AArch64::STPXi ||
|
||||
MBBI->getOpcode() == AArch64::STPDi ||
|
||||
MBBI->getOpcode() == AArch64::STPXpre ||
|
||||
MBBI->getOpcode() == AArch64::STPDpre;
|
||||
}
|
||||
|
||||
void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
MachineBasicBlock &MBB = MF.front(); // Prologue goes in entry BB.
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
@ -300,27 +325,11 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
|
||||
// Only set up FP if we actually need to.
|
||||
int FPOffset = 0;
|
||||
if (HasFP) {
|
||||
// First instruction must a) allocate the stack and b) have an immediate
|
||||
// that is a multiple of -2.
|
||||
assert((MBBI->getOpcode() == AArch64::STPXpre ||
|
||||
MBBI->getOpcode() == AArch64::STPDpre) &&
|
||||
MBBI->getOperand(3).getReg() == AArch64::SP &&
|
||||
MBBI->getOperand(4).getImm() < 0 &&
|
||||
(MBBI->getOperand(4).getImm() & 1) == 0);
|
||||
|
||||
// Frame pointer is fp = sp - 16. Since the STPXpre subtracts the space
|
||||
// required for the callee saved register area we get the frame pointer
|
||||
// by addding that offset - 16 = -getImm()*8 - 2*8 = -(getImm() + 2) * 8.
|
||||
FPOffset = -(MBBI->getOperand(4).getImm() + 2) * 8;
|
||||
assert(FPOffset >= 0 && "Bad Framepointer Offset");
|
||||
}
|
||||
if (HasFP)
|
||||
FPOffset = getFPOffsetInPrologue(MBBI);
|
||||
|
||||
// Move past the saves of the callee-saved registers.
|
||||
while (MBBI->getOpcode() == AArch64::STPXi ||
|
||||
MBBI->getOpcode() == AArch64::STPDi ||
|
||||
MBBI->getOpcode() == AArch64::STPXpre ||
|
||||
MBBI->getOpcode() == AArch64::STPDpre) {
|
||||
while (isCSSave(MBBI)) {
|
||||
++MBBI;
|
||||
NumBytes -= 16;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user