xref: /aosp_15_r20/external/llvm/lib/Target/PowerPC/PPCCallingConv.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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