Skip to content

Commit 9fbf355

Browse files
committed
change to private function since it'll be needed for wacc reg spilling when stxvp is disabled
1 parent 9416895 commit 9fbf355

File tree

2 files changed

+38
-30
lines changed

2 files changed

+38
-30
lines changed

llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,30 @@ static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed,
12381238
#endif
12391239
}
12401240

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+
12411265
/// Remove any STXVP[X] instructions and split them out into a pair of
12421266
/// STXV[X] instructions if --disable-auto-paired-vec-st is specified on
12431267
/// the command line.
@@ -1252,22 +1276,11 @@ void PPCRegisterInfo::lowerOctWordSpilling(MachineBasicBlock::iterator II,
12521276
const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
12531277
DebugLoc DL = MI.getDebugLoc();
12541278
Register SrcReg = MI.getOperand(0).getReg();
1255-
bool IsLittleEndian = Subtarget.isLittleEndian();
12561279
bool IsKilled = MI.getOperand(0).isKill();
1280+
bool IsLittleEndian = Subtarget.isLittleEndian();
12571281

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);
12711284

12721285
// Discard the original instruction.
12731286
MBB.erase(II);
@@ -1313,22 +1326,12 @@ void PPCRegisterInfo::lowerACCSpilling(MachineBasicBlock::iterator II,
13131326
if (IsPrimed)
13141327
BuildMI(MBB, II, DL, TII.get(PPC::XXMFACC), SrcReg).addReg(SrcReg);
13151328
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);
13321335
} else {
13331336
addFrameReference(
13341337
BuildMI(MBB, II, DL, TII.get(PPC::STXVP))

llvm/lib/Target/PowerPC/PPCRegisterInfo.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ class PPCRegisterInfo : public PPCGenRegisterInfo {
5858
DenseMap<unsigned, unsigned> ImmToIdxMap;
5959
const PPCTargetMachine &TM;
6060

61+
void spillRegPair(MachineBasicBlock &MBB, MachineBasicBlock::iterator II,
62+
DebugLoc DL, const TargetInstrInfo &TII,
63+
unsigned FrameIndex, bool IsLittleEndian, bool IsKilled,
64+
Register Reg, int Offset) const;
65+
6166
public:
6267
PPCRegisterInfo(const PPCTargetMachine &TM);
6368

0 commit comments

Comments
 (0)