xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCCallingConv.td (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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]>>,
620b57cec5SDimitry Andric  CCIfType<[f128], CCIfSubtarget<"hasP9Vector()", CCAssignToReg<[V2]>>>,
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric  CCIfType<[v4f64, v4f32, v4i1],
650b57cec5SDimitry Andric           CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1]>>>,
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
680b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
690b57cec5SDimitry Andric           CCAssignToReg<[V2]>>>
700b57cec5SDimitry Andric]>;
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric// Return-value convention for PowerPC
730b57cec5SDimitry Andriclet Entry = 1 in
740b57cec5SDimitry Andricdef RetCC_PPC : CallingConv<[
750b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric  // On PPC64, integer return values are always promoted to i64
780b57cec5SDimitry Andric  CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
790b57cec5SDimitry Andric  CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>,
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
820b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
830b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
840b57cec5SDimitry Andric
850b57cec5SDimitry Andric  // Floating point types returned as "direct" go into F1 .. F8; note that
860b57cec5SDimitry Andric  // only the ELFv2 ABI fully utilizes all these registers.
870b57cec5SDimitry Andric  CCIfNotSubtarget<"hasSPE()",
880b57cec5SDimitry Andric       CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
890b57cec5SDimitry Andric  CCIfNotSubtarget<"hasSPE()",
900b57cec5SDimitry Andric       CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
910b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
920b57cec5SDimitry Andric       CCIfType<[f32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>>,
930b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
940b57cec5SDimitry Andric       CCIfType<[f64], CCCustom<"CC_PPC32_SPE_RetF64">>>,
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric  // For P9, f128 are passed in vector registers.
970b57cec5SDimitry Andric  CCIfType<[f128],
980b57cec5SDimitry Andric           CCIfSubtarget<"hasP9Vector()",
990b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric  // QPX vectors are returned in QF1 and QF2.
1020b57cec5SDimitry Andric  CCIfType<[v4f64, v4f32, v4i1],
1030b57cec5SDimitry Andric           CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>,
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric  // Vector types returned as "direct" go into V2 .. V9; note that only the
1060b57cec5SDimitry Andric  // ELFv2 ABI fully utilizes all these registers.
1070b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
1080b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1090b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>
1100b57cec5SDimitry Andric]>;
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andric// No explicit register is specified for the AnyReg calling convention. The
1130b57cec5SDimitry Andric// register allocator may assign the arguments to any free register.
1140b57cec5SDimitry Andric//
1150b57cec5SDimitry Andric// This calling convention is currently only supported by the stackmap and
1160b57cec5SDimitry Andric// patchpoint intrinsics. All other uses will result in an assert on Debug
1170b57cec5SDimitry Andric// builds. On Release builds we fallback to the PPC C calling convention.
1180b57cec5SDimitry Andricdef CC_PPC64_AnyReg : CallingConv<[
1190b57cec5SDimitry Andric  CCCustom<"CC_PPC_AnyReg_Error">
1200b57cec5SDimitry Andric]>;
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric// Note that we don't currently have calling conventions for 64-bit
1230b57cec5SDimitry Andric// PowerPC, but handle all the complexities of the ABI in the lowering
1240b57cec5SDimitry Andric// logic.  FIXME: See if the logic can be simplified with use of CCs.
1250b57cec5SDimitry Andric// This may require some extensions to current table generation.
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric// Simple calling convention for 64-bit ELF PowerPC fast isel.
1280b57cec5SDimitry Andric// Only handle ints and floats.  All ints are promoted to i64.
1290b57cec5SDimitry Andric// Vector types and quadword ints are not handled.
1300b57cec5SDimitry Andriclet Entry = 1 in
1310b57cec5SDimitry Andricdef CC_PPC64_ELF_FIS : CallingConv<[
1320b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>,
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric  CCIfType<[i1],  CCPromoteToType<i64>>,
1350b57cec5SDimitry Andric  CCIfType<[i8],  CCPromoteToType<i64>>,
1360b57cec5SDimitry Andric  CCIfType<[i16], CCPromoteToType<i64>>,
1370b57cec5SDimitry Andric  CCIfType<[i32], CCPromoteToType<i64>>,
1380b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
1390b57cec5SDimitry Andric  CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
1400b57cec5SDimitry Andric]>;
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric// Simple return-value convention for 64-bit ELF PowerPC fast isel.
1430b57cec5SDimitry Andric// All small ints are promoted to i64.  Vector types, quadword ints,
1440b57cec5SDimitry Andric// and multiple register returns are "supported" to avoid compile
1450b57cec5SDimitry Andric// errors, but none are handled by the fast selector.
1460b57cec5SDimitry Andriclet Entry = 1 in
1470b57cec5SDimitry Andricdef RetCC_PPC64_ELF_FIS : CallingConv<[
1480b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andric  CCIfType<[i1],   CCPromoteToType<i64>>,
1510b57cec5SDimitry Andric  CCIfType<[i8],   CCPromoteToType<i64>>,
1520b57cec5SDimitry Andric  CCIfType<[i16],  CCPromoteToType<i64>>,
1530b57cec5SDimitry Andric  CCIfType<[i32],  CCPromoteToType<i64>>,
1540b57cec5SDimitry Andric  CCIfType<[i64],  CCAssignToReg<[X3, X4, X5, X6]>>,
1550b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
1560b57cec5SDimitry Andric  CCIfType<[f32],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1570b57cec5SDimitry Andric  CCIfType<[f64],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1580b57cec5SDimitry Andric  CCIfType<[f128],
1590b57cec5SDimitry Andric           CCIfSubtarget<"hasP9Vector()",
1600b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
1610b57cec5SDimitry Andric  CCIfType<[v4f64, v4f32, v4i1],
1620b57cec5SDimitry Andric           CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>,
1630b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
1640b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1650b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>
1660b57cec5SDimitry Andric]>;
1670b57cec5SDimitry Andric
1680b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1690b57cec5SDimitry Andric// PowerPC System V Release 4 32-bit ABI
1700b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andricdef CC_PPC32_SVR4_Common : CallingConv<[
1730b57cec5SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
1740b57cec5SDimitry Andric
1750b57cec5SDimitry Andric  // The ABI requires i64 to be passed in two adjacent registers with the first
1760b57cec5SDimitry Andric  // register having an odd register number.
1770b57cec5SDimitry Andric  CCIfType<[i32],
1780b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
1790b57cec5SDimitry Andric            CCIfOrigArgWasNotPPCF128<
1800b57cec5SDimitry Andric            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>>,
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric  CCIfType<[i32],
1830b57cec5SDimitry Andric  CCIfSplit<CCIfNotSubtarget<"useSoftFloat()",
1840b57cec5SDimitry Andric                            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>,
1850b57cec5SDimitry Andric  CCIfType<[f64],
1860b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
1870b57cec5SDimitry Andric                CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
1880b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
1890b57cec5SDimitry Andric                          CCIfOrigArgWasPPCF128<CCCustom<
1900b57cec5SDimitry Andric                          "CC_PPC32_SVR4_Custom_SkipLastArgRegsPPCF128">>>>,
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric  // The 'nest' parameter, if any, is passed in R11.
1930b57cec5SDimitry Andric  CCIfNest<CCAssignToReg<[R11]>>,
1940b57cec5SDimitry Andric
1950b57cec5SDimitry Andric  // The first 8 integer arguments are passed in integer registers.
1960b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
1970b57cec5SDimitry Andric
1980b57cec5SDimitry Andric  // Make sure the i64 words from a long double are either both passed in
1990b57cec5SDimitry Andric  // registers or both passed on the stack.
2000b57cec5SDimitry Andric  CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
2010b57cec5SDimitry Andric
2020b57cec5SDimitry Andric  // FP values are passed in F1 - F8.
2030b57cec5SDimitry Andric  CCIfType<[f32, f64],
2040b57cec5SDimitry Andric           CCIfNotSubtarget<"hasSPE()",
2050b57cec5SDimitry Andric                            CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
2060b57cec5SDimitry Andric  CCIfType<[f64],
2070b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
2080b57cec5SDimitry Andric                         CCCustom<"CC_PPC32_SPE_CustomSplitFP64">>>,
2090b57cec5SDimitry Andric  CCIfType<[f32],
2100b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
2110b57cec5SDimitry Andric                         CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>>,
2120b57cec5SDimitry Andric
2130b57cec5SDimitry Andric  // Split arguments have an alignment of 8 bytes on the stack.
2140b57cec5SDimitry Andric  CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToStack<4, 4>>,
2170b57cec5SDimitry Andric
2180b57cec5SDimitry Andric  // Floats are stored in double precision format, thus they have the same
2190b57cec5SDimitry Andric  // alignment and size as doubles.
2200b57cec5SDimitry Andric  // With SPE floats are stored as single precision, so have alignment and
2210b57cec5SDimitry Andric  // size of int.
2220b57cec5SDimitry Andric  CCIfType<[f32,f64], CCIfNotSubtarget<"hasSPE()", CCAssignToStack<8, 8>>>,
2230b57cec5SDimitry Andric  CCIfType<[f32], CCIfSubtarget<"hasSPE()", CCAssignToStack<4, 4>>>,
2240b57cec5SDimitry Andric  CCIfType<[f64], CCIfSubtarget<"hasSPE()", CCAssignToStack<8, 8>>>,
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric  // QPX vectors that are stored in double precision need 32-byte alignment.
2270b57cec5SDimitry Andric  CCIfType<[v4f64, v4i1], CCAssignToStack<32, 32>>,
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric  // Vectors and float128 get 16-byte stack slots that are 16-byte aligned.
2300b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>>,
2310b57cec5SDimitry Andric  CCIfType<[f128], CCIfSubtarget<"hasP9Vector()", CCAssignToStack<16, 16>>>
2320b57cec5SDimitry Andric]>;
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andric// This calling convention puts vector arguments always on the stack. It is used
2350b57cec5SDimitry Andric// to assign vector arguments which belong to the variable portion of the
2360b57cec5SDimitry Andric// parameter list of a variable argument function.
2370b57cec5SDimitry Andriclet Entry = 1 in
2380b57cec5SDimitry Andricdef CC_PPC32_SVR4_VarArg : CallingConv<[
2390b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2400b57cec5SDimitry Andric]>;
2410b57cec5SDimitry Andric
2420b57cec5SDimitry Andric// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
2430b57cec5SDimitry Andric// put vector arguments in vector registers before putting them on the stack.
2440b57cec5SDimitry Andriclet Entry = 1 in
2450b57cec5SDimitry Andricdef CC_PPC32_SVR4 : CallingConv<[
2460b57cec5SDimitry Andric  // QPX vectors mirror the scalar FP convention.
2470b57cec5SDimitry Andric  CCIfType<[v4f64, v4f32, v4i1], CCIfSubtarget<"hasQPX()",
2480b57cec5SDimitry Andric    CCAssignToReg<[QF1, QF2, QF3, QF4, QF5, QF6, QF7, QF8]>>>,
2490b57cec5SDimitry Andric
2500b57cec5SDimitry Andric  // The first 12 Vector arguments are passed in AltiVec registers.
2510b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
2520b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2530b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andric  // Float128 types treated as vector arguments.
2560b57cec5SDimitry Andric  CCIfType<[f128],
2570b57cec5SDimitry Andric           CCIfSubtarget<"hasP9Vector()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2580b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2610b57cec5SDimitry Andric]>;
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric// Helper "calling convention" to handle aggregate by value arguments.
2640b57cec5SDimitry Andric// Aggregate by value arguments are always placed in the local variable space
2650b57cec5SDimitry Andric// of the caller. This calling convention is only used to assign those stack
2660b57cec5SDimitry Andric// offsets in the callers stack frame.
2670b57cec5SDimitry Andric//
2680b57cec5SDimitry Andric// Still, the address of the aggregate copy in the callers stack frame is passed
2690b57cec5SDimitry Andric// in a GPR (or in the parameter list area if all GPRs are allocated) from the
2700b57cec5SDimitry Andric// caller to the callee. The location for the address argument is assigned by
2710b57cec5SDimitry Andric// the CC_PPC32_SVR4 calling convention.
2720b57cec5SDimitry Andric//
2730b57cec5SDimitry Andric// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
2740b57cec5SDimitry Andric// not passed by value.
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andriclet Entry = 1 in
2770b57cec5SDimitry Andricdef CC_PPC32_SVR4_ByVal : CallingConv<[
2780b57cec5SDimitry Andric  CCIfByVal<CCPassByVal<4, 4>>,
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andric  CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
2810b57cec5SDimitry Andric]>;
2820b57cec5SDimitry Andric
2830b57cec5SDimitry Andricdef CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
2840b57cec5SDimitry Andric                                       V28, V29, V30, V31)>;
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric// SPE does not use FPRs, so break out the common register set as base.
2870b57cec5SDimitry Andricdef CSR_SVR432_COMM : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
2880b57cec5SDimitry Andric                                          R21, R22, R23, R24, R25, R26, R27,
2890b57cec5SDimitry Andric                                          R28, R29, R30, R31, CR2, CR3, CR4
2900b57cec5SDimitry Andric                                      )>;
2910b57cec5SDimitry Andricdef CSR_SVR432 :  CalleeSavedRegs<(add CSR_SVR432_COMM, F14, F15, F16, F17, F18,
2920b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
2930b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31
2940b57cec5SDimitry Andric                                   )>;
2950b57cec5SDimitry Andricdef CSR_SPE : CalleeSavedRegs<(add S14, S15, S16, S17, S18, S19, S20, S21, S22,
2960b57cec5SDimitry Andric                                   S23, S24, S25, S26, S27, S28, S29, S30, S31
2970b57cec5SDimitry Andric                              )>;
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andricdef CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andricdef CSR_SVR432_SPE : CalleeSavedRegs<(add CSR_SVR432_COMM, CSR_SPE)>;
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andricdef CSR_AIX32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
3040b57cec5SDimitry Andric                                     R21, R22, R23, R24, R25, R26, R27, R28,
3050b57cec5SDimitry Andric                                     R29, R30, R31, F14, F15, F16, F17, F18,
3060b57cec5SDimitry Andric                                     F19, F20, F21, F22, F23, F24, F25, F26,
3070b57cec5SDimitry Andric                                     F27, F28, F29, F30, F31, CR2, CR3, CR4
3080b57cec5SDimitry Andric                                )>;
3090b57cec5SDimitry Andric
310*5ffd83dbSDimitry Andric// Common CalleeSavedRegs for SVR4 and AIX.
311*5ffd83dbSDimitry Andricdef CSR_PPC64   : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
3120b57cec5SDimitry Andric                                        X21, X22, X23, X24, X25, X26, X27, X28,
3130b57cec5SDimitry Andric                                        X29, X30, X31, F14, F15, F16, F17, F18,
3140b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
3150b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31, CR2, CR3, CR4
3160b57cec5SDimitry Andric                                   )>;
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andric
319*5ffd83dbSDimitry Andricdef CSR_PPC64_Altivec : CalleeSavedRegs<(add CSR_PPC64, CSR_Altivec)>;
3200b57cec5SDimitry Andric
321*5ffd83dbSDimitry Andricdef CSR_PPC64_R2 : CalleeSavedRegs<(add CSR_PPC64, X2)>;
3220b57cec5SDimitry Andric
323*5ffd83dbSDimitry Andricdef CSR_PPC64_R2_Altivec : CalleeSavedRegs<(add CSR_PPC64_Altivec, X2)>;
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>;
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andric// coldcc calling convection marks most registers as non-volatile.
3280b57cec5SDimitry Andric// Do not include r1 since the stack pointer is never considered a CSR.
3290b57cec5SDimitry Andric// Do not include r2, since it is the TOC register and is added depending
3300b57cec5SDimitry Andric// on whether or not the function uses the TOC and is a non-leaf.
3310b57cec5SDimitry Andric// Do not include r0,r11,r13 as they are optional in functional linkage
3320b57cec5SDimitry Andric// and value may be altered by inter-library calls.
3330b57cec5SDimitry Andric// Do not include r12 as it is used as a scratch register.
3340b57cec5SDimitry Andric// Do not include return registers r3, f1, v2.
3350b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Common : CalleeSavedRegs<(add (sequence "R%u", 4, 10),
3360b57cec5SDimitry Andric                                                (sequence "R%u", 14, 31),
3370b57cec5SDimitry Andric                                                (sequence "CR%u", 0, 7))>;
3380b57cec5SDimitry Andric
3390b57cec5SDimitry Andricdef CSR_SVR32_ColdCC : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3400b57cec5SDimitry Andric                                          F0, (sequence "F%u", 2, 31))>;
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andric
3430b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR32_ColdCC,
3440b57cec5SDimitry Andric                                            (sequence "V%u", 0, 1),
3450b57cec5SDimitry Andric                                            (sequence "V%u", 3, 31))>;
3460b57cec5SDimitry Andric
3470b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_SPE : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3480b57cec5SDimitry Andric                                            (sequence "S%u", 4, 10),
3490b57cec5SDimitry Andric                                            (sequence "S%u", 14, 31))>;
3500b57cec5SDimitry Andric
3510b57cec5SDimitry Andricdef CSR_SVR64_ColdCC : CalleeSavedRegs<(add  (sequence "X%u", 4, 10),
3520b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3530b57cec5SDimitry Andric                                             F0, (sequence "F%u", 2, 31),
3540b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3550b57cec5SDimitry Andric
3560b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2: CalleeSavedRegs<(add CSR_SVR64_ColdCC, X2)>;
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC,
3590b57cec5SDimitry Andric                                             (sequence "V%u", 0, 1),
3600b57cec5SDimitry Andric                                             (sequence "V%u", 3, 31))>;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC_Altivec, X2)>;
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andricdef CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10),
3650b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3660b57cec5SDimitry Andric                                             (sequence "F%u", 0, 31),
3670b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andricdef CSR_64_AllRegs_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
3700b57cec5SDimitry Andric                                             (sequence "V%u", 0, 31))>;
3710b57cec5SDimitry Andric
3720b57cec5SDimitry Andricdef CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
3730b57cec5SDimitry Andric                                         (sequence "VSL%u", 0, 31))>;
3740b57cec5SDimitry Andric
375