mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-10 02:36:06 +00:00
Each prologue may have multiple vpush instructions to store callee-saved
D registers since the vpush list may not have gaps. Make sure the stack adjustment instruction isn't moved between them. Ditto for vpop in epilogues. Sorry, can't reduce a small test case. rdar://9043312 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126457 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ae59e3444
commit
acca09bd64
@ -215,7 +215,13 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
|
||||
|
||||
// Move past area 3.
|
||||
if (DPRCSSize > 0) MBBI++;
|
||||
if (DPRCSSize > 0) {
|
||||
MBBI++;
|
||||
// Since vpush register list cannot have gaps, there may be multiple vpush
|
||||
// instructions in the epilogue.
|
||||
while (MBBI->getOpcode() == ARM::VSTMDDB_UPD)
|
||||
MBBI++;
|
||||
}
|
||||
|
||||
NumBytes = DPRCSOffset;
|
||||
if (NumBytes) {
|
||||
@ -370,7 +376,13 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,
|
||||
emitSPUpdate(isARM, MBB, MBBI, dl, TII, NumBytes);
|
||||
|
||||
// Increment past our save areas.
|
||||
if (AFI->getDPRCalleeSavedAreaSize()) MBBI++;
|
||||
if (AFI->getDPRCalleeSavedAreaSize()) {
|
||||
MBBI++;
|
||||
// Since vpop register list cannot have gaps, there may be multiple vpop
|
||||
// instructions in the epilogue.
|
||||
while (MBBI->getOpcode() == ARM::VLDMDIA_UPD)
|
||||
MBBI++;
|
||||
}
|
||||
if (AFI->getGPRCalleeSavedArea2Size()) MBBI++;
|
||||
if (AFI->getGPRCalleeSavedArea1Size()) MBBI++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user