@@ -1519,33 +1519,32 @@ void PPCRegisterInfo::lowerDMRSpilling(MachineBasicBlock::iterator II,
1519
1519
// DMR is made up of WACC and WACC_HI, so DMXXEXTFDMR512 to spill
1520
1520
// the corresponding 512 bits.
1521
1521
const TargetRegisterClass *RC = &PPC::VSRpRCRegClass;
1522
- Register SrcReg = MI.getOperand (0 ).getReg ();
1523
-
1524
- Register VSRpReg0 = MF.getRegInfo ().createVirtualRegister (RC);
1525
- Register VSRpReg1 = MF.getRegInfo ().createVirtualRegister (RC);
1526
- Register VSRpReg2 = MF.getRegInfo ().createVirtualRegister (RC);
1527
- Register VSRpReg3 = MF.getRegInfo ().createVirtualRegister (RC);
1522
+ auto spillDMR = [&](Register SrcReg, int BEIdx, int LEIdx) {
1523
+ auto spillWACC = [&](unsigned Opc, unsigned RegIdx, int IdxBE, int IdxLE) {
1524
+ Register VSRpReg0 = MF.getRegInfo ().createVirtualRegister (RC);
1525
+ Register VSRpReg1 = MF.getRegInfo ().createVirtualRegister (RC);
1526
+
1527
+ BuildMI (MBB, II, DL, TII.get (Opc), VSRpReg0)
1528
+ .addDef (VSRpReg1)
1529
+ .addReg (TargetRegisterInfo::getSubReg (SrcReg, RegIdx));
1530
+
1531
+ addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1532
+ .addReg (VSRpReg0, RegState::Kill),
1533
+ FrameIndex, IsLittleEndian ? IdxLE : IdxBE);
1534
+ addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1535
+ .addReg (VSRpReg1, RegState::Kill),
1536
+ FrameIndex, IsLittleEndian ? IdxLE - 32 : IdxBE + 32 );
1537
+ };
1538
+ spillWACC (PPC::DMXXEXTFDMR512, PPC::sub_wacc_lo, BEIdx, LEIdx);
1539
+ spillWACC (PPC::DMXXEXTFDMR512_HI, PPC::sub_wacc_hi, BEIdx + 64 , LEIdx - 64 );
1540
+ };
1528
1541
1529
- BuildMI (MBB, II, DL, TII.get (PPC::DMXXEXTFDMR512_HI), VSRpReg2)
1530
- .addDef (VSRpReg3)
1531
- .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_wacc_hi));
1532
-
1533
- BuildMI (MBB, II, DL, TII.get (PPC::DMXXEXTFDMR512), VSRpReg0)
1534
- .addDef (VSRpReg1)
1535
- .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_wacc_lo));
1536
-
1537
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1538
- .addReg (VSRpReg0, RegState::Kill),
1539
- FrameIndex, IsLittleEndian ? 96 : 0 );
1540
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1541
- .addReg (VSRpReg1, RegState::Kill),
1542
- FrameIndex, IsLittleEndian ? 64 : 32 );
1543
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1544
- .addReg (VSRpReg2, RegState::Kill),
1545
- FrameIndex, IsLittleEndian ? 32 : 64 );
1546
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1547
- .addReg (VSRpReg3, RegState::Kill),
1548
- FrameIndex, IsLittleEndian ? 0 : 96 );
1542
+ Register SrcReg = MI.getOperand (0 ).getReg ();
1543
+ if (MI.getOpcode () == PPC::SPILL_DMRP) {
1544
+ spillDMR (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_dmr1), 0 , 96 );
1545
+ spillDMR (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_dmr0), 128 , 224 );
1546
+ } else
1547
+ spillDMR (SrcReg, 0 , 96 );
1549
1548
1550
1549
// Discard the pseudo instruction.
1551
1550
MBB.erase (II);
@@ -1554,7 +1553,7 @@ void PPCRegisterInfo::lowerDMRSpilling(MachineBasicBlock::iterator II,
1554
1553
// / lowerDMRRestore - Generate the code to restore the DMR register.
1555
1554
void PPCRegisterInfo::lowerDMRRestore (MachineBasicBlock::iterator II,
1556
1555
unsigned FrameIndex) const {
1557
- MachineInstr &MI = *II; // <DestReg> = RESTORE_WACC <offset>
1556
+ MachineInstr &MI = *II; // <DestReg> = RESTORE_DMR[P] <offset>
1558
1557
MachineBasicBlock &MBB = *MI.getParent ();
1559
1558
MachineFunction &MF = *MBB.getParent ();
1560
1559
const PPCSubtarget &Subtarget = MF.getSubtarget <PPCSubtarget>();
@@ -1563,32 +1562,34 @@ void PPCRegisterInfo::lowerDMRRestore(MachineBasicBlock::iterator II,
1563
1562
bool IsLittleEndian = Subtarget.isLittleEndian ();
1564
1563
1565
1564
const TargetRegisterClass *RC = &PPC::VSRpRCRegClass;
1566
- Register DestReg = MI.getOperand (0 ).getReg ();
1567
-
1568
- Register VSRpReg0 = MF.getRegInfo ().createVirtualRegister (RC);
1569
- Register VSRpReg1 = MF.getRegInfo ().createVirtualRegister (RC);
1570
- Register VSRpReg2 = MF.getRegInfo ().createVirtualRegister (RC);
1571
- Register VSRpReg3 = MF.getRegInfo ().createVirtualRegister (RC);
1565
+ auto restoreDMR = [&](Register DestReg, int BEIdx, int LEIdx) {
1566
+ auto restoreWACC = [&](unsigned Opc, unsigned RegIdx, int IdxBE,
1567
+ int IdxLE) {
1568
+ Register VSRpReg0 = MF.getRegInfo ().createVirtualRegister (RC);
1569
+ Register VSRpReg1 = MF.getRegInfo ().createVirtualRegister (RC);
1570
+
1571
+ addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg0),
1572
+ FrameIndex, IsLittleEndian ? IdxLE : IdxBE);
1573
+ addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg1),
1574
+ FrameIndex, IsLittleEndian ? IdxLE - 32 : IdxBE + 32 );
1575
+
1576
+ // Kill virtual registers (killedRegState::Killed).
1577
+ BuildMI (MBB, II, DL, TII.get (Opc),
1578
+ TargetRegisterInfo::getSubReg (DestReg, RegIdx))
1579
+ .addReg (VSRpReg0, RegState::Kill)
1580
+ .addReg (VSRpReg1, RegState::Kill);
1581
+ };
1582
+ restoreWACC (PPC::DMXXINSTDMR512, PPC::sub_wacc_lo, BEIdx, LEIdx);
1583
+ restoreWACC (PPC::DMXXINSTDMR512_HI, PPC::sub_wacc_hi, BEIdx + 64 ,
1584
+ LEIdx - 64 );
1585
+ };
1572
1586
1573
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg0),
1574
- FrameIndex, IsLittleEndian ? 96 : 0 );
1575
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg1),
1576
- FrameIndex, IsLittleEndian ? 64 : 32 );
1577
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg2),
1578
- FrameIndex, IsLittleEndian ? 32 : 64 );
1579
- addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::LXVP), VSRpReg3),
1580
- FrameIndex, IsLittleEndian ? 0 : 96 );
1581
-
1582
- // Kill virtual registers (killedRegState::Killed).
1583
- BuildMI (MBB, II, DL, TII.get (PPC::DMXXINSTDMR512_HI),
1584
- TargetRegisterInfo::getSubReg (DestReg, PPC::sub_wacc_hi))
1585
- .addReg (VSRpReg2, RegState::Kill)
1586
- .addReg (VSRpReg3, RegState::Kill);
1587
-
1588
- BuildMI (MBB, II, DL, TII.get (PPC::DMXXINSTDMR512),
1589
- TargetRegisterInfo::getSubReg (DestReg, PPC::sub_wacc_lo))
1590
- .addReg (VSRpReg0, RegState::Kill)
1591
- .addReg (VSRpReg1, RegState::Kill);
1587
+ Register DestReg = MI.getOperand (0 ).getReg ();
1588
+ if (MI.getOpcode () == PPC::RESTORE_DMRP) {
1589
+ restoreDMR (TargetRegisterInfo::getSubReg (DestReg, PPC::sub_dmr1), 0 , 96 );
1590
+ restoreDMR (TargetRegisterInfo::getSubReg (DestReg, PPC::sub_dmr0), 128 , 224 );
1591
+ } else
1592
+ restoreDMR (DestReg, 0 , 96 );
1592
1593
1593
1594
// Discard the pseudo instruction.
1594
1595
MBB.erase (II);
@@ -1756,9 +1757,11 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
1756
1757
case PPC::RESTORE_WACC:
1757
1758
lowerWACCRestore (II, FrameIndex);
1758
1759
return true ;
1760
+ case PPC::SPILL_DMRP:
1759
1761
case PPC::SPILL_DMR:
1760
1762
lowerDMRSpilling (II, FrameIndex);
1761
1763
return true ;
1764
+ case PPC::RESTORE_DMRP:
1762
1765
case PPC::RESTORE_DMR:
1763
1766
lowerDMRRestore (II, FrameIndex);
1764
1767
return true ;
0 commit comments