@@ -1538,14 +1538,11 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1538
1538
MachineBasicBlock::iterator MI,
1539
1539
ArrayRef<CalleeSavedInfo> CSI,
1540
1540
unsigned StmOpc, unsigned StrOpc,
1541
- bool NoGap, bool (*Func)(unsigned , bool ),
1542
- unsigned NumAlignedDPRCS2Regs,
1543
- unsigned MIFlags) const {
1541
+ bool NoGap,
1542
+ std::function<bool (unsigned )> Func) const {
1544
1543
MachineFunction &MF = *MBB.getParent ();
1545
1544
const TargetInstrInfo &TII = *MF.getSubtarget ().getInstrInfo ();
1546
1545
const TargetRegisterInfo &TRI = *STI.getRegisterInfo ();
1547
- ARMSubtarget::PushPopSplitVariation PushPopSplit =
1548
- STI.getPushPopSplitVariation (MF);
1549
1546
1550
1547
DebugLoc DL;
1551
1548
@@ -1557,11 +1554,7 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1557
1554
unsigned LastReg = 0 ;
1558
1555
for (; i != 0 ; --i) {
1559
1556
Register Reg = CSI[i-1 ].getReg ();
1560
- if (!(Func)(Reg, PushPopSplit == ARMSubtarget::SplitR7))
1561
- continue ;
1562
-
1563
- // D-registers in the aligned area DPRCS2 are NOT spilled here.
1564
- if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
1557
+ if (!Func (Reg))
1565
1558
continue ;
1566
1559
1567
1560
const MachineRegisterInfo &MRI = MF.getRegInfo ();
@@ -1592,15 +1585,15 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1592
1585
if (Regs.size () > 1 || StrOpc== 0 ) {
1593
1586
MachineInstrBuilder MIB = BuildMI (MBB, MI, DL, TII.get (StmOpc), ARM::SP)
1594
1587
.addReg (ARM::SP)
1595
- .setMIFlags (MIFlags )
1588
+ .setMIFlags (MachineInstr::FrameSetup )
1596
1589
.add (predOps (ARMCC::AL));
1597
1590
for (unsigned i = 0 , e = Regs.size (); i < e; ++i)
1598
1591
MIB.addReg (Regs[i].first , getKillRegState (Regs[i].second ));
1599
1592
} else if (Regs.size () == 1 ) {
1600
1593
BuildMI (MBB, MI, DL, TII.get (StrOpc), ARM::SP)
1601
1594
.addReg (Regs[0 ].first , getKillRegState (Regs[0 ].second ))
1602
1595
.addReg (ARM::SP)
1603
- .setMIFlags (MIFlags )
1596
+ .setMIFlags (MachineInstr::FrameSetup )
1604
1597
.addImm (-4 )
1605
1598
.add (predOps (ARMCC::AL));
1606
1599
}
@@ -1619,8 +1612,7 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,
1619
1612
MutableArrayRef<CalleeSavedInfo> CSI,
1620
1613
unsigned LdmOpc, unsigned LdrOpc,
1621
1614
bool isVarArg, bool NoGap,
1622
- bool (*Func)(unsigned , bool ),
1623
- unsigned NumAlignedDPRCS2Regs) const {
1615
+ std::function<bool (unsigned )> Func) const {
1624
1616
MachineFunction &MF = *MBB.getParent ();
1625
1617
const TargetInstrInfo &TII = *MF.getSubtarget ().getInstrInfo ();
1626
1618
const TargetRegisterInfo &TRI = *STI.getRegisterInfo ();
@@ -1655,12 +1647,9 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,
1655
1647
for (; i != 0 ; --i) {
1656
1648
CalleeSavedInfo &Info = CSI[i-1 ];
1657
1649
Register Reg = Info.getReg ();
1658
- if (!( Func) (Reg, PushPopSplit == ARMSubtarget::SplitR7 ))
1650
+ if (!Func (Reg))
1659
1651
continue ;
1660
1652
1661
- // The aligned reloads from area DPRCS2 are not inserted here.
1662
- if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
1663
- continue ;
1664
1653
if (Reg == ARM::LR && !isTailCall && !isVarArg && !isInterrupt &&
1665
1654
!isCmseEntry && !isTrap && AFI->getArgumentStackToRestore () == 0 &&
1666
1655
STI.hasV5TOps () && MBB.succ_empty () && !hasPAC &&
@@ -2006,6 +1995,7 @@ bool ARMFrameLowering::spillCalleeSavedRegisters(
2006
1995
ARMFunctionInfo *AFI = MF.getInfo <ARMFunctionInfo>();
2007
1996
ARMSubtarget::PushPopSplitVariation PushPopSplit =
2008
1997
STI.getPushPopSplitVariation (MF);
1998
+ const ARMBaseRegisterInfo *RegInfo = STI.getRegisterInfo ();
2009
1999
2010
2000
unsigned PushOpc = AFI->isThumbFunction () ? ARM::t2STMDB_UPD : ARM::STMDB_UPD;
2011
2001
unsigned PushOneOpc = AFI->isThumbFunction () ?
@@ -2027,20 +2017,33 @@ bool ARMFrameLowering::spillCalleeSavedRegisters(
2027
2017
.addImm (-4 )
2028
2018
.add (predOps (ARMCC::AL));
2029
2019
}
2020
+
2021
+ auto CheckRegArea = [PushPopSplit, NumAlignedDPRCS2Regs,
2022
+ RegInfo](unsigned Reg, SpillArea TestArea) {
2023
+ return getSpillArea (Reg, PushPopSplit, NumAlignedDPRCS2Regs, RegInfo) ==
2024
+ TestArea;
2025
+ };
2026
+ auto IsGPRCS1 = [&CheckRegArea](unsigned Reg) {
2027
+ return CheckRegArea (Reg, SpillArea::GPRCS1);
2028
+ };
2029
+ auto IsGPRCS2 = [&CheckRegArea](unsigned Reg) {
2030
+ return CheckRegArea (Reg, SpillArea::GPRCS2);
2031
+ };
2032
+ auto IsDPRCS1 = [&CheckRegArea](unsigned Reg) {
2033
+ return CheckRegArea (Reg, SpillArea::DPRCS1);
2034
+ };
2035
+
2036
+ // Windows SEH requires the floating-point registers to be pushed between the
2037
+ // two blocks of GPRs in some situations. In all other cases, they are pushed
2038
+ // below the GPRs.
2030
2039
if (PushPopSplit == ARMSubtarget::SplitR11WindowsSEH) {
2031
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false ,
2032
- &isSplitFPArea1Register, 0 , MachineInstr::FrameSetup);
2033
- emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , &isARMArea3Register,
2034
- NumAlignedDPRCS2Regs, MachineInstr::FrameSetup);
2035
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false ,
2036
- &isSplitFPArea2Register, 0 , MachineInstr::FrameSetup);
2040
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS1);
2041
+ emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , IsDPRCS1);
2042
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS2);
2037
2043
} else {
2038
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , &isARMArea1Register,
2039
- 0 , MachineInstr::FrameSetup);
2040
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , &isARMArea2Register,
2041
- 0 , MachineInstr::FrameSetup);
2042
- emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , &isARMArea3Register,
2043
- NumAlignedDPRCS2Regs, MachineInstr::FrameSetup);
2044
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS1);
2045
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS2);
2046
+ emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , IsDPRCS1);
2044
2047
}
2045
2048
2046
2049
// The code above does not insert spill code for the aligned DPRCS2 registers.
@@ -2060,6 +2063,8 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
2060
2063
2061
2064
MachineFunction &MF = *MBB.getParent ();
2062
2065
ARMFunctionInfo *AFI = MF.getInfo <ARMFunctionInfo>();
2066
+ const ARMBaseRegisterInfo *RegInfo = STI.getRegisterInfo ();
2067
+
2063
2068
bool isVarArg = AFI->getArgRegsSaveSize () > 0 ;
2064
2069
unsigned NumAlignedDPRCS2Regs = AFI->getNumAlignedDPRCS2Regs ();
2065
2070
ARMSubtarget::PushPopSplitVariation PushPopSplit =
@@ -2074,20 +2079,30 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
2074
2079
unsigned LdrOpc =
2075
2080
AFI->isThumbFunction () ? ARM::t2LDR_POST : ARM::LDR_POST_IMM;
2076
2081
unsigned FltOpc = ARM::VLDMDIA_UPD;
2082
+
2083
+ auto CheckRegArea = [PushPopSplit, NumAlignedDPRCS2Regs,
2084
+ RegInfo](unsigned Reg, SpillArea TestArea) {
2085
+ return getSpillArea (Reg, PushPopSplit, NumAlignedDPRCS2Regs, RegInfo) ==
2086
+ TestArea;
2087
+ };
2088
+ auto IsGPRCS1 = [&CheckRegArea](unsigned Reg) {
2089
+ return CheckRegArea (Reg, SpillArea::GPRCS1);
2090
+ };
2091
+ auto IsGPRCS2 = [&CheckRegArea](unsigned Reg) {
2092
+ return CheckRegArea (Reg, SpillArea::GPRCS2);
2093
+ };
2094
+ auto IsDPRCS1 = [&CheckRegArea](unsigned Reg) {
2095
+ return CheckRegArea (Reg, SpillArea::DPRCS1);
2096
+ };
2097
+
2077
2098
if (PushPopSplit == ARMSubtarget::SplitR11WindowsSEH) {
2078
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2079
- &isSplitFPArea2Register, 0 );
2080
- emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , &isARMArea3Register,
2081
- NumAlignedDPRCS2Regs);
2082
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2083
- &isSplitFPArea1Register, 0 );
2099
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS2);
2100
+ emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , IsDPRCS1);
2101
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS1);
2084
2102
} else {
2085
- emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , &isARMArea3Register,
2086
- NumAlignedDPRCS2Regs);
2087
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2088
- &isARMArea2Register, 0 );
2089
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2090
- &isARMArea1Register, 0 );
2103
+ emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , IsDPRCS1);
2104
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS2);
2105
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS1);
2091
2106
}
2092
2107
2093
2108
return true ;
0 commit comments