xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCCallingConv.td (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric//===- PPCCallingConv.td - Calling Conventions for PowerPC -*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This describes the calling conventions for the PowerPC 32- and 64-bit
100b57cec5SDimitry Andric// architectures.
110b57cec5SDimitry Andric//
120b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric
140b57cec5SDimitry Andric/// CCIfSubtarget - Match if the current subtarget has a feature F.
150b57cec5SDimitry Andricclass CCIfSubtarget<string F, CCAction A>
160b57cec5SDimitry Andric    : CCIf<!strconcat("static_cast<const PPCSubtarget&>"
170b57cec5SDimitry Andric                       "(State.getMachineFunction().getSubtarget()).",
180b57cec5SDimitry Andric                     F),
190b57cec5SDimitry Andric          A>;
200b57cec5SDimitry Andricclass CCIfNotSubtarget<string F, CCAction A>
210b57cec5SDimitry Andric    : CCIf<!strconcat("!static_cast<const PPCSubtarget&>"
220b57cec5SDimitry Andric                       "(State.getMachineFunction().getSubtarget()).",
230b57cec5SDimitry Andric                     F),
240b57cec5SDimitry Andric          A>;
250b57cec5SDimitry Andricclass CCIfOrigArgWasNotPPCF128<CCAction A>
260b57cec5SDimitry Andric    : CCIf<"!static_cast<PPCCCState *>(&State)->WasOriginalArgPPCF128(ValNo)",
270b57cec5SDimitry Andric           A>;
280b57cec5SDimitry Andricclass CCIfOrigArgWasPPCF128<CCAction A>
290b57cec5SDimitry Andric    : CCIf<"static_cast<PPCCCState *>(&State)->WasOriginalArgPPCF128(ValNo)",
300b57cec5SDimitry Andric           A>;
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
330b57cec5SDimitry Andric// Return Value Calling Convention
340b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
350b57cec5SDimitry Andric
360b57cec5SDimitry Andric// PPC64 AnyReg return-value convention. No explicit register is specified for
370b57cec5SDimitry Andric// the return-value. The register allocator is allowed and expected to choose
380b57cec5SDimitry Andric// any free register.
390b57cec5SDimitry Andric//
400b57cec5SDimitry Andric// This calling convention is currently only supported by the stackmap and
410b57cec5SDimitry Andric// patchpoint intrinsics. All other uses will result in an assert on Debug
420b57cec5SDimitry Andric// builds. On Release builds we fallback to the PPC C calling convention.
430b57cec5SDimitry Andricdef RetCC_PPC64_AnyReg : CallingConv<[
440b57cec5SDimitry Andric  CCCustom<"CC_PPC_AnyReg_Error">
450b57cec5SDimitry Andric]>;
460b57cec5SDimitry Andric
470b57cec5SDimitry Andric// Return-value convention for PowerPC coldcc.
480b57cec5SDimitry Andriclet Entry = 1 in
490b57cec5SDimitry Andricdef RetCC_PPC_Cold : CallingConv<[
500b57cec5SDimitry Andric  // Use the same return registers as RetCC_PPC, but limited to only
510b57cec5SDimitry Andric  // one return value. The remaining return values will be saved to
520b57cec5SDimitry Andric  // the stack.
530b57cec5SDimitry Andric  CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
540b57cec5SDimitry Andric  CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>,
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3]>>,
570b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3]>>,
580b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3]>>,
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric  CCIfType<[f32], CCAssignToReg<[F1]>>,
610b57cec5SDimitry Andric  CCIfType<[f64], CCAssignToReg<[F1]>>,
62e8d8bef9SDimitry Andric  CCIfType<[f128], CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2]>>>,
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
650b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
660b57cec5SDimitry Andric           CCAssignToReg<[V2]>>>
670b57cec5SDimitry Andric]>;
680b57cec5SDimitry Andric
690b57cec5SDimitry Andric// Return-value convention for PowerPC
700b57cec5SDimitry Andriclet Entry = 1 in
710b57cec5SDimitry Andricdef RetCC_PPC : CallingConv<[
720b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
730b57cec5SDimitry Andric
740b57cec5SDimitry Andric  // On PPC64, integer return values are always promoted to i64
750b57cec5SDimitry Andric  CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
760b57cec5SDimitry Andric  CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>,
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
790b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
800b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric  // Floating point types returned as "direct" go into F1 .. F8; note that
830b57cec5SDimitry Andric  // only the ELFv2 ABI fully utilizes all these registers.
840b57cec5SDimitry Andric  CCIfNotSubtarget<"hasSPE()",
850b57cec5SDimitry Andric       CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
860b57cec5SDimitry Andric  CCIfNotSubtarget<"hasSPE()",
870b57cec5SDimitry Andric       CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
880b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
890b57cec5SDimitry Andric       CCIfType<[f32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>>,
900b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
910b57cec5SDimitry Andric       CCIfType<[f64], CCCustom<"CC_PPC32_SPE_RetF64">>>,
920b57cec5SDimitry Andric
930b57cec5SDimitry Andric  // For P9, f128 are passed in vector registers.
940b57cec5SDimitry Andric  CCIfType<[f128],
95e8d8bef9SDimitry Andric           CCIfSubtarget<"hasAltivec()",
960b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric  // Vector types returned as "direct" go into V2 .. V9; note that only the
990b57cec5SDimitry Andric  // ELFv2 ABI fully utilizes all these registers.
1000b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
1010b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1020b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>
1030b57cec5SDimitry Andric]>;
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric// No explicit register is specified for the AnyReg calling convention. The
1060b57cec5SDimitry Andric// register allocator may assign the arguments to any free register.
1070b57cec5SDimitry Andric//
1080b57cec5SDimitry Andric// This calling convention is currently only supported by the stackmap and
1090b57cec5SDimitry Andric// patchpoint intrinsics. All other uses will result in an assert on Debug
1100b57cec5SDimitry Andric// builds. On Release builds we fallback to the PPC C calling convention.
1110b57cec5SDimitry Andricdef CC_PPC64_AnyReg : CallingConv<[
1120b57cec5SDimitry Andric  CCCustom<"CC_PPC_AnyReg_Error">
1130b57cec5SDimitry Andric]>;
1140b57cec5SDimitry Andric
115*06c3fb27SDimitry Andric// Calling Convention corresponding to the 64-bit PowerPC ELFv2 ABI.
116*06c3fb27SDimitry Andric// This calling convention currently only handles integers, floats and
117*06c3fb27SDimitry Andric// vectors within registers, as well as it handles the shadowing of GPRs
118*06c3fb27SDimitry Andric// when floating point and vector arguments are used.
119*06c3fb27SDimitry Andric// FIXME: This calling convention needs to be extended to handle all types and
120*06c3fb27SDimitry Andric// complexities of the ABI.
121*06c3fb27SDimitry Andriclet Entry = 1 in
122*06c3fb27SDimitry Andricdef CC_PPC64_ELF : CallingConv<[
123*06c3fb27SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>,
124*06c3fb27SDimitry Andric
125*06c3fb27SDimitry Andric  CCIfType<[i1],  CCPromoteToType<i64>>,
126*06c3fb27SDimitry Andric  CCIfType<[i8],  CCPromoteToType<i64>>,
127*06c3fb27SDimitry Andric  CCIfType<[i16], CCPromoteToType<i64>>,
128*06c3fb27SDimitry Andric  CCIfType<[i32], CCPromoteToType<i64>>,
129*06c3fb27SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
130*06c3fb27SDimitry Andric
131*06c3fb27SDimitry Andric  // Handle fp types and shadow the corresponding registers as necessary.
132*06c3fb27SDimitry Andric  CCIfType<[f32, f64], CCIfNotVarArg<CCCustom<"CC_PPC64_ELF_Shadow_GPR_Regs">>>,
133*06c3fb27SDimitry Andric  CCIfType<[f32, f64],
134*06c3fb27SDimitry Andric           CCIfNotVarArg<CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,
135*06c3fb27SDimitry Andric                                        F11, F12, F13]>>>,
136*06c3fb27SDimitry Andric
137*06c3fb27SDimitry Andric  // f128 is handled through vector registers instead of fp registers.
138*06c3fb27SDimitry Andric  CCIfType<[f128],
139*06c3fb27SDimitry Andric           CCIfSubtarget<"hasAltivec()",
140*06c3fb27SDimitry Andric           CCIfNotVarArg<CCCustom<"CC_PPC64_ELF_Shadow_GPR_Regs">>>>,
141*06c3fb27SDimitry Andric  CCIfType<[f128],
142*06c3fb27SDimitry Andric           CCIfSubtarget<"hasAltivec()",
143*06c3fb27SDimitry Andric           CCIfNotVarArg<CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10,
144*06c3fb27SDimitry Andric                                        V11, V12, V13]>>>>,
145*06c3fb27SDimitry Andric
146*06c3fb27SDimitry Andric  // Handle support for vector types, and shadow GPRs as necessary.
147*06c3fb27SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v1i128],
148*06c3fb27SDimitry Andric           CCIfSubtarget<"hasAltivec()",
149*06c3fb27SDimitry Andric           CCIfNotVarArg<CCCustom<"CC_PPC64_ELF_Shadow_GPR_Regs">>>>,
150*06c3fb27SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v1i128],
151*06c3fb27SDimitry Andric           CCIfSubtarget<"hasAltivec()",
152*06c3fb27SDimitry Andric           CCIfNotVarArg<CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10,
153*06c3fb27SDimitry Andric                                        V11, V12, V13]>>>>,
154*06c3fb27SDimitry Andric]>;
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andric// Simple calling convention for 64-bit ELF PowerPC fast isel.
1570b57cec5SDimitry Andric// Only handle ints and floats.  All ints are promoted to i64.
1580b57cec5SDimitry Andric// Vector types and quadword ints are not handled.
1590b57cec5SDimitry Andriclet Entry = 1 in
1600b57cec5SDimitry Andricdef CC_PPC64_ELF_FIS : CallingConv<[
1610b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>,
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric  CCIfType<[i1],  CCPromoteToType<i64>>,
1640b57cec5SDimitry Andric  CCIfType<[i8],  CCPromoteToType<i64>>,
1650b57cec5SDimitry Andric  CCIfType<[i16], CCPromoteToType<i64>>,
1660b57cec5SDimitry Andric  CCIfType<[i32], CCPromoteToType<i64>>,
1670b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
1680b57cec5SDimitry Andric  CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
1690b57cec5SDimitry Andric]>;
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric// Simple return-value convention for 64-bit ELF PowerPC fast isel.
1720b57cec5SDimitry Andric// All small ints are promoted to i64.  Vector types, quadword ints,
1730b57cec5SDimitry Andric// and multiple register returns are "supported" to avoid compile
1740b57cec5SDimitry Andric// errors, but none are handled by the fast selector.
1750b57cec5SDimitry Andriclet Entry = 1 in
1760b57cec5SDimitry Andricdef RetCC_PPC64_ELF_FIS : CallingConv<[
1770b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric  CCIfType<[i1],   CCPromoteToType<i64>>,
1800b57cec5SDimitry Andric  CCIfType<[i8],   CCPromoteToType<i64>>,
1810b57cec5SDimitry Andric  CCIfType<[i16],  CCPromoteToType<i64>>,
1820b57cec5SDimitry Andric  CCIfType<[i32],  CCPromoteToType<i64>>,
1830b57cec5SDimitry Andric  CCIfType<[i64],  CCAssignToReg<[X3, X4, X5, X6]>>,
1840b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
1850b57cec5SDimitry Andric  CCIfType<[f32],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1860b57cec5SDimitry Andric  CCIfType<[f64],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1870b57cec5SDimitry Andric  CCIfType<[f128],
188e8d8bef9SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1890b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
1900b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
1910b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1920b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>
1930b57cec5SDimitry Andric]>;
1940b57cec5SDimitry Andric
1950b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1960b57cec5SDimitry Andric// PowerPC System V Release 4 32-bit ABI
1970b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andricdef CC_PPC32_SVR4_Common : CallingConv<[
2000b57cec5SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
2010b57cec5SDimitry Andric
2020b57cec5SDimitry Andric  // The ABI requires i64 to be passed in two adjacent registers with the first
2030b57cec5SDimitry Andric  // register having an odd register number.
2040b57cec5SDimitry Andric  CCIfType<[i32],
2050b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
2060b57cec5SDimitry Andric            CCIfOrigArgWasNotPPCF128<
2070b57cec5SDimitry Andric            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>>,
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric  CCIfType<[i32],
2100b57cec5SDimitry Andric  CCIfSplit<CCIfNotSubtarget<"useSoftFloat()",
2110b57cec5SDimitry Andric                            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>,
2120b57cec5SDimitry Andric  CCIfType<[f64],
2130b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
2140b57cec5SDimitry Andric                CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
2150b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
2160b57cec5SDimitry Andric                          CCIfOrigArgWasPPCF128<CCCustom<
2170b57cec5SDimitry Andric                          "CC_PPC32_SVR4_Custom_SkipLastArgRegsPPCF128">>>>,
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andric  // The 'nest' parameter, if any, is passed in R11.
2200b57cec5SDimitry Andric  CCIfNest<CCAssignToReg<[R11]>>,
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric  // The first 8 integer arguments are passed in integer registers.
2230b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
2240b57cec5SDimitry Andric
2250b57cec5SDimitry Andric  // Make sure the i64 words from a long double are either both passed in
2260b57cec5SDimitry Andric  // registers or both passed on the stack.
2270b57cec5SDimitry Andric  CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric  // FP values are passed in F1 - F8.
2300b57cec5SDimitry Andric  CCIfType<[f32, f64],
2310b57cec5SDimitry Andric           CCIfNotSubtarget<"hasSPE()",
2320b57cec5SDimitry Andric                            CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
2330b57cec5SDimitry Andric  CCIfType<[f64],
2340b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
2350b57cec5SDimitry Andric                         CCCustom<"CC_PPC32_SPE_CustomSplitFP64">>>,
2360b57cec5SDimitry Andric  CCIfType<[f32],
2370b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
2380b57cec5SDimitry Andric                         CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>>,
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andric  // Split arguments have an alignment of 8 bytes on the stack.
2410b57cec5SDimitry Andric  CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToStack<4, 4>>,
2440b57cec5SDimitry Andric
245bdd1243dSDimitry Andric  CCIfType<[f32], CCAssignToStack<4, 4>>,
246bdd1243dSDimitry Andric  CCIfType<[f64], CCAssignToStack<8, 8>>,
2470b57cec5SDimitry Andric
2480b57cec5SDimitry Andric  // Vectors and float128 get 16-byte stack slots that are 16-byte aligned.
2490b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>>,
250e8d8bef9SDimitry Andric  CCIfType<[f128], CCIfSubtarget<"hasAltivec()", CCAssignToStack<16, 16>>>
2510b57cec5SDimitry Andric]>;
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andric// This calling convention puts vector arguments always on the stack. It is used
2540b57cec5SDimitry Andric// to assign vector arguments which belong to the variable portion of the
2550b57cec5SDimitry Andric// parameter list of a variable argument function.
2560b57cec5SDimitry Andriclet Entry = 1 in
2570b57cec5SDimitry Andricdef CC_PPC32_SVR4_VarArg : CallingConv<[
2580b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2590b57cec5SDimitry Andric]>;
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andric// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
2620b57cec5SDimitry Andric// put vector arguments in vector registers before putting them on the stack.
2630b57cec5SDimitry Andriclet Entry = 1 in
2640b57cec5SDimitry Andricdef CC_PPC32_SVR4 : CallingConv<[
2650b57cec5SDimitry Andric  // The first 12 Vector arguments are passed in AltiVec registers.
2660b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
2670b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2680b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andric  // Float128 types treated as vector arguments.
2710b57cec5SDimitry Andric  CCIfType<[f128],
272e8d8bef9SDimitry Andric           CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2730b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2740b57cec5SDimitry Andric
2750b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2760b57cec5SDimitry Andric]>;
2770b57cec5SDimitry Andric
2780b57cec5SDimitry Andric// Helper "calling convention" to handle aggregate by value arguments.
2790b57cec5SDimitry Andric// Aggregate by value arguments are always placed in the local variable space
2800b57cec5SDimitry Andric// of the caller. This calling convention is only used to assign those stack
2810b57cec5SDimitry Andric// offsets in the callers stack frame.
2820b57cec5SDimitry Andric//
2830b57cec5SDimitry Andric// Still, the address of the aggregate copy in the callers stack frame is passed
2840b57cec5SDimitry Andric// in a GPR (or in the parameter list area if all GPRs are allocated) from the
2850b57cec5SDimitry Andric// caller to the callee. The location for the address argument is assigned by
2860b57cec5SDimitry Andric// the CC_PPC32_SVR4 calling convention.
2870b57cec5SDimitry Andric//
2880b57cec5SDimitry Andric// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
2890b57cec5SDimitry Andric// not passed by value.
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andriclet Entry = 1 in
2920b57cec5SDimitry Andricdef CC_PPC32_SVR4_ByVal : CallingConv<[
2930b57cec5SDimitry Andric  CCIfByVal<CCPassByVal<4, 4>>,
2940b57cec5SDimitry Andric
2950b57cec5SDimitry Andric  CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
2960b57cec5SDimitry Andric]>;
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andricdef CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
2990b57cec5SDimitry Andric                                       V28, V29, V30, V31)>;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric// SPE does not use FPRs, so break out the common register set as base.
3020b57cec5SDimitry Andricdef CSR_SVR432_COMM : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
3030b57cec5SDimitry Andric                                          R21, R22, R23, R24, R25, R26, R27,
3040b57cec5SDimitry Andric                                          R28, R29, R30, R31, CR2, CR3, CR4
3050b57cec5SDimitry Andric                                      )>;
3060b57cec5SDimitry Andricdef CSR_SVR432 :  CalleeSavedRegs<(add CSR_SVR432_COMM, F14, F15, F16, F17, F18,
3070b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
3080b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31
3090b57cec5SDimitry Andric                                   )>;
3100b57cec5SDimitry Andricdef CSR_SPE : CalleeSavedRegs<(add S14, S15, S16, S17, S18, S19, S20, S21, S22,
311bdd1243dSDimitry Andric                                   S23, S24, S25, S26, S27, S28, S29, S30
312bdd1243dSDimitry Andric                              )>;
313bdd1243dSDimitry Andric
314bdd1243dSDimitry Andricdef CSR_SPE_NO_S30_31 : CalleeSavedRegs<(add S14, S15, S16, S17, S18, S19, S20, S21,
315bdd1243dSDimitry Andric				          S22, S23, S24, S25, S26, S27, S28, S29
3160b57cec5SDimitry Andric			      )>;
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andricdef CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andricdef CSR_SVR432_SPE : CalleeSavedRegs<(add CSR_SVR432_COMM, CSR_SPE)>;
3210b57cec5SDimitry Andric
322bdd1243dSDimitry Andricdef CSR_SVR432_SPE_NO_S30_31 : CalleeSavedRegs<(add CSR_SVR432_COMM, CSR_SPE_NO_S30_31)>;
323bdd1243dSDimitry Andric
3240b57cec5SDimitry Andricdef CSR_AIX32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
3250b57cec5SDimitry Andric                                     R21, R22, R23, R24, R25, R26, R27, R28,
3260b57cec5SDimitry Andric                                     R29, R30, R31, F14, F15, F16, F17, F18,
3270b57cec5SDimitry Andric                                     F19, F20, F21, F22, F23, F24, F25, F26,
3280b57cec5SDimitry Andric                                     F27, F28, F29, F30, F31, CR2, CR3, CR4
3290b57cec5SDimitry Andric                                )>;
3300b57cec5SDimitry Andric
331e8d8bef9SDimitry Andricdef CSR_AIX32_Altivec : CalleeSavedRegs<(add CSR_AIX32, CSR_Altivec)>;
332e8d8bef9SDimitry Andric
3335ffd83dbSDimitry Andric// Common CalleeSavedRegs for SVR4 and AIX.
3345ffd83dbSDimitry Andricdef CSR_PPC64   : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
3350b57cec5SDimitry Andric                                        X21, X22, X23, X24, X25, X26, X27, X28,
3360b57cec5SDimitry Andric                                        X29, X30, X31, F14, F15, F16, F17, F18,
3370b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
3380b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31, CR2, CR3, CR4
3390b57cec5SDimitry Andric                                   )>;
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andric
3425ffd83dbSDimitry Andricdef CSR_PPC64_Altivec : CalleeSavedRegs<(add CSR_PPC64, CSR_Altivec)>;
3430b57cec5SDimitry Andric
3445ffd83dbSDimitry Andricdef CSR_PPC64_R2 : CalleeSavedRegs<(add CSR_PPC64, X2)>;
3450b57cec5SDimitry Andric
3465ffd83dbSDimitry Andricdef CSR_PPC64_R2_Altivec : CalleeSavedRegs<(add CSR_PPC64_Altivec, X2)>;
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>;
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andric// coldcc calling convection marks most registers as non-volatile.
3510b57cec5SDimitry Andric// Do not include r1 since the stack pointer is never considered a CSR.
3520b57cec5SDimitry Andric// Do not include r2, since it is the TOC register and is added depending
3530b57cec5SDimitry Andric// on whether or not the function uses the TOC and is a non-leaf.
3540b57cec5SDimitry Andric// Do not include r0,r11,r13 as they are optional in functional linkage
3550b57cec5SDimitry Andric// and value may be altered by inter-library calls.
3560b57cec5SDimitry Andric// Do not include r12 as it is used as a scratch register.
3570b57cec5SDimitry Andric// Do not include return registers r3, f1, v2.
3580b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Common : CalleeSavedRegs<(add (sequence "R%u", 4, 10),
3590b57cec5SDimitry Andric                                                (sequence "R%u", 14, 31),
3600b57cec5SDimitry Andric                                                (sequence "CR%u", 0, 7))>;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andricdef CSR_SVR32_ColdCC : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3630b57cec5SDimitry Andric                                          F0, (sequence "F%u", 2, 31))>;
3640b57cec5SDimitry Andric
3650b57cec5SDimitry Andric
3660b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR32_ColdCC,
3670b57cec5SDimitry Andric                                            (sequence "V%u", 0, 1),
3680b57cec5SDimitry Andric                                            (sequence "V%u", 3, 31))>;
3690b57cec5SDimitry Andric
3700b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_SPE : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3710b57cec5SDimitry Andric                                            (sequence "S%u", 4, 10),
3720b57cec5SDimitry Andric                                            (sequence "S%u", 14, 31))>;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andricdef CSR_SVR64_ColdCC : CalleeSavedRegs<(add  (sequence "X%u", 4, 10),
3750b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3760b57cec5SDimitry Andric                                             F0, (sequence "F%u", 2, 31),
3770b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3780b57cec5SDimitry Andric
3790b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2: CalleeSavedRegs<(add CSR_SVR64_ColdCC, X2)>;
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC,
3820b57cec5SDimitry Andric                                             (sequence "V%u", 0, 1),
3830b57cec5SDimitry Andric                                             (sequence "V%u", 3, 31))>;
3840b57cec5SDimitry Andric
3850b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC_Altivec, X2)>;
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andricdef CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10),
3880b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3890b57cec5SDimitry Andric                                             (sequence "F%u", 0, 31),
3900b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3910b57cec5SDimitry Andric
3920b57cec5SDimitry Andricdef CSR_64_AllRegs_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
3930b57cec5SDimitry Andric                                             (sequence "V%u", 0, 31))>;
3940b57cec5SDimitry Andric
395fe6060f1SDimitry Andricdef CSR_64_AllRegs_AIX_Dflt_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
396fe6060f1SDimitry Andric                                             (sequence "V%u", 0, 19))>;
397fe6060f1SDimitry Andric
3980b57cec5SDimitry Andricdef CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
3990b57cec5SDimitry Andric                                         (sequence "VSL%u", 0, 31))>;
4000b57cec5SDimitry Andric
401fe6060f1SDimitry Andricdef CSR_64_AllRegs_AIX_Dflt_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
402fe6060f1SDimitry Andric                                         (sequence "VSL%u", 0, 19))>;
40381ad6265SDimitry Andric
40481ad6265SDimitry Andricdef CSR_ALL_VSRP : CalleeSavedRegs<(sequence "VSRp%u", 0, 31)>;
40581ad6265SDimitry Andric
40681ad6265SDimitry Andricdef CSR_VSRP :
40781ad6265SDimitry Andric  CalleeSavedRegs<(add VSRp26, VSRp27, VSRp28, VSRp29, VSRp30, VSRp31)>;
40881ad6265SDimitry Andric
40981ad6265SDimitry Andricdef CSR_SVR432_VSRP : CalleeSavedRegs<(add CSR_SVR432_Altivec, CSR_VSRP)>;
41081ad6265SDimitry Andric
41181ad6265SDimitry Andricdef CSR_SVR464_VSRP : CalleeSavedRegs<(add CSR_PPC64_Altivec, CSR_VSRP)>;
41281ad6265SDimitry Andric
41381ad6265SDimitry Andricdef CSR_SVR464_R2_VSRP : CalleeSavedRegs<(add CSR_SVR464_VSRP, X2)>;
41481ad6265SDimitry Andric
41581ad6265SDimitry Andricdef CSR_SVR32_ColdCC_VSRP : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Altivec,
41681ad6265SDimitry Andric                                            (sub CSR_ALL_VSRP, VSRp17))>;
41781ad6265SDimitry Andric
41881ad6265SDimitry Andricdef CSR_SVR64_ColdCC_VSRP : CalleeSavedRegs<(add CSR_SVR64_ColdCC,
41981ad6265SDimitry Andric                                            (sub CSR_ALL_VSRP, VSRp17))>;
42081ad6265SDimitry Andric
42181ad6265SDimitry Andricdef CSR_SVR64_ColdCC_R2_VSRP : CalleeSavedRegs<(add CSR_SVR64_ColdCC_VSRP, X2)>;
42281ad6265SDimitry Andric
42381ad6265SDimitry Andricdef CSR_64_AllRegs_VSRP :
42481ad6265SDimitry Andric  CalleeSavedRegs<(add CSR_64_AllRegs_VSX, CSR_ALL_VSRP)>;
425bdd1243dSDimitry Andric
426bdd1243dSDimitry Andricdef CSR_AIX64_VSRP : CalleeSavedRegs<(add CSR_PPC64_Altivec, CSR_VSRP)>;
427bdd1243dSDimitry Andric
428bdd1243dSDimitry Andricdef CSR_AIX64_R2_VSRP : CalleeSavedRegs<(add CSR_AIX64_VSRP, X2)>;
429bdd1243dSDimitry Andric
430bdd1243dSDimitry Andricdef CSR_AIX32_VSRP : CalleeSavedRegs<(add CSR_AIX32_Altivec, CSR_VSRP)>;
431