@@ -1238,42 +1238,6 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed,
1238
1238
#endif
1239
1239
}
1240
1240
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
-
1277
1241
// / Remove any STXVP[X] instructions and split them out into a pair of
1278
1242
// / STXV[X] instructions if --disable-auto-paired-vec-st is specified on
1279
1243
// / the command line.
@@ -1290,8 +1254,21 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
1290
1254
Register SrcReg = MI.getOperand (0 ).getReg ();
1291
1255
bool IsLittleEndian = Subtarget.isLittleEndian ();
1292
1256
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
+
1295
1272
// Discard the original instruction.
1296
1273
MBB.erase (II);
1297
1274
}
@@ -1325,8 +1302,6 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
1325
1302
bool IsKilled = MI.getOperand (0 ).isKill ();
1326
1303
1327
1304
bool IsPrimed = PPC::ACCRCRegClass.contains (SrcReg);
1328
- Register Reg =
1329
- PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2 ;
1330
1305
bool IsLittleEndian = Subtarget.isLittleEndian ();
1331
1306
1332
1307
emitAccSpillRestoreInfo (MBB, IsPrimed, false );
@@ -1337,16 +1312,34 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
1337
1312
// adjust the offset of the store that is within the 64-byte stack slot.
1338
1313
if (IsPrimed)
1339
1314
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 );
1350
1343
}
1351
1344
if (IsPrimed && !IsKilled)
1352
1345
BuildMI (MBB, II, DL, TII.get (PPC::XXMTACC), SrcReg).addReg (SrcReg);
0 commit comments