@@ -1571,14 +1571,11 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1571
1571
MachineBasicBlock::iterator MI,
1572
1572
ArrayRef<CalleeSavedInfo> CSI,
1573
1573
unsigned StmOpc, unsigned StrOpc,
1574
- bool NoGap, bool (*Func)(unsigned , bool ),
1575
- unsigned NumAlignedDPRCS2Regs,
1576
- unsigned MIFlags) const {
1574
+ bool NoGap,
1575
+ function_ref<bool (unsigned )> Func) const {
1577
1576
MachineFunction &MF = *MBB.getParent ();
1578
1577
const TargetInstrInfo &TII = *MF.getSubtarget ().getInstrInfo ();
1579
1578
const TargetRegisterInfo &TRI = *STI.getRegisterInfo ();
1580
- ARMSubtarget::PushPopSplitVariation PushPopSplit =
1581
- STI.getPushPopSplitVariation (MF);
1582
1579
1583
1580
DebugLoc DL;
1584
1581
@@ -1590,11 +1587,7 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1590
1587
unsigned LastReg = 0 ;
1591
1588
for (; i != 0 ; --i) {
1592
1589
Register Reg = CSI[i-1 ].getReg ();
1593
- if (!(Func)(Reg, PushPopSplit == ARMSubtarget::SplitR7))
1594
- continue ;
1595
-
1596
- // D-registers in the aligned area DPRCS2 are NOT spilled here.
1597
- if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
1590
+ if (!Func (Reg))
1598
1591
continue ;
1599
1592
1600
1593
const MachineRegisterInfo &MRI = MF.getRegInfo ();
@@ -1625,15 +1618,15 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
1625
1618
if (Regs.size () > 1 || StrOpc== 0 ) {
1626
1619
MachineInstrBuilder MIB = BuildMI (MBB, MI, DL, TII.get (StmOpc), ARM::SP)
1627
1620
.addReg (ARM::SP)
1628
- .setMIFlags (MIFlags )
1621
+ .setMIFlags (MachineInstr::FrameSetup )
1629
1622
.add (predOps (ARMCC::AL));
1630
1623
for (unsigned i = 0 , e = Regs.size (); i < e; ++i)
1631
1624
MIB.addReg (Regs[i].first , getKillRegState (Regs[i].second ));
1632
1625
} else if (Regs.size () == 1 ) {
1633
1626
BuildMI (MBB, MI, DL, TII.get (StrOpc), ARM::SP)
1634
1627
.addReg (Regs[0 ].first , getKillRegState (Regs[0 ].second ))
1635
1628
.addReg (ARM::SP)
1636
- .setMIFlags (MIFlags )
1629
+ .setMIFlags (MachineInstr::FrameSetup )
1637
1630
.addImm (-4 )
1638
1631
.add (predOps (ARMCC::AL));
1639
1632
}
@@ -1652,8 +1645,7 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,
1652
1645
MutableArrayRef<CalleeSavedInfo> CSI,
1653
1646
unsigned LdmOpc, unsigned LdrOpc,
1654
1647
bool isVarArg, bool NoGap,
1655
- bool (*Func)(unsigned , bool ),
1656
- unsigned NumAlignedDPRCS2Regs) const {
1648
+ function_ref<bool (unsigned )> Func) const {
1657
1649
MachineFunction &MF = *MBB.getParent ();
1658
1650
const TargetInstrInfo &TII = *MF.getSubtarget ().getInstrInfo ();
1659
1651
const TargetRegisterInfo &TRI = *STI.getRegisterInfo ();
@@ -1688,12 +1680,9 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,
1688
1680
for (; i != 0 ; --i) {
1689
1681
CalleeSavedInfo &Info = CSI[i-1 ];
1690
1682
Register Reg = Info.getReg ();
1691
- if (!( Func) (Reg, PushPopSplit == ARMSubtarget::SplitR7 ))
1683
+ if (!Func (Reg))
1692
1684
continue ;
1693
1685
1694
- // The aligned reloads from area DPRCS2 are not inserted here.
1695
- if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
1696
- continue ;
1697
1686
if (Reg == ARM::LR && !isTailCall && !isVarArg && !isInterrupt &&
1698
1687
!isCmseEntry && !isTrap && AFI->getArgumentStackToRestore () == 0 &&
1699
1688
STI.hasV5TOps () && MBB.succ_empty () && !hasPAC &&
@@ -2039,6 +2028,7 @@ bool ARMFrameLowering::spillCalleeSavedRegisters(
2039
2028
ARMFunctionInfo *AFI = MF.getInfo <ARMFunctionInfo>();
2040
2029
ARMSubtarget::PushPopSplitVariation PushPopSplit =
2041
2030
STI.getPushPopSplitVariation (MF);
2031
+ const ARMBaseRegisterInfo *RegInfo = STI.getRegisterInfo ();
2042
2032
2043
2033
unsigned PushOpc = AFI->isThumbFunction () ? ARM::t2STMDB_UPD : ARM::STMDB_UPD;
2044
2034
unsigned PushOneOpc = AFI->isThumbFunction () ?
@@ -2060,20 +2050,33 @@ bool ARMFrameLowering::spillCalleeSavedRegisters(
2060
2050
.addImm (-4 )
2061
2051
.add (predOps (ARMCC::AL));
2062
2052
}
2053
+
2054
+ auto CheckRegArea = [PushPopSplit, NumAlignedDPRCS2Regs,
2055
+ RegInfo](unsigned Reg, SpillArea TestArea) {
2056
+ return getSpillArea (Reg, PushPopSplit, NumAlignedDPRCS2Regs, RegInfo) ==
2057
+ TestArea;
2058
+ };
2059
+ auto IsGPRCS1 = [&CheckRegArea](unsigned Reg) {
2060
+ return CheckRegArea (Reg, SpillArea::GPRCS1);
2061
+ };
2062
+ auto IsGPRCS2 = [&CheckRegArea](unsigned Reg) {
2063
+ return CheckRegArea (Reg, SpillArea::GPRCS2);
2064
+ };
2065
+ auto IsDPRCS1 = [&CheckRegArea](unsigned Reg) {
2066
+ return CheckRegArea (Reg, SpillArea::DPRCS1);
2067
+ };
2068
+
2069
+ // Windows SEH requires the floating-point registers to be pushed between the
2070
+ // two blocks of GPRs in some situations. In all other cases, they are pushed
2071
+ // below the GPRs.
2063
2072
if (PushPopSplit == ARMSubtarget::SplitR11WindowsSEH) {
2064
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false ,
2065
- &isSplitFPArea1Register, 0 , MachineInstr::FrameSetup);
2066
- emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , &isARMArea3Register,
2067
- NumAlignedDPRCS2Regs, MachineInstr::FrameSetup);
2068
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false ,
2069
- &isSplitFPArea2Register, 0 , MachineInstr::FrameSetup);
2073
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS1);
2074
+ emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , IsDPRCS1);
2075
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS2);
2070
2076
} else {
2071
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , &isARMArea1Register,
2072
- 0 , MachineInstr::FrameSetup);
2073
- emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , &isARMArea2Register,
2074
- 0 , MachineInstr::FrameSetup);
2075
- emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , &isARMArea3Register,
2076
- NumAlignedDPRCS2Regs, MachineInstr::FrameSetup);
2077
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS1);
2078
+ emitPushInst (MBB, MI, CSI, PushOpc, PushOneOpc, false , IsGPRCS2);
2079
+ emitPushInst (MBB, MI, CSI, FltOpc, 0 , true , IsDPRCS1);
2077
2080
}
2078
2081
2079
2082
// The code above does not insert spill code for the aligned DPRCS2 registers.
@@ -2093,6 +2096,8 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
2093
2096
2094
2097
MachineFunction &MF = *MBB.getParent ();
2095
2098
ARMFunctionInfo *AFI = MF.getInfo <ARMFunctionInfo>();
2099
+ const ARMBaseRegisterInfo *RegInfo = STI.getRegisterInfo ();
2100
+
2096
2101
bool isVarArg = AFI->getArgRegsSaveSize () > 0 ;
2097
2102
unsigned NumAlignedDPRCS2Regs = AFI->getNumAlignedDPRCS2Regs ();
2098
2103
ARMSubtarget::PushPopSplitVariation PushPopSplit =
@@ -2107,20 +2112,30 @@ bool ARMFrameLowering::restoreCalleeSavedRegisters(
2107
2112
unsigned LdrOpc =
2108
2113
AFI->isThumbFunction () ? ARM::t2LDR_POST : ARM::LDR_POST_IMM;
2109
2114
unsigned FltOpc = ARM::VLDMDIA_UPD;
2115
+
2116
+ auto CheckRegArea = [PushPopSplit, NumAlignedDPRCS2Regs,
2117
+ RegInfo](unsigned Reg, SpillArea TestArea) {
2118
+ return getSpillArea (Reg, PushPopSplit, NumAlignedDPRCS2Regs, RegInfo) ==
2119
+ TestArea;
2120
+ };
2121
+ auto IsGPRCS1 = [&CheckRegArea](unsigned Reg) {
2122
+ return CheckRegArea (Reg, SpillArea::GPRCS1);
2123
+ };
2124
+ auto IsGPRCS2 = [&CheckRegArea](unsigned Reg) {
2125
+ return CheckRegArea (Reg, SpillArea::GPRCS2);
2126
+ };
2127
+ auto IsDPRCS1 = [&CheckRegArea](unsigned Reg) {
2128
+ return CheckRegArea (Reg, SpillArea::DPRCS1);
2129
+ };
2130
+
2110
2131
if (PushPopSplit == ARMSubtarget::SplitR11WindowsSEH) {
2111
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2112
- &isSplitFPArea2Register, 0 );
2113
- emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , &isARMArea3Register,
2114
- NumAlignedDPRCS2Regs);
2115
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2116
- &isSplitFPArea1Register, 0 );
2132
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS2);
2133
+ emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , IsDPRCS1);
2134
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS1);
2117
2135
} else {
2118
- emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , &isARMArea3Register,
2119
- NumAlignedDPRCS2Regs);
2120
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2121
- &isARMArea2Register, 0 );
2122
- emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false ,
2123
- &isARMArea1Register, 0 );
2136
+ emitPopInst (MBB, MI, CSI, FltOpc, 0 , isVarArg, true , IsDPRCS1);
2137
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS2);
2138
+ emitPopInst (MBB, MI, CSI, PopOpc, LdrOpc, isVarArg, false , IsGPRCS1);
2124
2139
}
2125
2140
2126
2141
return true ;
0 commit comments