@@ -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