xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCCallingConv.td (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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
1150b57cec5SDimitry Andric// Note that we don't currently have calling conventions for 64-bit
1160b57cec5SDimitry Andric// PowerPC, but handle all the complexities of the ABI in the lowering
1170b57cec5SDimitry Andric// logic.  FIXME: See if the logic can be simplified with use of CCs.
1180b57cec5SDimitry Andric// This may require some extensions to current table generation.
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andric// Simple calling convention for 64-bit ELF PowerPC fast isel.
1210b57cec5SDimitry Andric// Only handle ints and floats.  All ints are promoted to i64.
1220b57cec5SDimitry Andric// Vector types and quadword ints are not handled.
1230b57cec5SDimitry Andriclet Entry = 1 in
1240b57cec5SDimitry Andricdef CC_PPC64_ELF_FIS : CallingConv<[
1250b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>,
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric  CCIfType<[i1],  CCPromoteToType<i64>>,
1280b57cec5SDimitry Andric  CCIfType<[i8],  CCPromoteToType<i64>>,
1290b57cec5SDimitry Andric  CCIfType<[i16], CCPromoteToType<i64>>,
1300b57cec5SDimitry Andric  CCIfType<[i32], CCPromoteToType<i64>>,
1310b57cec5SDimitry Andric  CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
1320b57cec5SDimitry Andric  CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
1330b57cec5SDimitry Andric]>;
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andric// Simple return-value convention for 64-bit ELF PowerPC fast isel.
1360b57cec5SDimitry Andric// All small ints are promoted to i64.  Vector types, quadword ints,
1370b57cec5SDimitry Andric// and multiple register returns are "supported" to avoid compile
1380b57cec5SDimitry Andric// errors, but none are handled by the fast selector.
1390b57cec5SDimitry Andriclet Entry = 1 in
1400b57cec5SDimitry Andricdef RetCC_PPC64_ELF_FIS : CallingConv<[
1410b57cec5SDimitry Andric  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andric  CCIfType<[i1],   CCPromoteToType<i64>>,
1440b57cec5SDimitry Andric  CCIfType<[i8],   CCPromoteToType<i64>>,
1450b57cec5SDimitry Andric  CCIfType<[i16],  CCPromoteToType<i64>>,
1460b57cec5SDimitry Andric  CCIfType<[i32],  CCPromoteToType<i64>>,
1470b57cec5SDimitry Andric  CCIfType<[i64],  CCAssignToReg<[X3, X4, X5, X6]>>,
1480b57cec5SDimitry Andric  CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
1490b57cec5SDimitry Andric  CCIfType<[f32],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1500b57cec5SDimitry Andric  CCIfType<[f64],  CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
1510b57cec5SDimitry Andric  CCIfType<[f128],
152e8d8bef9SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1530b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
1540b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
1550b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()",
1560b57cec5SDimitry Andric           CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>
1570b57cec5SDimitry Andric]>;
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1600b57cec5SDimitry Andric// PowerPC System V Release 4 32-bit ABI
1610b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andricdef CC_PPC32_SVR4_Common : CallingConv<[
1640b57cec5SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
1650b57cec5SDimitry Andric
1660b57cec5SDimitry Andric  // The ABI requires i64 to be passed in two adjacent registers with the first
1670b57cec5SDimitry Andric  // register having an odd register number.
1680b57cec5SDimitry Andric  CCIfType<[i32],
1690b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
1700b57cec5SDimitry Andric            CCIfOrigArgWasNotPPCF128<
1710b57cec5SDimitry Andric            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>>,
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andric  CCIfType<[i32],
1740b57cec5SDimitry Andric  CCIfSplit<CCIfNotSubtarget<"useSoftFloat()",
1750b57cec5SDimitry Andric                            CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>,
1760b57cec5SDimitry Andric  CCIfType<[f64],
1770b57cec5SDimitry Andric  CCIfSubtarget<"hasSPE()",
1780b57cec5SDimitry Andric                CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
1790b57cec5SDimitry Andric  CCIfSplit<CCIfSubtarget<"useSoftFloat()",
1800b57cec5SDimitry Andric                          CCIfOrigArgWasPPCF128<CCCustom<
1810b57cec5SDimitry Andric                          "CC_PPC32_SVR4_Custom_SkipLastArgRegsPPCF128">>>>,
1820b57cec5SDimitry Andric
1830b57cec5SDimitry Andric  // The 'nest' parameter, if any, is passed in R11.
1840b57cec5SDimitry Andric  CCIfNest<CCAssignToReg<[R11]>>,
1850b57cec5SDimitry Andric
1860b57cec5SDimitry Andric  // The first 8 integer arguments are passed in integer registers.
1870b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
1880b57cec5SDimitry Andric
1890b57cec5SDimitry Andric  // Make sure the i64 words from a long double are either both passed in
1900b57cec5SDimitry Andric  // registers or both passed on the stack.
1910b57cec5SDimitry Andric  CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
1920b57cec5SDimitry Andric
1930b57cec5SDimitry Andric  // FP values are passed in F1 - F8.
1940b57cec5SDimitry Andric  CCIfType<[f32, f64],
1950b57cec5SDimitry Andric           CCIfNotSubtarget<"hasSPE()",
1960b57cec5SDimitry Andric                            CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>>,
1970b57cec5SDimitry Andric  CCIfType<[f64],
1980b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
1990b57cec5SDimitry Andric                         CCCustom<"CC_PPC32_SPE_CustomSplitFP64">>>,
2000b57cec5SDimitry Andric  CCIfType<[f32],
2010b57cec5SDimitry Andric           CCIfSubtarget<"hasSPE()",
2020b57cec5SDimitry Andric                         CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>>,
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric  // Split arguments have an alignment of 8 bytes on the stack.
2050b57cec5SDimitry Andric  CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
2060b57cec5SDimitry Andric
2070b57cec5SDimitry Andric  CCIfType<[i32], CCAssignToStack<4, 4>>,
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric  // Floats are stored in double precision format, thus they have the same
2100b57cec5SDimitry Andric  // alignment and size as doubles.
2110b57cec5SDimitry Andric  // With SPE floats are stored as single precision, so have alignment and
2120b57cec5SDimitry Andric  // size of int.
2130b57cec5SDimitry Andric  CCIfType<[f32,f64], CCIfNotSubtarget<"hasSPE()", CCAssignToStack<8, 8>>>,
2140b57cec5SDimitry Andric  CCIfType<[f32], CCIfSubtarget<"hasSPE()", CCAssignToStack<4, 4>>>,
2150b57cec5SDimitry Andric  CCIfType<[f64], CCIfSubtarget<"hasSPE()", CCAssignToStack<8, 8>>>,
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andric  // Vectors and float128 get 16-byte stack slots that are 16-byte aligned.
2180b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>>,
219e8d8bef9SDimitry Andric  CCIfType<[f128], CCIfSubtarget<"hasAltivec()", CCAssignToStack<16, 16>>>
2200b57cec5SDimitry Andric]>;
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric// This calling convention puts vector arguments always on the stack. It is used
2230b57cec5SDimitry Andric// to assign vector arguments which belong to the variable portion of the
2240b57cec5SDimitry Andric// parameter list of a variable argument function.
2250b57cec5SDimitry Andriclet Entry = 1 in
2260b57cec5SDimitry Andricdef CC_PPC32_SVR4_VarArg : CallingConv<[
2270b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2280b57cec5SDimitry Andric]>;
2290b57cec5SDimitry Andric
2300b57cec5SDimitry Andric// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
2310b57cec5SDimitry Andric// put vector arguments in vector registers before putting them on the stack.
2320b57cec5SDimitry Andriclet Entry = 1 in
2330b57cec5SDimitry Andricdef CC_PPC32_SVR4 : CallingConv<[
2340b57cec5SDimitry Andric  // The first 12 Vector arguments are passed in AltiVec registers.
2350b57cec5SDimitry Andric  CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32, v2f64],
2360b57cec5SDimitry Andric           CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2370b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andric  // Float128 types treated as vector arguments.
2400b57cec5SDimitry Andric  CCIfType<[f128],
241e8d8bef9SDimitry Andric           CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
2420b57cec5SDimitry Andric                          V8, V9, V10, V11, V12, V13]>>>,
2430b57cec5SDimitry Andric
2440b57cec5SDimitry Andric  CCDelegateTo<CC_PPC32_SVR4_Common>
2450b57cec5SDimitry Andric]>;
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andric// Helper "calling convention" to handle aggregate by value arguments.
2480b57cec5SDimitry Andric// Aggregate by value arguments are always placed in the local variable space
2490b57cec5SDimitry Andric// of the caller. This calling convention is only used to assign those stack
2500b57cec5SDimitry Andric// offsets in the callers stack frame.
2510b57cec5SDimitry Andric//
2520b57cec5SDimitry Andric// Still, the address of the aggregate copy in the callers stack frame is passed
2530b57cec5SDimitry Andric// in a GPR (or in the parameter list area if all GPRs are allocated) from the
2540b57cec5SDimitry Andric// caller to the callee. The location for the address argument is assigned by
2550b57cec5SDimitry Andric// the CC_PPC32_SVR4 calling convention.
2560b57cec5SDimitry Andric//
2570b57cec5SDimitry Andric// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
2580b57cec5SDimitry Andric// not passed by value.
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andriclet Entry = 1 in
2610b57cec5SDimitry Andricdef CC_PPC32_SVR4_ByVal : CallingConv<[
2620b57cec5SDimitry Andric  CCIfByVal<CCPassByVal<4, 4>>,
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andric  CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
2650b57cec5SDimitry Andric]>;
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andricdef CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
2680b57cec5SDimitry Andric                                       V28, V29, V30, V31)>;
2690b57cec5SDimitry Andric
2700b57cec5SDimitry Andric// SPE does not use FPRs, so break out the common register set as base.
2710b57cec5SDimitry Andricdef CSR_SVR432_COMM : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
2720b57cec5SDimitry Andric                                          R21, R22, R23, R24, R25, R26, R27,
2730b57cec5SDimitry Andric                                          R28, R29, R30, R31, CR2, CR3, CR4
2740b57cec5SDimitry Andric                                      )>;
2750b57cec5SDimitry Andricdef CSR_SVR432 :  CalleeSavedRegs<(add CSR_SVR432_COMM, F14, F15, F16, F17, F18,
2760b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
2770b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31
2780b57cec5SDimitry Andric                                   )>;
2790b57cec5SDimitry Andricdef CSR_SPE : CalleeSavedRegs<(add S14, S15, S16, S17, S18, S19, S20, S21, S22,
2800b57cec5SDimitry Andric                                   S23, S24, S25, S26, S27, S28, S29, S30, S31
2810b57cec5SDimitry Andric                              )>;
2820b57cec5SDimitry Andric
2830b57cec5SDimitry Andricdef CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andricdef CSR_SVR432_SPE : CalleeSavedRegs<(add CSR_SVR432_COMM, CSR_SPE)>;
2860b57cec5SDimitry Andric
2870b57cec5SDimitry Andricdef CSR_AIX32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
2880b57cec5SDimitry Andric                                     R21, R22, R23, R24, R25, R26, R27, R28,
2890b57cec5SDimitry Andric                                     R29, R30, R31, F14, F15, F16, F17, F18,
2900b57cec5SDimitry Andric                                     F19, F20, F21, F22, F23, F24, F25, F26,
2910b57cec5SDimitry Andric                                     F27, F28, F29, F30, F31, CR2, CR3, CR4
2920b57cec5SDimitry Andric                                )>;
2930b57cec5SDimitry Andric
294e8d8bef9SDimitry Andricdef CSR_AIX32_Altivec : CalleeSavedRegs<(add CSR_AIX32, CSR_Altivec)>;
295e8d8bef9SDimitry Andric
2965ffd83dbSDimitry Andric// Common CalleeSavedRegs for SVR4 and AIX.
2975ffd83dbSDimitry Andricdef CSR_PPC64   : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
2980b57cec5SDimitry Andric                                        X21, X22, X23, X24, X25, X26, X27, X28,
2990b57cec5SDimitry Andric                                        X29, X30, X31, F14, F15, F16, F17, F18,
3000b57cec5SDimitry Andric                                        F19, F20, F21, F22, F23, F24, F25, F26,
3010b57cec5SDimitry Andric                                        F27, F28, F29, F30, F31, CR2, CR3, CR4
3020b57cec5SDimitry Andric                                   )>;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andric
3055ffd83dbSDimitry Andricdef CSR_PPC64_Altivec : CalleeSavedRegs<(add CSR_PPC64, CSR_Altivec)>;
3060b57cec5SDimitry Andric
3075ffd83dbSDimitry Andricdef CSR_PPC64_R2 : CalleeSavedRegs<(add CSR_PPC64, X2)>;
3080b57cec5SDimitry Andric
3095ffd83dbSDimitry Andricdef CSR_PPC64_R2_Altivec : CalleeSavedRegs<(add CSR_PPC64_Altivec, X2)>;
3100b57cec5SDimitry Andric
3110b57cec5SDimitry Andricdef CSR_NoRegs : CalleeSavedRegs<(add)>;
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andric// coldcc calling convection marks most registers as non-volatile.
3140b57cec5SDimitry Andric// Do not include r1 since the stack pointer is never considered a CSR.
3150b57cec5SDimitry Andric// Do not include r2, since it is the TOC register and is added depending
3160b57cec5SDimitry Andric// on whether or not the function uses the TOC and is a non-leaf.
3170b57cec5SDimitry Andric// Do not include r0,r11,r13 as they are optional in functional linkage
3180b57cec5SDimitry Andric// and value may be altered by inter-library calls.
3190b57cec5SDimitry Andric// Do not include r12 as it is used as a scratch register.
3200b57cec5SDimitry Andric// Do not include return registers r3, f1, v2.
3210b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Common : CalleeSavedRegs<(add (sequence "R%u", 4, 10),
3220b57cec5SDimitry Andric                                                (sequence "R%u", 14, 31),
3230b57cec5SDimitry Andric                                                (sequence "CR%u", 0, 7))>;
3240b57cec5SDimitry Andric
3250b57cec5SDimitry Andricdef CSR_SVR32_ColdCC : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3260b57cec5SDimitry Andric                                          F0, (sequence "F%u", 2, 31))>;
3270b57cec5SDimitry Andric
3280b57cec5SDimitry Andric
3290b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR32_ColdCC,
3300b57cec5SDimitry Andric                                            (sequence "V%u", 0, 1),
3310b57cec5SDimitry Andric                                            (sequence "V%u", 3, 31))>;
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andricdef CSR_SVR32_ColdCC_SPE : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Common,
3340b57cec5SDimitry Andric                                            (sequence "S%u", 4, 10),
3350b57cec5SDimitry Andric                                            (sequence "S%u", 14, 31))>;
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andricdef CSR_SVR64_ColdCC : CalleeSavedRegs<(add  (sequence "X%u", 4, 10),
3380b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3390b57cec5SDimitry Andric                                             F0, (sequence "F%u", 2, 31),
3400b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2: CalleeSavedRegs<(add CSR_SVR64_ColdCC, X2)>;
3430b57cec5SDimitry Andric
3440b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC,
3450b57cec5SDimitry Andric                                             (sequence "V%u", 0, 1),
3460b57cec5SDimitry Andric                                             (sequence "V%u", 3, 31))>;
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andricdef CSR_SVR64_ColdCC_R2_Altivec : CalleeSavedRegs<(add CSR_SVR64_ColdCC_Altivec, X2)>;
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andricdef CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10),
3510b57cec5SDimitry Andric                                             (sequence "X%u", 14, 31),
3520b57cec5SDimitry Andric                                             (sequence "F%u", 0, 31),
3530b57cec5SDimitry Andric                                             (sequence "CR%u", 0, 7))>;
3540b57cec5SDimitry Andric
3550b57cec5SDimitry Andricdef CSR_64_AllRegs_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
3560b57cec5SDimitry Andric                                             (sequence "V%u", 0, 31))>;
3570b57cec5SDimitry Andric
358fe6060f1SDimitry Andricdef CSR_64_AllRegs_AIX_Dflt_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
359fe6060f1SDimitry Andric                                             (sequence "V%u", 0, 19))>;
360fe6060f1SDimitry Andric
3610b57cec5SDimitry Andricdef CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
3620b57cec5SDimitry Andric                                         (sequence "VSL%u", 0, 31))>;
3630b57cec5SDimitry Andric
364fe6060f1SDimitry Andricdef CSR_64_AllRegs_AIX_Dflt_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
365fe6060f1SDimitry Andric                                         (sequence "VSL%u", 0, 19))>;
366*81ad6265SDimitry Andric
367*81ad6265SDimitry Andricdef CSR_ALL_VSRP : CalleeSavedRegs<(sequence "VSRp%u", 0, 31)>;
368*81ad6265SDimitry Andric
369*81ad6265SDimitry Andricdef CSR_VSRP :
370*81ad6265SDimitry Andric  CalleeSavedRegs<(add VSRp26, VSRp27, VSRp28, VSRp29, VSRp30, VSRp31)>;
371*81ad6265SDimitry Andric
372*81ad6265SDimitry Andricdef CSR_SVR432_VSRP : CalleeSavedRegs<(add CSR_SVR432_Altivec, CSR_VSRP)>;
373*81ad6265SDimitry Andric
374*81ad6265SDimitry Andricdef CSR_SVR464_VSRP : CalleeSavedRegs<(add CSR_PPC64_Altivec, CSR_VSRP)>;
375*81ad6265SDimitry Andric
376*81ad6265SDimitry Andricdef CSR_SVR464_R2_VSRP : CalleeSavedRegs<(add CSR_SVR464_VSRP, X2)>;
377*81ad6265SDimitry Andric
378*81ad6265SDimitry Andricdef CSR_SVR32_ColdCC_VSRP : CalleeSavedRegs<(add CSR_SVR32_ColdCC_Altivec,
379*81ad6265SDimitry Andric                                            (sub CSR_ALL_VSRP, VSRp17))>;
380*81ad6265SDimitry Andric
381*81ad6265SDimitry Andricdef CSR_SVR64_ColdCC_VSRP : CalleeSavedRegs<(add CSR_SVR64_ColdCC,
382*81ad6265SDimitry Andric                                            (sub CSR_ALL_VSRP, VSRp17))>;
383*81ad6265SDimitry Andric
384*81ad6265SDimitry Andricdef CSR_SVR64_ColdCC_R2_VSRP : CalleeSavedRegs<(add CSR_SVR64_ColdCC_VSRP, X2)>;
385*81ad6265SDimitry Andric
386*81ad6265SDimitry Andricdef CSR_64_AllRegs_VSRP :
387*81ad6265SDimitry Andric  CalleeSavedRegs<(add CSR_64_AllRegs_VSX, CSR_ALL_VSRP)>;
388