diff options
Diffstat (limited to 'lib/Target/ARM/ARMFrameLowering.cpp')
| -rw-r--r-- | lib/Target/ARM/ARMFrameLowering.cpp | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Target/ARM/ARMFrameLowering.cpp b/lib/Target/ARM/ARMFrameLowering.cpp index f42c6db84fd3..68c33f098ec9 100644 --- a/lib/Target/ARM/ARMFrameLowering.cpp +++ b/lib/Target/ARM/ARMFrameLowering.cpp @@ -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 prologue. +    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++;    }  | 
