diff options
Diffstat (limited to 'gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td')
| -rw-r--r-- | gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td b/gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td index 5bc9124f808..53d2f77ff91 100644 --- a/gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td +++ b/gnu/llvm/lib/Target/PowerPC/PPCCallingConv.td @@ -23,6 +23,9 @@ class CCIfNotSubtarget<string F, CCAction A> "(State.getMachineFunction().getSubtarget()).", F), A>; +class CCIfOrigArgWasNotPPCF128<CCAction A> + : CCIf<"!static_cast<PPCCCState *>(&State)->WasOriginalArgPPCF128(ValNo)", + A>; //===----------------------------------------------------------------------===// // Return Value Calling Convention @@ -109,7 +112,7 @@ def RetCC_PPC64_ELF_FIS : CallingConv<[ CCIfType<[i8], CCPromoteToType<i64>>, CCIfType<[i16], CCPromoteToType<i64>>, CCIfType<[i32], CCPromoteToType<i64>>, - CCIfType<[i64], CCAssignToReg<[X3, X4]>>, + CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>, CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>, CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, @@ -131,7 +134,14 @@ def CC_PPC32_SVR4_Common : CallingConv<[ // The ABI requires i64 to be passed in two adjacent registers with the first // register having an odd register number. - CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>, + CCIfType<[i32], + CCIfSplit<CCIfSubtarget<"useSoftFloat()", + CCIfOrigArgWasNotPPCF128< + CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>>, + + CCIfType<[i32], + CCIfSplit<CCIfNotSubtarget<"useSoftFloat()", + CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>, // The 'nest' parameter, if any, is passed in R11. CCIfNest<CCAssignToReg<[R11]>>, @@ -243,12 +253,23 @@ def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20, F27, F28, F29, F30, F31, CR2, CR3, CR4 )>; +// CSRs that are handled by prologue, epilogue. +def CSR_SRV464_TLS_PE : CalleeSavedRegs<(add)>; + +def CSR_SVR464_ViaCopy : CalleeSavedRegs<(add CSR_SVR464)>; + def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>; +def CSR_SVR464_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_Altivec)>; + def CSR_SVR464_R2 : CalleeSavedRegs<(add CSR_SVR464, X2)>; +def CSR_SVR464_R2_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2)>; + def CSR_SVR464_R2_Altivec : CalleeSavedRegs<(add CSR_SVR464_Altivec, X2)>; +def CSR_SVR464_R2_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2_Altivec)>; + def CSR_NoRegs : CalleeSavedRegs<(add)>; def CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10), |
