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