aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
diff options
context:
space:
mode:
authorStefan Pintilie <stefanp@ca.ibm.com>2022-03-11 10:06:17 -0600
committerStefan Pintilie <stefanp@ca.ibm.com>2022-03-15 14:08:42 -0500
commit78406ac8985bcefcf38d00c6fd112067cc773d96 (patch)
tree995883acc1aab0b6d93f2205c3fcd1e19c8c2a31 /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
parent5791e28f30168a5a930c1f869529b03b95405afe (diff)
downloadllvm-78406ac8985bcefcf38d00c6fd112067cc773d96.zip
llvm-78406ac8985bcefcf38d00c6fd112067cc773d96.tar.gz
llvm-78406ac8985bcefcf38d00c6fd112067cc773d96.tar.bz2
[PowerPC][P10] Add Vector pair calling convention
Add the calling convention for the vector pair registers. These registers overlap with the vector registers. Part of an original patch by: Lei Huang Reviewed By: nemanjai, #powerpc Differential Revision: https://reviews.llvm.org/D117225
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp51
1 files changed, 38 insertions, 13 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
index 76b016c0..4896591 100644
--- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -183,6 +183,8 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
if (!TM.isPPC64() && Subtarget.isAIXABI())
report_fatal_error("AnyReg unimplemented on 32-bit AIX.");
if (Subtarget.hasVSX()) {
+ if (Subtarget.pairedVectorMemops())
+ return CSR_64_AllRegs_VSRP_SaveList;
if (Subtarget.isAIXABI() && !TM.getAIXExtendedAltivecABI())
return CSR_64_AllRegs_AIX_Dflt_VSX_SaveList;
return CSR_64_AllRegs_VSX_SaveList;
@@ -210,6 +212,9 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
if (Subtarget.isAIXABI())
report_fatal_error("Cold calling unimplemented on AIX.");
if (TM.isPPC64()) {
+ if (Subtarget.pairedVectorMemops())
+ return SaveR2 ? CSR_SVR64_ColdCC_R2_VSRP_SaveList
+ : CSR_SVR64_ColdCC_VSRP_SaveList;
if (Subtarget.hasAltivec())
return SaveR2 ? CSR_SVR64_ColdCC_R2_Altivec_SaveList
: CSR_SVR64_ColdCC_Altivec_SaveList;
@@ -217,7 +222,9 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
: CSR_SVR64_ColdCC_SaveList;
}
// 32-bit targets.
- if (Subtarget.hasAltivec())
+ if (Subtarget.pairedVectorMemops())
+ return CSR_SVR32_ColdCC_VSRP_SaveList;
+ else if (Subtarget.hasAltivec())
return CSR_SVR32_ColdCC_Altivec_SaveList;
else if (Subtarget.hasSPE())
return CSR_SVR32_ColdCC_SPE_SaveList;
@@ -225,6 +232,8 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
}
// Standard calling convention CSRs.
if (TM.isPPC64()) {
+ if (Subtarget.pairedVectorMemops())
+ return SaveR2 ? CSR_SVR464_R2_VSRP_SaveList : CSR_SVR464_VSRP_SaveList;
if (Subtarget.hasAltivec() &&
(!Subtarget.isAIXABI() || TM.getAIXExtendedAltivecABI())) {
return SaveR2 ? CSR_PPC64_R2_Altivec_SaveList
@@ -239,6 +248,8 @@ PPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
: CSR_AIX32_SaveList;
return CSR_AIX32_SaveList;
}
+ if (Subtarget.pairedVectorMemops())
+ return CSR_SVR432_VSRP_SaveList;
if (Subtarget.hasAltivec())
return CSR_SVR432_Altivec_SaveList;
else if (Subtarget.hasSPE())
@@ -252,6 +263,8 @@ PPCRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
if (CC == CallingConv::AnyReg) {
if (Subtarget.hasVSX()) {
+ if (Subtarget.pairedVectorMemops())
+ return CSR_64_AllRegs_VSRP_RegMask;
if (Subtarget.isAIXABI() && !TM.getAIXExtendedAltivecABI())
return CSR_64_AllRegs_AIX_Dflt_VSX_RegMask;
return CSR_64_AllRegs_VSX_RegMask;
@@ -275,20 +288,32 @@ PPCRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
}
if (CC == CallingConv::Cold) {
- return TM.isPPC64() ? (Subtarget.hasAltivec() ? CSR_SVR64_ColdCC_Altivec_RegMask
- : CSR_SVR64_ColdCC_RegMask)
- : (Subtarget.hasAltivec() ? CSR_SVR32_ColdCC_Altivec_RegMask
- : (Subtarget.hasSPE()
- ? CSR_SVR32_ColdCC_SPE_RegMask
- : CSR_SVR32_ColdCC_RegMask));
+ if (TM.isPPC64())
+ return Subtarget.pairedVectorMemops()
+ ? CSR_SVR64_ColdCC_VSRP_RegMask
+ : (Subtarget.hasAltivec() ? CSR_SVR64_ColdCC_Altivec_RegMask
+ : CSR_SVR64_ColdCC_RegMask);
+ else
+ return Subtarget.pairedVectorMemops()
+ ? CSR_SVR32_ColdCC_VSRP_RegMask
+ : (Subtarget.hasAltivec()
+ ? CSR_SVR32_ColdCC_Altivec_RegMask
+ : (Subtarget.hasSPE() ? CSR_SVR32_ColdCC_SPE_RegMask
+ : CSR_SVR32_ColdCC_RegMask));
}
- return TM.isPPC64() ? (Subtarget.hasAltivec() ? CSR_PPC64_Altivec_RegMask
- : CSR_PPC64_RegMask)
- : (Subtarget.hasAltivec()
- ? CSR_SVR432_Altivec_RegMask
- : (Subtarget.hasSPE() ? CSR_SVR432_SPE_RegMask
- : CSR_SVR432_RegMask));
+ if (TM.isPPC64())
+ return Subtarget.pairedVectorMemops()
+ ? CSR_SVR464_VSRP_RegMask
+ : (Subtarget.hasAltivec() ? CSR_PPC64_Altivec_RegMask
+ : CSR_PPC64_RegMask);
+ else
+ return Subtarget.pairedVectorMemops()
+ ? CSR_SVR432_VSRP_RegMask
+ : (Subtarget.hasAltivec()
+ ? CSR_SVR432_Altivec_RegMask
+ : (Subtarget.hasSPE() ? CSR_SVR432_SPE_RegMask
+ : CSR_SVR432_RegMask));
}
const uint32_t*