mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
PowerPC: Fix register spilling for SPE registers
Summary: Missed in the original commit, use the correct callee-saved register list for spilling, instead of the standard SVR432 list. This avoids needlessly spilling the SPE non-volatile registers when they're not used. As part of this, also add where missing, and sort, the spill opcode checks for SPE and SPE4 register classes. Reviewers: nemanjai, hfinkel, joerg Subscribers: kbarton, jsji, llvm-commits Differential Revision: https://reviews.llvm.org/D56703 llvm-svn: 366319
This commit is contained in:
parent
43d936c30c
commit
0efee41582
@ -366,15 +366,22 @@ def CSR_NoRegs : CalleeSavedRegs<(add)>;
|
||||
// and value may be altered by inter-library calls.
|
||||
// Do not include r12 as it is used as a scratch register.
|
||||
// Do not include return registers r3, f1, v2.
|
||||
def CSR_SVR32_ColdCC : CalleeSavedRegs<(add (sequence "R%u", 4, 10),
|
||||
(sequence "R%u", 14, 31),
|
||||
F0, (sequence "F%u", 2, 31),
|
||||
(sequence "CR%u", 0, 7))>;
|
||||
def CSR_SVR32_ColdCC_Common : CalleeSavedRegs<(add (sequence "R%u", 4, 10),
|
||||
(sequence "R%u", 14, 31),
|
||||
(sequence "CR%u", 0, 7))>;
|
||||
|
||||
def CSR_SVR32_ColdCC : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
|
||||
F0, (sequence "F%u", 2, 31))>;
|
||||
|
||||
|
||||
def CSR_SVR32_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR32_ColdCC,
|
||||
(sequence "V%u", 0, 1),
|
||||
(sequence "V%u", 3, 31))>;
|
||||
|
||||
def CSR_SVR32_ColdCC_SPE : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
|
||||
(sequence "S%u", 4, 10),
|
||||
(sequence "S%u", 14, 31))>;
|
||||
|
||||
def CSR_SVR64_ColdCC : CalleeSavedRegs<(add (sequence "X%u", 4, 10),
|
||||
(sequence "X%u", 14, 31),
|
||||
F0, (sequence "F%u", 2, 31),
|
||||
|
@ -1009,6 +1009,8 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||
Opc = PPC::QVFMRb;
|
||||
else if (PPC::CRBITRCRegClass.contains(DestReg, SrcReg))
|
||||
Opc = PPC::CROR;
|
||||
else if (PPC::SPE4RCRegClass.contains(DestReg, SrcReg))
|
||||
Opc = PPC::OR;
|
||||
else if (PPC::SPERCRegClass.contains(DestReg, SrcReg))
|
||||
Opc = PPC::EVOR;
|
||||
else
|
||||
|
@ -159,30 +159,39 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
if (TM.isPPC64() && MF->getInfo<PPCFunctionInfo>()->isSplitCSR())
|
||||
return CSR_SRV464_TLS_PE_SaveList;
|
||||
|
||||
if (Subtarget.hasSPE())
|
||||
return CSR_SVR432_SPE_SaveList;
|
||||
|
||||
// On PPC64, we might need to save r2 (but only if it is not reserved).
|
||||
bool SaveR2 = MF->getRegInfo().isAllocatable(PPC::X2);
|
||||
|
||||
// Cold calling convention CSRs.
|
||||
if (MF->getFunction().getCallingConv() == CallingConv::Cold) {
|
||||
return TM.isPPC64()
|
||||
? (Subtarget.hasAltivec()
|
||||
? (SaveR2 ? CSR_SVR64_ColdCC_R2_Altivec_SaveList
|
||||
: CSR_SVR64_ColdCC_Altivec_SaveList)
|
||||
: (SaveR2 ? CSR_SVR64_ColdCC_R2_SaveList
|
||||
: CSR_SVR64_ColdCC_SaveList))
|
||||
: (Subtarget.hasAltivec() ? CSR_SVR32_ColdCC_Altivec_SaveList
|
||||
: CSR_SVR32_ColdCC_SaveList);
|
||||
if (TM.isPPC64()) {
|
||||
if (Subtarget.hasAltivec())
|
||||
return SaveR2 ? CSR_SVR64_ColdCC_R2_Altivec_SaveList
|
||||
: CSR_SVR64_ColdCC_Altivec_SaveList;
|
||||
return SaveR2 ? CSR_SVR64_ColdCC_R2_SaveList
|
||||
: CSR_SVR64_ColdCC_SaveList;
|
||||
}
|
||||
// 32-bit targets.
|
||||
if (Subtarget.hasAltivec())
|
||||
return CSR_SVR32_ColdCC_Altivec_SaveList;
|
||||
else if (Subtarget.hasSPE())
|
||||
return CSR_SVR32_ColdCC_SPE_SaveList;
|
||||
return CSR_SVR32_ColdCC_SaveList;
|
||||
}
|
||||
|
||||
return TM.isPPC64()
|
||||
? (Subtarget.hasAltivec()
|
||||
? (SaveR2 ? CSR_SVR464_R2_Altivec_SaveList
|
||||
: CSR_SVR464_Altivec_SaveList)
|
||||
: (SaveR2 ? CSR_SVR464_R2_SaveList : CSR_SVR464_SaveList))
|
||||
: (Subtarget.hasAltivec() ? CSR_SVR432_Altivec_SaveList
|
||||
: CSR_SVR432_SaveList);
|
||||
// Standard calling convention CSRs.
|
||||
if (TM.isPPC64()) {
|
||||
if (Subtarget.hasAltivec())
|
||||
return SaveR2 ? CSR_SVR464_R2_Altivec_SaveList
|
||||
: CSR_SVR464_Altivec_SaveList;
|
||||
return SaveR2 ? CSR_SVR464_R2_SaveList
|
||||
: CSR_SVR464_SaveList;
|
||||
}
|
||||
// 32-bit targets.
|
||||
if (Subtarget.hasAltivec())
|
||||
return CSR_SVR432_Altivec_SaveList;
|
||||
else if (Subtarget.hasSPE())
|
||||
return CSR_SVR432_SPE_SaveList;
|
||||
return CSR_SVR432_SaveList;
|
||||
}
|
||||
|
||||
const MCPhysReg *
|
||||
@ -236,13 +245,17 @@ PPCRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
|
||||
return TM.isPPC64() ? (Subtarget.hasAltivec() ? CSR_SVR64_ColdCC_Altivec_RegMask
|
||||
: CSR_SVR64_ColdCC_RegMask)
|
||||
: (Subtarget.hasAltivec() ? CSR_SVR32_ColdCC_Altivec_RegMask
|
||||
: CSR_SVR32_ColdCC_RegMask);
|
||||
: (Subtarget.hasSPE()
|
||||
? CSR_SVR32_ColdCC_SPE_RegMask
|
||||
: CSR_SVR32_ColdCC_RegMask));
|
||||
}
|
||||
|
||||
return TM.isPPC64() ? (Subtarget.hasAltivec() ? CSR_SVR464_Altivec_RegMask
|
||||
: CSR_SVR464_RegMask)
|
||||
: (Subtarget.hasAltivec() ? CSR_SVR432_Altivec_RegMask
|
||||
: CSR_SVR432_RegMask);
|
||||
: (Subtarget.hasSPE()
|
||||
? CSR_SVR432_SPE_RegMask
|
||||
: CSR_SVR432_RegMask));
|
||||
}
|
||||
|
||||
const uint32_t*
|
||||
|
Loading…
x
Reference in New Issue
Block a user