xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsCallingConv.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- MipsCallingConv.td - Calling Conventions for Mips --*- 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// This describes the calling conventions for Mips architecture.
10*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker/// CCIfSubtarget - Match if the current subtarget has a feature F.
13*9880d681SAndroid Build Coastguard Workerclass CCIfSubtarget<string F, CCAction A, string Invert = "">
14*9880d681SAndroid Build Coastguard Worker    : CCIf<!strconcat(Invert,
15*9880d681SAndroid Build Coastguard Worker                      "static_cast<const MipsSubtarget&>"
16*9880d681SAndroid Build Coastguard Worker			"(State.getMachineFunction().getSubtarget()).",
17*9880d681SAndroid Build Coastguard Worker                      F),
18*9880d681SAndroid Build Coastguard Worker           A>;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker// The inverse of CCIfSubtarget
21*9880d681SAndroid Build Coastguard Workerclass CCIfSubtargetNot<string F, CCAction A> : CCIfSubtarget<F, A, "!">;
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker/// Match if the original argument (before lowering) was a float.
24*9880d681SAndroid Build Coastguard Worker/// For example, this is true for i32's that were lowered from soft-float.
25*9880d681SAndroid Build Coastguard Workerclass CCIfOrigArgWasNotFloat<CCAction A>
26*9880d681SAndroid Build Coastguard Worker    : CCIf<"!static_cast<MipsCCState *>(&State)->WasOriginalArgFloat(ValNo)",
27*9880d681SAndroid Build Coastguard Worker           A>;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker/// Match if the original argument (before lowering) was a 128-bit float (i.e.
30*9880d681SAndroid Build Coastguard Worker/// long double).
31*9880d681SAndroid Build Coastguard Workerclass CCIfOrigArgWasF128<CCAction A>
32*9880d681SAndroid Build Coastguard Worker    : CCIf<"static_cast<MipsCCState *>(&State)->WasOriginalArgF128(ValNo)", A>;
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker/// Match if this specific argument is a vararg.
35*9880d681SAndroid Build Coastguard Worker/// This is slightly different fro CCIfIsVarArg which matches if any argument is
36*9880d681SAndroid Build Coastguard Worker/// a vararg.
37*9880d681SAndroid Build Coastguard Workerclass CCIfArgIsVarArg<CCAction A>
38*9880d681SAndroid Build Coastguard Worker    : CCIf<"!static_cast<MipsCCState *>(&State)->IsCallOperandFixed(ValNo)", A>;
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker/// Match if the special calling conv is the specified value.
42*9880d681SAndroid Build Coastguard Workerclass CCIfSpecialCallingConv<string CC, CCAction A>
43*9880d681SAndroid Build Coastguard Worker    : CCIf<"static_cast<MipsCCState *>(&State)->getSpecialCallingConv() == "
44*9880d681SAndroid Build Coastguard Worker               "MipsCCState::" # CC, A>;
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker// For soft-float, f128 values are returned in A0_64 rather than V1_64.
47*9880d681SAndroid Build Coastguard Workerdef RetCC_F128SoftFloat : CallingConv<[
48*9880d681SAndroid Build Coastguard Worker  CCAssignToReg<[V0_64, A0_64]>
49*9880d681SAndroid Build Coastguard Worker]>;
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker// For hard-float, f128 values are returned as a pair of f64's rather than a
52*9880d681SAndroid Build Coastguard Worker// pair of i64's.
53*9880d681SAndroid Build Coastguard Workerdef RetCC_F128HardFloat : CallingConv<[
54*9880d681SAndroid Build Coastguard Worker  CCBitConvertToType<f64>,
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  // Contrary to the ABI documentation, a struct containing a long double is
57*9880d681SAndroid Build Coastguard Worker  // returned in $f0, and $f1 instead of the usual $f0, and $f2. This is to
58*9880d681SAndroid Build Coastguard Worker  // match the de facto ABI as implemented by GCC.
59*9880d681SAndroid Build Coastguard Worker  CCIfInReg<CCAssignToReg<[D0_64, D1_64]>>,
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  CCAssignToReg<[D0_64, D2_64]>
62*9880d681SAndroid Build Coastguard Worker]>;
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker// Handle F128 specially since we can't identify the original type during the
65*9880d681SAndroid Build Coastguard Worker// tablegen-erated code.
66*9880d681SAndroid Build Coastguard Workerdef RetCC_F128 : CallingConv<[
67*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"useSoftFloat()",
68*9880d681SAndroid Build Coastguard Worker      CCIfType<[i64], CCDelegateTo<RetCC_F128SoftFloat>>>,
69*9880d681SAndroid Build Coastguard Worker  CCIfSubtargetNot<"useSoftFloat()",
70*9880d681SAndroid Build Coastguard Worker      CCIfType<[i64], CCDelegateTo<RetCC_F128HardFloat>>>
71*9880d681SAndroid Build Coastguard Worker]>;
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
74*9880d681SAndroid Build Coastguard Worker// Mips O32 Calling Convention
75*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdef CC_MipsO32 : CallingConv<[
78*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16 arguments to i32.
79*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker  // Integer values get stored in stack slots that are 4 bytes in
82*9880d681SAndroid Build Coastguard Worker  // size and 4-byte aligned.
83*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  // Integer values get stored in stack slots that are 8 bytes in
86*9880d681SAndroid Build Coastguard Worker  // size and 8-byte aligned.
87*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToStack<8, 8>>
88*9880d681SAndroid Build Coastguard Worker]>;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker// Only the return rules are defined here for O32. The rules for argument
91*9880d681SAndroid Build Coastguard Worker// passing are defined in MipsISelLowering.cpp.
92*9880d681SAndroid Build Coastguard Workerdef RetCC_MipsO32 : CallingConv<[
93*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 return values to i32.
94*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker  // i32 are returned in registers V0, V1, A0, A1
97*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[V0, V1, A0, A1]>>,
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker  // f32 are returned in registers F0, F2
100*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[F0, F2]>>,
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker  // f64 arguments are returned in D0_64 and D2_64 in FP64bit mode or
103*9880d681SAndroid Build Coastguard Worker  // in D0 and D1 in FP32bit mode.
104*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtarget<"isFP64bit()", CCAssignToReg<[D0_64, D2_64]>>>,
105*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtargetNot<"isFP64bit()", CCAssignToReg<[D0, D1]>>>
106*9880d681SAndroid Build Coastguard Worker]>;
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdef CC_MipsO32_FP32 : CustomCallingConv;
109*9880d681SAndroid Build Coastguard Workerdef CC_MipsO32_FP64 : CustomCallingConv;
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdef CC_MipsO32_FP : CallingConv<[
112*9880d681SAndroid Build Coastguard Worker  CCIfSubtargetNot<"isFP64bit()", CCDelegateTo<CC_MipsO32_FP32>>,
113*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isFP64bit()", CCDelegateTo<CC_MipsO32_FP64>>
114*9880d681SAndroid Build Coastguard Worker]>;
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
117*9880d681SAndroid Build Coastguard Worker// Mips N32/64 Calling Convention
118*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdef CC_MipsN_SoftFloat : CallingConv<[
121*9880d681SAndroid Build Coastguard Worker  CCAssignToRegWithShadow<[A0, A1, A2, A3,
122*9880d681SAndroid Build Coastguard Worker                           T0, T1, T2, T3],
123*9880d681SAndroid Build Coastguard Worker                          [D12_64, D13_64, D14_64, D15_64,
124*9880d681SAndroid Build Coastguard Worker                           D16_64, D17_64, D18_64, D19_64]>,
125*9880d681SAndroid Build Coastguard Worker  CCAssignToStack<4, 8>
126*9880d681SAndroid Build Coastguard Worker]>;
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdef CC_MipsN : CallingConv<[
129*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32, i64],
130*9880d681SAndroid Build Coastguard Worker      CCIfSubtargetNot<"isLittle()",
131*9880d681SAndroid Build Coastguard Worker          CCIfInReg<CCPromoteToUpperBitsInType<i64>>>>,
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker  // All integers (except soft-float integers) are promoted to 64-bit.
134*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCIfOrigArgWasNotFloat<CCPromoteToType<i64>>>,
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker  // The only i32's we have left are soft-float arguments.
137*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"useSoftFloat()", CCIfType<[i32], CCDelegateTo<CC_MipsN_SoftFloat>>>,
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker  // Integer arguments are passed in integer registers.
140*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[A0_64, A1_64, A2_64, A3_64,
141*9880d681SAndroid Build Coastguard Worker                                           T0_64, T1_64, T2_64, T3_64],
142*9880d681SAndroid Build Coastguard Worker                                          [D12_64, D13_64, D14_64, D15_64,
143*9880d681SAndroid Build Coastguard Worker                                           D16_64, D17_64, D18_64, D19_64]>>,
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker  // f32 arguments are passed in single precision FP registers.
146*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToRegWithShadow<[F12, F13, F14, F15,
147*9880d681SAndroid Build Coastguard Worker                                           F16, F17, F18, F19],
148*9880d681SAndroid Build Coastguard Worker                                          [A0_64, A1_64, A2_64, A3_64,
149*9880d681SAndroid Build Coastguard Worker                                           T0_64, T1_64, T2_64, T3_64]>>,
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker  // f64 arguments are passed in double precision FP registers.
152*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToRegWithShadow<[D12_64, D13_64, D14_64, D15_64,
153*9880d681SAndroid Build Coastguard Worker                                           D16_64, D17_64, D18_64, D19_64],
154*9880d681SAndroid Build Coastguard Worker                                          [A0_64, A1_64, A2_64, A3_64,
155*9880d681SAndroid Build Coastguard Worker                                           T0_64, T1_64, T2_64, T3_64]>>,
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker  // All stack parameter slots become 64-bit doublewords and are 8-byte aligned.
158*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToStack<4, 8>>,
159*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToStack<8, 8>>
160*9880d681SAndroid Build Coastguard Worker]>;
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker// N32/64 variable arguments.
163*9880d681SAndroid Build Coastguard Worker// All arguments are passed in integer registers.
164*9880d681SAndroid Build Coastguard Workerdef CC_MipsN_VarArg : CallingConv<[
165*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32, i64],
166*9880d681SAndroid Build Coastguard Worker      CCIfSubtargetNot<"isLittle()",
167*9880d681SAndroid Build Coastguard Worker          CCIfInReg<CCPromoteToUpperBitsInType<i64>>>>,
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker  // All integers are promoted to 64-bit.
170*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[A0, A1, A2, A3, T0, T1, T2, T3]>>,
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToReg<[A0_64, A1_64, A2_64, A3_64,
175*9880d681SAndroid Build Coastguard Worker                                      T0_64, T1_64, T2_64, T3_64]>>,
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker  // All stack parameter slots become 64-bit doublewords and are 8-byte aligned.
178*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToStack<4, 8>>,
179*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToStack<8, 8>>
180*9880d681SAndroid Build Coastguard Worker]>;
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerdef RetCC_MipsN : CallingConv<[
183*9880d681SAndroid Build Coastguard Worker  // f128 needs to be handled similarly to f32 and f64. However, f128 is not
184*9880d681SAndroid Build Coastguard Worker  // legal and is lowered to i128 which is further lowered to a pair of i64's.
185*9880d681SAndroid Build Coastguard Worker  // This presents us with a problem for the calling convention since hard-float
186*9880d681SAndroid Build Coastguard Worker  // still needs to pass them in FPU registers, and soft-float needs to use $v0,
187*9880d681SAndroid Build Coastguard Worker  // and $a0 instead of the usual $v0, and $v1. We therefore resort to a
188*9880d681SAndroid Build Coastguard Worker  // pre-analyze (see PreAnalyzeReturnForF128()) step to pass information on
189*9880d681SAndroid Build Coastguard Worker  // whether the result was originally an f128 into the tablegen-erated code.
190*9880d681SAndroid Build Coastguard Worker  //
191*9880d681SAndroid Build Coastguard Worker  // f128 should only occur for the N64 ABI where long double is 128-bit. On
192*9880d681SAndroid Build Coastguard Worker  // N32, long double is equivalent to double.
193*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfOrigArgWasF128<CCDelegateTo<RetCC_F128>>>,
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker  // Aggregate returns are positioned at the lowest address in the slot for
196*9880d681SAndroid Build Coastguard Worker  // both little and big-endian targets. When passing in registers, this
197*9880d681SAndroid Build Coastguard Worker  // requires that big-endian targets shift the value into the upper bits.
198*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isLittle()",
199*9880d681SAndroid Build Coastguard Worker      CCIfType<[i8, i16, i32, i64], CCIfInReg<CCPromoteToType<i64>>>>,
200*9880d681SAndroid Build Coastguard Worker  CCIfSubtargetNot<"isLittle()",
201*9880d681SAndroid Build Coastguard Worker      CCIfType<[i8, i16, i32, i64],
202*9880d681SAndroid Build Coastguard Worker          CCIfInReg<CCPromoteToUpperBitsInType<i64>>>>,
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker  // i64 are returned in registers V0_64, V1_64
205*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[V0_64, V1_64]>>,
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker  // f32 are returned in registers F0, F2
208*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[F0, F2]>>,
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker  // f64 are returned in registers D0, D2
211*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToReg<[D0_64, D2_64]>>
212*9880d681SAndroid Build Coastguard Worker]>;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
215*9880d681SAndroid Build Coastguard Worker// Mips FastCC Calling Convention
216*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
217*9880d681SAndroid Build Coastguard Workerdef CC_MipsO32_FastCC : CallingConv<[
218*9880d681SAndroid Build Coastguard Worker  // f64 arguments are passed in double-precision floating pointer registers.
219*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtargetNot<"isFP64bit()",
220*9880d681SAndroid Build Coastguard Worker                                   CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6,
221*9880d681SAndroid Build Coastguard Worker                                                  D7, D8, D9]>>>,
222*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtarget<"isFP64bit()", CCIfSubtarget<"useOddSPReg()",
223*9880d681SAndroid Build Coastguard Worker                                CCAssignToReg<[D0_64, D1_64, D2_64, D3_64,
224*9880d681SAndroid Build Coastguard Worker                                               D4_64, D5_64, D6_64, D7_64,
225*9880d681SAndroid Build Coastguard Worker                                               D8_64, D9_64, D10_64, D11_64,
226*9880d681SAndroid Build Coastguard Worker                                               D12_64, D13_64, D14_64, D15_64,
227*9880d681SAndroid Build Coastguard Worker                                               D16_64, D17_64, D18_64,
228*9880d681SAndroid Build Coastguard Worker                                               D19_64]>>>>,
229*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtarget<"isFP64bit()", CCIfSubtarget<"noOddSPReg()",
230*9880d681SAndroid Build Coastguard Worker                                CCAssignToReg<[D0_64, D2_64, D4_64, D6_64,
231*9880d681SAndroid Build Coastguard Worker                                               D8_64, D10_64, D12_64, D14_64,
232*9880d681SAndroid Build Coastguard Worker                                               D16_64, D18_64]>>>>,
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker  // Stack parameter slots for f64 are 64-bit doublewords and 8-byte aligned.
235*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToStack<8, 8>>
236*9880d681SAndroid Build Coastguard Worker]>;
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerdef CC_MipsN_FastCC : CallingConv<[
239*9880d681SAndroid Build Coastguard Worker  // Integer arguments are passed in integer registers.
240*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[A0_64, A1_64, A2_64, A3_64, T0_64, T1_64,
241*9880d681SAndroid Build Coastguard Worker                                 T2_64, T3_64, T4_64, T5_64, T6_64, T7_64,
242*9880d681SAndroid Build Coastguard Worker                                 T8_64, V1_64]>>,
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker  // f64 arguments are passed in double-precision floating pointer registers.
245*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToReg<[D0_64, D1_64, D2_64, D3_64, D4_64, D5_64,
246*9880d681SAndroid Build Coastguard Worker                                 D6_64, D7_64, D8_64, D9_64, D10_64, D11_64,
247*9880d681SAndroid Build Coastguard Worker                                 D12_64, D13_64, D14_64, D15_64, D16_64, D17_64,
248*9880d681SAndroid Build Coastguard Worker                                 D18_64, D19_64]>>,
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker  // Stack parameter slots for i64 and f64 are 64-bit doublewords and
251*9880d681SAndroid Build Coastguard Worker  // 8-byte aligned.
252*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToStack<8, 8>>
253*9880d681SAndroid Build Coastguard Worker]>;
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerdef CC_Mips_FastCC : CallingConv<[
256*9880d681SAndroid Build Coastguard Worker  // Handles byval parameters.
257*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<4, 4>>,
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16 arguments to i32.
260*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16], CCPromoteToType<i32>>,
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker  // Integer arguments are passed in integer registers. All scratch registers,
263*9880d681SAndroid Build Coastguard Worker  // except for AT, V0 and T9, are available to be used as argument registers.
264*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCIfSubtargetNot<"isTargetNaCl()",
265*9880d681SAndroid Build Coastguard Worker      CCAssignToReg<[A0, A1, A2, A3, T0, T1, T2, T3, T4, T5, T6, T7, T8, V1]>>>,
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker  // In NaCl, T6, T7 and T8 are reserved and not available as argument
268*9880d681SAndroid Build Coastguard Worker  // registers for fastcc.  T6 contains the mask for sandboxing control flow
269*9880d681SAndroid Build Coastguard Worker  // (indirect jumps and calls).  T7 contains the mask for sandboxing memory
270*9880d681SAndroid Build Coastguard Worker  // accesses (loads and stores).  T8 contains the thread pointer.
271*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCIfSubtarget<"isTargetNaCl()",
272*9880d681SAndroid Build Coastguard Worker      CCAssignToReg<[A0, A1, A2, A3, T0, T1, T2, T3, T4, T5, V1]>>>,
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker  // f32 arguments are passed in single-precision floating pointer registers.
275*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCIfSubtarget<"useOddSPReg()",
276*9880d681SAndroid Build Coastguard Worker      CCAssignToReg<[F0, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13,
277*9880d681SAndroid Build Coastguard Worker                     F14, F15, F16, F17, F18, F19]>>>,
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker  // Don't use odd numbered single-precision registers for -mno-odd-spreg.
280*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCIfSubtarget<"noOddSPReg()",
281*9880d681SAndroid Build Coastguard Worker      CCAssignToReg<[F0, F2, F4, F6, F8, F10, F12, F14, F16, F18]>>>,
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker  // Stack parameter slots for i32 and f32 are 32-bit words and 4-byte aligned.
284*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_O32()", CCDelegateTo<CC_MipsO32_FastCC>>,
287*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_MipsN_FastCC>
288*9880d681SAndroid Build Coastguard Worker]>;
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
291*9880d681SAndroid Build Coastguard Worker// Mips Calling Convention Dispatch
292*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Workerdef RetCC_Mips : CallingConv<[
295*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_N32()", CCDelegateTo<RetCC_MipsN>>,
296*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_N64()", CCDelegateTo<RetCC_MipsN>>,
297*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_MipsO32>
298*9880d681SAndroid Build Coastguard Worker]>;
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdef CC_Mips_ByVal : CallingConv<[
301*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_O32()", CCIfByVal<CCPassByVal<4, 4>>>,
302*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<8, 8>>
303*9880d681SAndroid Build Coastguard Worker]>;
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerdef CC_Mips16RetHelper : CallingConv<[
306*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker  // Integer arguments are passed in integer registers.
309*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[V0, V1, A0, A1]>>
310*9880d681SAndroid Build Coastguard Worker]>;
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Workerdef CC_Mips_FixedArg : CallingConv<[
313*9880d681SAndroid Build Coastguard Worker  // Mips16 needs special handling on some functions.
314*9880d681SAndroid Build Coastguard Worker  CCIf<"State.getCallingConv() != CallingConv::Fast",
315*9880d681SAndroid Build Coastguard Worker      CCIfSpecialCallingConv<"Mips16RetHelperConv",
316*9880d681SAndroid Build Coastguard Worker           CCDelegateTo<CC_Mips16RetHelper>>>,
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker  // f128 needs to be handled similarly to f32 and f64 on hard-float. However,
321*9880d681SAndroid Build Coastguard Worker  // f128 is not legal and is lowered to i128 which is further lowered to a pair
322*9880d681SAndroid Build Coastguard Worker  // of i64's.
323*9880d681SAndroid Build Coastguard Worker  // This presents us with a problem for the calling convention since hard-float
324*9880d681SAndroid Build Coastguard Worker  // still needs to pass them in FPU registers. We therefore resort to a
325*9880d681SAndroid Build Coastguard Worker  // pre-analyze (see PreAnalyzeFormalArgsForF128()) step to pass information on
326*9880d681SAndroid Build Coastguard Worker  // whether the argument was originally an f128 into the tablegen-erated code.
327*9880d681SAndroid Build Coastguard Worker  //
328*9880d681SAndroid Build Coastguard Worker  // f128 should only occur for the N64 ABI where long double is 128-bit. On
329*9880d681SAndroid Build Coastguard Worker  // N32, long double is equivalent to double.
330*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64],
331*9880d681SAndroid Build Coastguard Worker      CCIfSubtargetNot<"useSoftFloat()",
332*9880d681SAndroid Build Coastguard Worker          CCIfOrigArgWasF128<CCBitConvertToType<f64>>>>,
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Fast", CCDelegateTo<CC_Mips_FastCC>>,
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_O32()", CCDelegateTo<CC_MipsO32_FP>>,
337*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_MipsN>
338*9880d681SAndroid Build Coastguard Worker]>;
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdef CC_Mips_VarArg : CallingConv<[
341*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCDelegateTo<CC_Mips_ByVal>>,
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isABI_O32()", CCDelegateTo<CC_MipsO32_FP>>,
344*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_MipsN_VarArg>
345*9880d681SAndroid Build Coastguard Worker]>;
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerdef CC_Mips : CallingConv<[
348*9880d681SAndroid Build Coastguard Worker  CCIfVarArg<CCIfArgIsVarArg<CCDelegateTo<CC_Mips_VarArg>>>,
349*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_Mips_FixedArg>
350*9880d681SAndroid Build Coastguard Worker]>;
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
353*9880d681SAndroid Build Coastguard Worker// Callee-saved register lists.
354*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerdef CSR_SingleFloatOnly : CalleeSavedRegs<(add (sequence "F%u", 31, 20), RA, FP,
357*9880d681SAndroid Build Coastguard Worker                                               (sequence "S%u", 7, 0))>;
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Workerdef CSR_O32_FPXX : CalleeSavedRegs<(add (sequence "D%u", 15, 10), RA, FP,
360*9880d681SAndroid Build Coastguard Worker                                        (sequence "S%u", 7, 0))> {
361*9880d681SAndroid Build Coastguard Worker  let OtherPreserved = (add (decimate (sequence "F%u", 30, 20), 2));
362*9880d681SAndroid Build Coastguard Worker}
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Workerdef CSR_O32 : CalleeSavedRegs<(add (sequence "D%u", 15, 10), RA, FP,
365*9880d681SAndroid Build Coastguard Worker                                   (sequence "S%u", 7, 0))>;
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Workerdef CSR_O32_FP64 :
368*9880d681SAndroid Build Coastguard Worker  CalleeSavedRegs<(add (decimate (sequence "D%u_64", 30, 20), 2), RA, FP,
369*9880d681SAndroid Build Coastguard Worker                       (sequence "S%u", 7, 0))>;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerdef CSR_N32 : CalleeSavedRegs<(add D20_64, D22_64, D24_64, D26_64, D28_64,
372*9880d681SAndroid Build Coastguard Worker                                   D30_64, RA_64, FP_64, GP_64,
373*9880d681SAndroid Build Coastguard Worker                                   (sequence "S%u_64", 7, 0))>;
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdef CSR_N64 : CalleeSavedRegs<(add (sequence "D%u_64", 31, 24), RA_64, FP_64,
376*9880d681SAndroid Build Coastguard Worker                                   GP_64, (sequence "S%u_64", 7, 0))>;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdef CSR_Mips16RetHelper :
379*9880d681SAndroid Build Coastguard Worker  CalleeSavedRegs<(add V0, V1, FP,
380*9880d681SAndroid Build Coastguard Worker                   (sequence "A%u", 3, 0), (sequence "S%u", 7, 0),
381*9880d681SAndroid Build Coastguard Worker                   (sequence "D%u", 15, 10))>;
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerdef CSR_Interrupt_32R6 : CalleeSavedRegs<(add (sequence "A%u", 3, 0),
384*9880d681SAndroid Build Coastguard Worker                                              (sequence "S%u", 7, 0),
385*9880d681SAndroid Build Coastguard Worker                                              (sequence "V%u", 1, 0),
386*9880d681SAndroid Build Coastguard Worker                                              (sequence "T%u", 9, 0),
387*9880d681SAndroid Build Coastguard Worker                                              RA, FP, GP, AT)>;
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Workerdef CSR_Interrupt_32 : CalleeSavedRegs<(add (sequence "A%u", 3, 0),
390*9880d681SAndroid Build Coastguard Worker                                            (sequence "S%u", 7, 0),
391*9880d681SAndroid Build Coastguard Worker                                            (sequence "V%u", 1, 0),
392*9880d681SAndroid Build Coastguard Worker                                            (sequence "T%u", 9, 0),
393*9880d681SAndroid Build Coastguard Worker                                            RA, FP, GP, AT, LO0, HI0)>;
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdef CSR_Interrupt_64R6 : CalleeSavedRegs<(add (sequence "A%u_64", 3, 0),
396*9880d681SAndroid Build Coastguard Worker                                              (sequence "V%u_64", 1, 0),
397*9880d681SAndroid Build Coastguard Worker                                              (sequence "S%u_64", 7, 0),
398*9880d681SAndroid Build Coastguard Worker                                              (sequence "T%u_64", 9, 0),
399*9880d681SAndroid Build Coastguard Worker                                              RA_64, FP_64, GP_64, AT_64)>;
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Workerdef CSR_Interrupt_64 : CalleeSavedRegs<(add (sequence "A%u_64", 3, 0),
402*9880d681SAndroid Build Coastguard Worker                                            (sequence "S%u_64", 7, 0),
403*9880d681SAndroid Build Coastguard Worker                                            (sequence "T%u_64", 9, 0),
404*9880d681SAndroid Build Coastguard Worker                                            (sequence "V%u_64", 1, 0),
405*9880d681SAndroid Build Coastguard Worker                                            RA_64, FP_64, GP_64, AT_64,
406*9880d681SAndroid Build Coastguard Worker                                            LO0_64, HI0_64)>;
407