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