@@ -1519,33 +1519,32 @@ void PPCRegisterInfo::lowerDMRSpilling(MachineBasicBlock::iterator II,
15191519 // DMR is made up of WACC and WACC_HI, so DMXXEXTFDMR512 to spill
15201520 // the corresponding 512 bits.
15211521 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+ };
15281541
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 );
15491548
15501549 // Discard the pseudo instruction.
15511550 MBB.erase (II);
@@ -1554,7 +1553,7 @@ void PPCRegisterInfo::lowerDMRSpilling(MachineBasicBlock::iterator II,
15541553// / lowerDMRRestore - Generate the code to restore the DMR register.
15551554void PPCRegisterInfo::lowerDMRRestore (MachineBasicBlock::iterator II,
15561555 unsigned FrameIndex) const {
1557- MachineInstr &MI = *II; // <DestReg> = RESTORE_WACC <offset>
1556+ MachineInstr &MI = *II; // <DestReg> = RESTORE_DMR[P] <offset>
15581557 MachineBasicBlock &MBB = *MI.getParent ();
15591558 MachineFunction &MF = *MBB.getParent ();
15601559 const PPCSubtarget &Subtarget = MF.getSubtarget <PPCSubtarget>();
@@ -1563,32 +1562,34 @@ void PPCRegisterInfo::lowerDMRRestore(MachineBasicBlock::iterator II,
15631562 bool IsLittleEndian = Subtarget.isLittleEndian ();
15641563
15651564 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+ };
15721586
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 );
15921593
15931594 // Discard the pseudo instruction.
15941595 MBB.erase (II);
@@ -1756,9 +1757,11 @@ PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
17561757 case PPC::RESTORE_WACC:
17571758 lowerWACCRestore (II, FrameIndex);
17581759 return true ;
1760+ case PPC::SPILL_DMRP:
17591761 case PPC::SPILL_DMR:
17601762 lowerDMRSpilling (II, FrameIndex);
17611763 return true ;
1764+ case PPC::RESTORE_DMRP:
17621765 case PPC::RESTORE_DMR:
17631766 lowerDMRRestore (II, FrameIndex);
17641767 return true ;
0 commit comments