@@ -1238,42 +1238,6 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed,
12381238#endif 
12391239}
12401240
1241- static  void  spillRegPairs (MachineBasicBlock &MBB,
1242-                           MachineBasicBlock::iterator II, DebugLoc DL,
1243-                           const  TargetInstrInfo &TII, Register SrcReg,
1244-                           unsigned  FrameIndex, bool  IsLittleEndian,
1245-                           bool  IsKilled, bool  TwoPairs) {
1246-   unsigned  Offset = 0 ;
1247-   //  The register arithmetic in this function does not support virtual
1248-   //  registers.
1249-   assert (!SrcReg.isVirtual () &&
1250-          " Spilling register pairs does not support virtual registers." 
1251- 
1252-   if  (TwoPairs)
1253-     Offset = IsLittleEndian ? 48  : 0 ;
1254-   else 
1255-     Offset = IsLittleEndian ? 16  : 0 ;
1256-   Register Reg = (SrcReg > PPC::VSRp15) ? PPC::V0 + (SrcReg - PPC::VSRp16) * 2 
1257-                                         : PPC::VSL0 + (SrcReg - PPC::VSRp0) * 2 ;
1258-   addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1259-                         .addReg (Reg, getKillRegState (IsKilled)),
1260-                     FrameIndex, Offset);
1261-   Offset += IsLittleEndian ? -16  : 16 ;
1262-   addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1263-                         .addReg (Reg + 1 , getKillRegState (IsKilled)),
1264-                     FrameIndex, Offset);
1265-   if  (TwoPairs) {
1266-     Offset += IsLittleEndian ? -16  : 16 ;
1267-     addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1268-                           .addReg (Reg + 2 , getKillRegState (IsKilled)),
1269-                       FrameIndex, Offset);
1270-     Offset += IsLittleEndian ? -16  : 16 ;
1271-     addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1272-                           .addReg (Reg + 3 , getKillRegState (IsKilled)),
1273-                       FrameIndex, Offset);
1274-   }
1275- }
1276- 
12771241// / Remove any STXVP[X] instructions and split them out into a pair of
12781242// / STXV[X] instructions if --disable-auto-paired-vec-st is specified on
12791243// / the command line.
@@ -1290,8 +1254,21 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
12901254  Register SrcReg = MI.getOperand (0 ).getReg ();
12911255  bool  IsLittleEndian = Subtarget.isLittleEndian ();
12921256  bool  IsKilled = MI.getOperand (0 ).isKill ();
1293-   spillRegPairs (MBB, II, DL, TII, SrcReg, FrameIndex, IsLittleEndian, IsKilled,
1294-                 /*  TwoPairs */ false );
1257+ 
1258+   assert (PPC::VSRpRCRegClass.contains (SrcReg) &&
1259+           " Expecting STXVP to be utilizing a VSRp register." 
1260+ 
1261+   addFrameReference (
1262+       BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1263+           .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_vsx0),
1264+                   getKillRegState (IsKilled)),
1265+       FrameIndex, IsLittleEndian ? 16  : 0 );
1266+   addFrameReference (
1267+       BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1268+           .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_vsx1),
1269+                   getKillRegState (IsKilled)),
1270+       FrameIndex, IsLittleEndian ? 0  : 16 );
1271+ 
12951272  //  Discard the original instruction.
12961273  MBB.erase (II);
12971274}
@@ -1325,8 +1302,6 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13251302  bool  IsKilled = MI.getOperand (0 ).isKill ();
13261303
13271304  bool  IsPrimed = PPC::ACCRCRegClass.contains (SrcReg);
1328-   Register Reg =
1329-       PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2 ;
13301305  bool  IsLittleEndian = Subtarget.isLittleEndian ();
13311306
13321307  emitAccSpillRestoreInfo (MBB, IsPrimed, false );
@@ -1337,16 +1312,34 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13371312  //  adjust the offset of the store that is within the 64-byte stack slot.
13381313  if  (IsPrimed)
13391314    BuildMI (MBB, II, DL, TII.get (PPC::XXMFACC), SrcReg).addReg (SrcReg);
1340-   if  (DisableAutoPairedVecSt)
1341-     spillRegPairs (MBB, II, DL, TII, Reg, FrameIndex, IsLittleEndian, IsKilled,
1342-                   /*  TwoPairs */ true );
1343-   else  {
1344-     addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1345-                           .addReg (Reg, getKillRegState (IsKilled)),
1346-                       FrameIndex, IsLittleEndian ? 32  : 0 );
1347-     addFrameReference (BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1348-                           .addReg (Reg + 1 , getKillRegState (IsKilled)),
1349-                       FrameIndex, IsLittleEndian ? 0  : 32 );
1315+   if  (DisableAutoPairedVecSt) {
1316+     auto  spillPair = [&](Register Reg, int  Offset) {
1317+       addFrameReference (
1318+           BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1319+               .addReg (TargetRegisterInfo::getSubReg (Reg, PPC::sub_vsx0),
1320+                       getKillRegState (IsKilled)),
1321+           FrameIndex, Offset);
1322+       addFrameReference (
1323+           BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1324+               .addReg (TargetRegisterInfo::getSubReg (Reg, PPC::sub_vsx1),
1325+                       getKillRegState (IsKilled)),
1326+           FrameIndex, IsLittleEndian ? Offset - 16  : Offset + 16 );
1327+     };
1328+     spillPair (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair0),
1329+               IsLittleEndian ? 48  : 0 );
1330+     spillPair (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair1),
1331+               IsLittleEndian ? 16  : 32 );
1332+   } else  {
1333+     addFrameReference (
1334+         BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1335+             .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair0),
1336+                     getKillRegState (IsKilled)),
1337+         FrameIndex, IsLittleEndian ? 32  : 0 );
1338+     addFrameReference (
1339+         BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
1340+             .addReg (TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair1),
1341+                     getKillRegState (IsKilled)),
1342+         FrameIndex, IsLittleEndian ? 0  : 32 );
13501343  }
13511344  if  (IsPrimed && !IsKilled)
13521345    BuildMI (MBB, II, DL, TII.get (PPC::XXMTACC), SrcReg).addReg (SrcReg);
0 commit comments