Skip to content

Commit df7db44

Browse files
authored
Revert "[PowerPC][NFC] Update lowering STXVP to STXV in Oct word spil… (#143948)
…ling (#142220)" This reverts commit edf636a. checked in wrong branch.
1 parent 46085d8 commit df7db44

File tree

1 file changed

+50
-43
lines changed

1 file changed

+50
-43
lines changed

llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)