1*9880d681SAndroid Build Coastguard Worker//===- PPCCallingConv.td - Calling Conventions for PowerPC -*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This describes the calling conventions for the PowerPC 32- and 64-bit 11*9880d681SAndroid Build Coastguard Worker// architectures. 12*9880d681SAndroid Build Coastguard Worker// 13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker/// CCIfSubtarget - Match if the current subtarget has a feature F. 16*9880d681SAndroid Build Coastguard Workerclass CCIfSubtarget<string F, CCAction A> 17*9880d681SAndroid Build Coastguard Worker : CCIf<!strconcat("static_cast<const PPCSubtarget&>" 18*9880d681SAndroid Build Coastguard Worker "(State.getMachineFunction().getSubtarget()).", 19*9880d681SAndroid Build Coastguard Worker F), 20*9880d681SAndroid Build Coastguard Worker A>; 21*9880d681SAndroid Build Coastguard Workerclass CCIfNotSubtarget<string F, CCAction A> 22*9880d681SAndroid Build Coastguard Worker : CCIf<!strconcat("!static_cast<const PPCSubtarget&>" 23*9880d681SAndroid Build Coastguard Worker "(State.getMachineFunction().getSubtarget()).", 24*9880d681SAndroid Build Coastguard Worker F), 25*9880d681SAndroid Build Coastguard Worker A>; 26*9880d681SAndroid Build Coastguard Workerclass CCIfOrigArgWasNotPPCF128<CCAction A> 27*9880d681SAndroid Build Coastguard Worker : CCIf<"!static_cast<PPCCCState *>(&State)->WasOriginalArgPPCF128(ValNo)", 28*9880d681SAndroid Build Coastguard Worker A>; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 31*9880d681SAndroid Build Coastguard Worker// Return Value Calling Convention 32*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker// PPC64 AnyReg return-value convention. No explicit register is specified for 35*9880d681SAndroid Build Coastguard Worker// the return-value. The register allocator is allowed and expected to choose 36*9880d681SAndroid Build Coastguard Worker// any free register. 37*9880d681SAndroid Build Coastguard Worker// 38*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and 39*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug 40*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the PPC C calling convention. 41*9880d681SAndroid Build Coastguard Workerdef RetCC_PPC64_AnyReg : CallingConv<[ 42*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_PPC_AnyReg_Error"> 43*9880d681SAndroid Build Coastguard Worker]>; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker// Return-value convention for PowerPC 46*9880d681SAndroid Build Coastguard Workerdef RetCC_PPC : CallingConv<[ 47*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>, 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker // On PPC64, integer return values are always promoted to i64 50*9880d681SAndroid Build Coastguard Worker CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>, 51*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>, 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>, 54*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>, 55*9880d681SAndroid Build Coastguard Worker CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>, 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker // Floating point types returned as "direct" go into F1 .. F8; note that 58*9880d681SAndroid Build Coastguard Worker // only the ELFv2 ABI fully utilizes all these registers. 59*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, 60*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker // QPX vectors are returned in QF1 and QF2. 63*9880d681SAndroid Build Coastguard Worker CCIfType<[v4f64, v4f32, v4i1], 64*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>, 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker // Vector types returned as "direct" go into V2 .. V9; note that only the 67*9880d681SAndroid Build Coastguard Worker // ELFv2 ABI fully utilizes all these registers. 68*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32], 69*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasAltivec()", 70*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>, 71*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()", 72*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9]>>> 73*9880d681SAndroid Build Coastguard Worker]>; 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker// No explicit register is specified for the AnyReg calling convention. The 76*9880d681SAndroid Build Coastguard Worker// register allocator may assign the arguments to any free register. 77*9880d681SAndroid Build Coastguard Worker// 78*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and 79*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug 80*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the PPC C calling convention. 81*9880d681SAndroid Build Coastguard Workerdef CC_PPC64_AnyReg : CallingConv<[ 82*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_PPC_AnyReg_Error"> 83*9880d681SAndroid Build Coastguard Worker]>; 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker// Note that we don't currently have calling conventions for 64-bit 86*9880d681SAndroid Build Coastguard Worker// PowerPC, but handle all the complexities of the ABI in the lowering 87*9880d681SAndroid Build Coastguard Worker// logic. FIXME: See if the logic can be simplified with use of CCs. 88*9880d681SAndroid Build Coastguard Worker// This may require some extensions to current table generation. 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker// Simple calling convention for 64-bit ELF PowerPC fast isel. 91*9880d681SAndroid Build Coastguard Worker// Only handle ints and floats. All ints are promoted to i64. 92*9880d681SAndroid Build Coastguard Worker// Vector types and quadword ints are not handled. 93*9880d681SAndroid Build Coastguard Workerdef CC_PPC64_ELF_FIS : CallingConv<[ 94*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>, 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCPromoteToType<i64>>, 97*9880d681SAndroid Build Coastguard Worker CCIfType<[i8], CCPromoteToType<i64>>, 98*9880d681SAndroid Build Coastguard Worker CCIfType<[i16], CCPromoteToType<i64>>, 99*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCPromoteToType<i64>>, 100*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>, 101*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>> 102*9880d681SAndroid Build Coastguard Worker]>; 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker// Simple return-value convention for 64-bit ELF PowerPC fast isel. 105*9880d681SAndroid Build Coastguard Worker// All small ints are promoted to i64. Vector types, quadword ints, 106*9880d681SAndroid Build Coastguard Worker// and multiple register returns are "supported" to avoid compile 107*9880d681SAndroid Build Coastguard Worker// errors, but none are handled by the fast selector. 108*9880d681SAndroid Build Coastguard Workerdef RetCC_PPC64_ELF_FIS : CallingConv<[ 109*9880d681SAndroid Build Coastguard Worker CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>, 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCPromoteToType<i64>>, 112*9880d681SAndroid Build Coastguard Worker CCIfType<[i8], CCPromoteToType<i64>>, 113*9880d681SAndroid Build Coastguard Worker CCIfType<[i16], CCPromoteToType<i64>>, 114*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCPromoteToType<i64>>, 115*9880d681SAndroid Build Coastguard Worker CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>, 116*9880d681SAndroid Build Coastguard Worker CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>, 117*9880d681SAndroid Build Coastguard Worker CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, 118*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, 119*9880d681SAndroid Build Coastguard Worker CCIfType<[v4f64, v4f32, v4i1], 120*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>, 121*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32], 122*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasAltivec()", 123*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>, 124*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()", 125*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9]>>> 126*9880d681SAndroid Build Coastguard Worker]>; 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 129*9880d681SAndroid Build Coastguard Worker// PowerPC System V Release 4 32-bit ABI 130*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdef CC_PPC32_SVR4_Common : CallingConv<[ 133*9880d681SAndroid Build Coastguard Worker CCIfType<[i1], CCPromoteToType<i32>>, 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker // The ABI requires i64 to be passed in two adjacent registers with the first 136*9880d681SAndroid Build Coastguard Worker // register having an odd register number. 137*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], 138*9880d681SAndroid Build Coastguard Worker CCIfSplit<CCIfSubtarget<"useSoftFloat()", 139*9880d681SAndroid Build Coastguard Worker CCIfOrigArgWasNotPPCF128< 140*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>>, 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], 143*9880d681SAndroid Build Coastguard Worker CCIfSplit<CCIfNotSubtarget<"useSoftFloat()", 144*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>>, 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker // The 'nest' parameter, if any, is passed in R11. 147*9880d681SAndroid Build Coastguard Worker CCIfNest<CCAssignToReg<[R11]>>, 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker // The first 8 integer arguments are passed in integer registers. 150*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>, 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker // Make sure the i64 words from a long double are either both passed in 153*9880d681SAndroid Build Coastguard Worker // registers or both passed on the stack. 154*9880d681SAndroid Build Coastguard Worker CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>, 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker // FP values are passed in F1 - F8. 157*9880d681SAndroid Build Coastguard Worker CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>, 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker // Split arguments have an alignment of 8 bytes on the stack. 160*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>, 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker CCIfType<[i32], CCAssignToStack<4, 4>>, 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker // Floats are stored in double precision format, thus they have the same 165*9880d681SAndroid Build Coastguard Worker // alignment and size as doubles. 166*9880d681SAndroid Build Coastguard Worker CCIfType<[f32,f64], CCAssignToStack<8, 8>>, 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker // QPX vectors that are stored in double precision need 32-byte alignment. 169*9880d681SAndroid Build Coastguard Worker CCIfType<[v4f64, v4i1], CCAssignToStack<32, 32>>, 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker // Vectors get 16-byte stack slots that are 16-byte aligned. 172*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>> 173*9880d681SAndroid Build Coastguard Worker]>; 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker// This calling convention puts vector arguments always on the stack. It is used 176*9880d681SAndroid Build Coastguard Worker// to assign vector arguments which belong to the variable portion of the 177*9880d681SAndroid Build Coastguard Worker// parameter list of a variable argument function. 178*9880d681SAndroid Build Coastguard Workerdef CC_PPC32_SVR4_VarArg : CallingConv<[ 179*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_PPC32_SVR4_Common> 180*9880d681SAndroid Build Coastguard Worker]>; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to 183*9880d681SAndroid Build Coastguard Worker// put vector arguments in vector registers before putting them on the stack. 184*9880d681SAndroid Build Coastguard Workerdef CC_PPC32_SVR4 : CallingConv<[ 185*9880d681SAndroid Build Coastguard Worker // QPX vectors mirror the scalar FP convention. 186*9880d681SAndroid Build Coastguard Worker CCIfType<[v4f64, v4f32, v4i1], CCIfSubtarget<"hasQPX()", 187*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[QF1, QF2, QF3, QF4, QF5, QF6, QF7, QF8]>>>, 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker // The first 12 Vector arguments are passed in AltiVec registers. 190*9880d681SAndroid Build Coastguard Worker CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32], 191*9880d681SAndroid Build Coastguard Worker CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7, 192*9880d681SAndroid Build Coastguard Worker V8, V9, V10, V11, V12, V13]>>>, 193*9880d681SAndroid Build Coastguard Worker CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()", 194*9880d681SAndroid Build Coastguard Worker CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9, 195*9880d681SAndroid Build Coastguard Worker VSH10, VSH11, VSH12, VSH13]>>>, 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker CCDelegateTo<CC_PPC32_SVR4_Common> 198*9880d681SAndroid Build Coastguard Worker]>; 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker// Helper "calling convention" to handle aggregate by value arguments. 201*9880d681SAndroid Build Coastguard Worker// Aggregate by value arguments are always placed in the local variable space 202*9880d681SAndroid Build Coastguard Worker// of the caller. This calling convention is only used to assign those stack 203*9880d681SAndroid Build Coastguard Worker// offsets in the callers stack frame. 204*9880d681SAndroid Build Coastguard Worker// 205*9880d681SAndroid Build Coastguard Worker// Still, the address of the aggregate copy in the callers stack frame is passed 206*9880d681SAndroid Build Coastguard Worker// in a GPR (or in the parameter list area if all GPRs are allocated) from the 207*9880d681SAndroid Build Coastguard Worker// caller to the callee. The location for the address argument is assigned by 208*9880d681SAndroid Build Coastguard Worker// the CC_PPC32_SVR4 calling convention. 209*9880d681SAndroid Build Coastguard Worker// 210*9880d681SAndroid Build Coastguard Worker// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are 211*9880d681SAndroid Build Coastguard Worker// not passed by value. 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdef CC_PPC32_SVR4_ByVal : CallingConv<[ 214*9880d681SAndroid Build Coastguard Worker CCIfByVal<CCPassByVal<4, 4>>, 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker CCCustom<"CC_PPC32_SVR4_Custom_Dummy"> 217*9880d681SAndroid Build Coastguard Worker]>; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdef CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27, 220*9880d681SAndroid Build Coastguard Worker V28, V29, V30, V31)>; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdef CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20, 223*9880d681SAndroid Build Coastguard Worker R21, R22, R23, R24, R25, R26, R27, R28, 224*9880d681SAndroid Build Coastguard Worker R29, R30, R31, F14, F15, F16, F17, F18, 225*9880d681SAndroid Build Coastguard Worker F19, F20, F21, F22, F23, F24, F25, F26, 226*9880d681SAndroid Build Coastguard Worker F27, F28, F29, F30, F31, CR2, CR3, CR4 227*9880d681SAndroid Build Coastguard Worker )>; 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdef CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdef CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20, 232*9880d681SAndroid Build Coastguard Worker R21, R22, R23, R24, R25, R26, R27, R28, 233*9880d681SAndroid Build Coastguard Worker R29, R30, R31, F14, F15, F16, F17, F18, 234*9880d681SAndroid Build Coastguard Worker F19, F20, F21, F22, F23, F24, F25, F26, 235*9880d681SAndroid Build Coastguard Worker F27, F28, F29, F30, F31, CR2, CR3, CR4 236*9880d681SAndroid Build Coastguard Worker )>; 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdef CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>; 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerdef CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20, 241*9880d681SAndroid Build Coastguard Worker X21, X22, X23, X24, X25, X26, X27, X28, 242*9880d681SAndroid Build Coastguard Worker X29, X30, X31, F14, F15, F16, F17, F18, 243*9880d681SAndroid Build Coastguard Worker F19, F20, F21, F22, F23, F24, F25, F26, 244*9880d681SAndroid Build Coastguard Worker F27, F28, F29, F30, F31, CR2, CR3, CR4 245*9880d681SAndroid Build Coastguard Worker )>; 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdef CSR_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20, 250*9880d681SAndroid Build Coastguard Worker X21, X22, X23, X24, X25, X26, X27, X28, 251*9880d681SAndroid Build Coastguard Worker X29, X30, X31, F14, F15, F16, F17, F18, 252*9880d681SAndroid Build Coastguard Worker F19, F20, F21, F22, F23, F24, F25, F26, 253*9880d681SAndroid Build Coastguard Worker F27, F28, F29, F30, F31, CR2, CR3, CR4 254*9880d681SAndroid Build Coastguard Worker )>; 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue. 257*9880d681SAndroid Build Coastguard Workerdef CSR_SRV464_TLS_PE : CalleeSavedRegs<(add)>; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_ViaCopy : CalleeSavedRegs<(add CSR_SVR464)>; 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>; 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_Altivec)>; 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_R2 : CalleeSavedRegs<(add CSR_SVR464, X2)>; 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_R2_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2)>; 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_R2_Altivec : CalleeSavedRegs<(add CSR_SVR464_Altivec, X2)>; 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdef CSR_SVR464_R2_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2_Altivec)>; 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerdef CSR_NoRegs : CalleeSavedRegs<(add)>; 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10), 276*9880d681SAndroid Build Coastguard Worker (sequence "X%u", 14, 31), 277*9880d681SAndroid Build Coastguard Worker (sequence "F%u", 0, 31), 278*9880d681SAndroid Build Coastguard Worker (sequence "CR%u", 0, 7))>; 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs, 281*9880d681SAndroid Build Coastguard Worker (sequence "V%u", 0, 31))>; 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec, 284*9880d681SAndroid Build Coastguard Worker (sequence "VSL%u", 0, 31), 285*9880d681SAndroid Build Coastguard Worker (sequence "VSH%u", 0, 31))>; 286*9880d681SAndroid Build Coastguard Worker 287