@@ -1238,6 +1238,30 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed,
1238
1238
#endif
1239
1239
}
1240
1240
1241
+ void PPCRegisterInfo::spillRegPair (MachineBasicBlock &MBB,
1242
+ MachineBasicBlock::iterator II, DebugLoc DL,
1243
+ const TargetInstrInfo &TII,
1244
+ unsigned FrameIndex, bool IsLittleEndian,
1245
+ bool IsKilled, Register Reg,
1246
+ int Offset) const {
1247
+
1248
+ // This function does not support virtual registers.
1249
+ assert (!Reg.isVirtual () &&
1250
+ " Spilling register pairs does not support virtual registers." );
1251
+
1252
+ addFrameReference (
1253
+ BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1254
+ .addReg (TargetRegisterInfo::getSubReg (Reg, PPC::sub_vsx0),
1255
+ getKillRegState (IsKilled)),
1256
+ FrameIndex, Offset);
1257
+
1258
+ addFrameReference (
1259
+ BuildMI (MBB, II, DL, TII.get (PPC::STXV))
1260
+ .addReg (TargetRegisterInfo::getSubReg (Reg, PPC::sub_vsx1),
1261
+ getKillRegState (IsKilled)),
1262
+ FrameIndex, IsLittleEndian ? Offset - 16 : Offset + 16 );
1263
+ }
1264
+
1241
1265
// / Remove any STXVP[X] instructions and split them out into a pair of
1242
1266
// / STXV[X] instructions if --disable-auto-paired-vec-st is specified on
1243
1267
// / the command line.
@@ -1252,22 +1276,11 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
1252
1276
const TargetInstrInfo &TII = *Subtarget.getInstrInfo ();
1253
1277
DebugLoc DL = MI.getDebugLoc ();
1254
1278
Register SrcReg = MI.getOperand (0 ).getReg ();
1255
- bool IsLittleEndian = Subtarget.isLittleEndian ();
1256
1279
bool IsKilled = MI.getOperand (0 ).isKill ();
1280
+ bool IsLittleEndian = Subtarget.isLittleEndian ();
1257
1281
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 );
1282
+ spillRegPair (MBB, II, DL, TII, FrameIndex, IsLittleEndian, IsKilled, SrcReg,
1283
+ IsLittleEndian ? 16 : 0 );
1271
1284
1272
1285
// Discard the original instruction.
1273
1286
MBB.erase (II);
@@ -1313,22 +1326,12 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
1313
1326
if (IsPrimed)
1314
1327
BuildMI (MBB, II, DL, TII.get (PPC::XXMFACC), SrcReg).addReg (SrcReg);
1315
1328
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 );
1329
+ spillRegPair (MBB, II, DL, TII, FrameIndex, IsLittleEndian, IsKilled,
1330
+ TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair0),
1331
+ IsLittleEndian ? 48 : 0 );
1332
+ spillRegPair (MBB, II, DL, TII, FrameIndex, IsLittleEndian, IsKilled,
1333
+ TargetRegisterInfo::getSubReg (SrcReg, PPC::sub_pair1),
1334
+ IsLittleEndian ? 16 : 32 );
1332
1335
} else {
1333
1336
addFrameReference (
1334
1337
BuildMI (MBB, II, DL, TII.get (PPC::STXVP))
0 commit comments