diff options
author | Stefan Pintilie <stefanp@ca.ibm.com> | 2022-03-11 10:06:17 -0600 |
---|---|---|
committer | Stefan Pintilie <stefanp@ca.ibm.com> | 2022-03-15 14:08:42 -0500 |
commit | 78406ac8985bcefcf38d00c6fd112067cc773d96 (patch) | |
tree | 995883acc1aab0b6d93f2205c3fcd1e19c8c2a31 /llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | |
parent | 5791e28f30168a5a930c1f869529b03b95405afe (diff) | |
download | llvm-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.cpp | 51 |
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* |