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]>>, 62*e8d8bef9SDimitry 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], 95*e8d8bef9SDimitry 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], 152*e8d8bef9SDimitry 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>>, 219*e8d8bef9SDimitry 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], 241*e8d8bef9SDimitry 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 294*e8d8bef9SDimitry Andricdef CSR_AIX32_Altivec : CalleeSavedRegs<(add CSR_AIX32, CSR_Altivec)>; 295*e8d8bef9SDimitry 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 3580b57cec5SDimitry Andricdef CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec, 3590b57cec5SDimitry Andric (sequence "VSL%u", 0, 31))>; 3600b57cec5SDimitry Andric 361