@@ -1238,6 +1238,42 @@ 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+
12411277// / Remove any STXVP[X] instructions and split them out into a pair of
12421278// / STXV[X] instructions if --disable-auto-paired-vec-st is specified on
12431279// / the command line.
@@ -1254,21 +1290,8 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
12541290 Register SrcReg = MI.getOperand (0 ).getReg ();
12551291 bool IsLittleEndian = Subtarget.isLittleEndian ();
12561292 bool IsKilled = MI.getOperand (0 ).isKill ();
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-
1293+ spillRegPairs (MBB, II, DL, TII, SrcReg, FrameIndex, IsLittleEndian, IsKilled,
1294+ /* TwoPairs */ false );
12721295 // Discard the original instruction.
12731296 MBB.erase (II);
12741297}
@@ -1302,6 +1325,8 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13021325 bool IsKilled = MI.getOperand (0 ).isKill ();
13031326
13041327 bool IsPrimed = PPC::ACCRCRegClass.contains (SrcReg);
1328+ Register Reg =
1329+ PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2 ;
13051330 bool IsLittleEndian = Subtarget.isLittleEndian ();
13061331
13071332 emitAccSpillRestoreInfo (MBB, IsPrimed, false );
@@ -1312,34 +1337,16 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13121337 // adjust the offset of the store that is within the 64-byte stack slot.
13131338 if (IsPrimed)
13141339 BuildMI (MBB, II, DL, TII.get (PPC::XXMFACC), SrcReg).addReg (SrcReg);
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 );
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 );
13431350 }
13441351 if (IsPrimed && !IsKilled)
13451352 BuildMI (MBB, II, DL, TII.get (PPC::XXMTACC), SrcReg).addReg (SrcReg);
0 commit comments