xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86CallingConv.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- X86CallingConv.td - Calling Conventions X86 32/64 --*- 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 X86-32 and X86-64
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 X86Subtarget&>"
18*9880d681SAndroid Build Coastguard Worker                       "(State.getMachineFunction().getSubtarget()).", F),
19*9880d681SAndroid Build Coastguard Worker           A>;
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
22*9880d681SAndroid Build Coastguard Worker// Return Value Calling Conventions
23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker// Return-value conventions common to all X86 CC's.
26*9880d681SAndroid Build Coastguard Workerdef RetCC_X86Common : CallingConv<[
27*9880d681SAndroid Build Coastguard Worker  // Scalar values are returned in AX first, then DX.  For i8, the ABI
28*9880d681SAndroid Build Coastguard Worker  // requires the values to be in AL and AH, however this code uses AL and DL
29*9880d681SAndroid Build Coastguard Worker  // instead. This is because using AH for the second register conflicts with
30*9880d681SAndroid Build Coastguard Worker  // the way LLVM does multiple return values -- a return of {i16,i8} would end
31*9880d681SAndroid Build Coastguard Worker  // up in AX and AH, which overlap. Front-ends wishing to conform to the ABI
32*9880d681SAndroid Build Coastguard Worker  // for functions that return two i8 values are currently expected to pack the
33*9880d681SAndroid Build Coastguard Worker  // values into an i16 (which uses AX, and thus AL:AH).
34*9880d681SAndroid Build Coastguard Worker  //
35*9880d681SAndroid Build Coastguard Worker  // For code that doesn't care about the ABI, we allow returning more than two
36*9880d681SAndroid Build Coastguard Worker  // integer values in registers.
37*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1],  CCPromoteToType<i8>>,
38*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8] , CCAssignToReg<[AL, DL, CL]>>,
39*9880d681SAndroid Build Coastguard Worker  CCIfType<[i16], CCAssignToReg<[AX, DX, CX]>>,
40*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>,
41*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RAX, RDX, RCX]>>,
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  // Boolean vectors of AVX-512 are returned in SIMD registers.
44*9880d681SAndroid Build Coastguard Worker  // The call from AVX to AVX-512 function should work,
45*9880d681SAndroid Build Coastguard Worker  // since the boolean types in AVX/AVX2 are promoted by default.
46*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i1],  CCPromoteToType<v2i64>>,
47*9880d681SAndroid Build Coastguard Worker  CCIfType<[v4i1],  CCPromoteToType<v4i32>>,
48*9880d681SAndroid Build Coastguard Worker  CCIfType<[v8i1],  CCPromoteToType<v8i16>>,
49*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i1], CCPromoteToType<v16i8>>,
50*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i1], CCPromoteToType<v32i8>>,
51*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i1], CCPromoteToType<v64i8>>,
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  // Vector types are returned in XMM0 and XMM1, when they fit.  XMM2 and XMM3
54*9880d681SAndroid Build Coastguard Worker  // can only be used by ABI non-compliant code. If the target doesn't have XMM
55*9880d681SAndroid Build Coastguard Worker  // registers, it won't have vector types.
56*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
57*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>,
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  // 256-bit vectors are returned in YMM0 and XMM1, when they fit. YMM2 and YMM3
60*9880d681SAndroid Build Coastguard Worker  // can only be used by ABI non-compliant code. This vector type is only
61*9880d681SAndroid Build Coastguard Worker  // supported while using the AVX target feature.
62*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
63*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>,
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  // 512-bit vectors are returned in ZMM0 and ZMM1, when they fit. ZMM2 and ZMM3
66*9880d681SAndroid Build Coastguard Worker  // can only be used by ABI non-compliant code. This vector type is only
67*9880d681SAndroid Build Coastguard Worker  // supported while using the AVX-512 target feature.
68*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
69*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>,
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker  // MMX vector types are always returned in MM0. If the target doesn't have
72*9880d681SAndroid Build Coastguard Worker  // MM0, it doesn't support these vector types.
73*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCAssignToReg<[MM0]>>,
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker  // Long double types are always returned in FP0 (even with SSE).
76*9880d681SAndroid Build Coastguard Worker  CCIfType<[f80], CCAssignToReg<[FP0, FP1]>>
77*9880d681SAndroid Build Coastguard Worker]>;
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker// X86-32 C return-value convention.
80*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_C : CallingConv<[
81*9880d681SAndroid Build Coastguard Worker  // The X86-32 calling convention returns FP values in FP0, unless marked
82*9880d681SAndroid Build Coastguard Worker  // with "inreg" (used here to distinguish one kind of reg from another,
83*9880d681SAndroid Build Coastguard Worker  // weirdly; this is really the sse-regparm calling convention) in which
84*9880d681SAndroid Build Coastguard Worker  // case they use XMM0, otherwise it is the same as the common X86 calling
85*9880d681SAndroid Build Coastguard Worker  // conv.
86*9880d681SAndroid Build Coastguard Worker  CCIfInReg<CCIfSubtarget<"hasSSE2()",
87*9880d681SAndroid Build Coastguard Worker    CCIfType<[f32, f64], CCAssignToReg<[XMM0,XMM1,XMM2]>>>>,
88*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32,f64], CCAssignToReg<[FP0, FP1]>>,
89*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
90*9880d681SAndroid Build Coastguard Worker]>;
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker// X86-32 FastCC return-value convention.
93*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_Fast : CallingConv<[
94*9880d681SAndroid Build Coastguard Worker  // The X86-32 fastcc returns 1, 2, or 3 FP values in XMM0-2 if the target has
95*9880d681SAndroid Build Coastguard Worker  // SSE2.
96*9880d681SAndroid Build Coastguard Worker  // This can happen when a float, 2 x float, or 3 x float vector is split by
97*9880d681SAndroid Build Coastguard Worker  // target lowering, and is returned in 1-3 sse regs.
98*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCIfSubtarget<"hasSSE2()", CCAssignToReg<[XMM0,XMM1,XMM2]>>>,
99*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCIfSubtarget<"hasSSE2()", CCAssignToReg<[XMM0,XMM1,XMM2]>>>,
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker  // For integers, ECX can be used as an extra return register
102*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8],  CCAssignToReg<[AL, DL, CL]>>,
103*9880d681SAndroid Build Coastguard Worker  CCIfType<[i16], CCAssignToReg<[AX, DX, CX]>>,
104*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>,
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker  // Otherwise, it is the same as the common X86 calling convention.
107*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
108*9880d681SAndroid Build Coastguard Worker]>;
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker// Intel_OCL_BI return-value convention.
111*9880d681SAndroid Build Coastguard Workerdef RetCC_Intel_OCL_BI : CallingConv<[
112*9880d681SAndroid Build Coastguard Worker  // Vector types are returned in XMM0,XMM1,XMMM2 and XMM3.
113*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v4i32, v2i64, v4f32, v2f64],
114*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>,
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  // 256-bit FP vectors
117*9880d681SAndroid Build Coastguard Worker  // No more than 4 registers
118*9880d681SAndroid Build Coastguard Worker  CCIfType<[v8f32, v4f64, v8i32, v4i64],
119*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>,
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  // 512-bit FP vectors
122*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16f32, v8f64, v16i32, v8i64],
123*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>,
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker  // i32, i64 in the standard way
126*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
127*9880d681SAndroid Build Coastguard Worker]>;
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker// X86-32 HiPE return-value convention.
130*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_HiPE : CallingConv<[
131*9880d681SAndroid Build Coastguard Worker  // Promote all types to i32
132*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16], CCPromoteToType<i32>>,
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  // Return: HP, P, VAL1, VAL2
135*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[ESI, EBP, EAX, EDX]>>
136*9880d681SAndroid Build Coastguard Worker]>;
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker// X86-32 HiPE return-value convention.
139*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32_VectorCall : CallingConv<[
140*9880d681SAndroid Build Coastguard Worker  // Vector types are returned in XMM0,XMM1,XMMM2 and XMM3.
141*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
142*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[XMM0,XMM1,XMM2,XMM3]>>,
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker  // 256-bit FP vectors
145*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
146*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[YMM0,YMM1,YMM2,YMM3]>>,
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker  // 512-bit FP vectors
149*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
150*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[ZMM0,ZMM1,ZMM2,ZMM3]>>,
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker  // Return integers in the standard way.
153*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
154*9880d681SAndroid Build Coastguard Worker]>;
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker// X86-64 C return-value convention.
157*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_C : CallingConv<[
158*9880d681SAndroid Build Coastguard Worker  // The X86-64 calling convention always returns FP values in XMM0.
159*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[XMM0, XMM1]>>,
160*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToReg<[XMM0, XMM1]>>,
161*9880d681SAndroid Build Coastguard Worker  CCIfType<[f128], CCAssignToReg<[XMM0, XMM1]>>,
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker  // MMX vector types are always returned in XMM0.
164*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCAssignToReg<[XMM0, XMM1]>>,
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker  CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>,
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
169*9880d681SAndroid Build Coastguard Worker]>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker// X86-Win64 C return-value convention.
172*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_Win64_C : CallingConv<[
173*9880d681SAndroid Build Coastguard Worker  // The X86-Win64 calling convention always returns __m64 values in RAX.
174*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCBitConvertToType<i64>>,
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker  // Otherwise, everything is the same as 'normal' X86-64 C CC.
177*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86_64_C>
178*9880d681SAndroid Build Coastguard Worker]>;
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker// X86-64 HiPE return-value convention.
181*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_HiPE : CallingConv<[
182*9880d681SAndroid Build Coastguard Worker  // Promote all types to i64
183*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker  // Return: HP, P, VAL1, VAL2
186*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[R15, RBP, RAX, RDX]>>
187*9880d681SAndroid Build Coastguard Worker]>;
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker// X86-64 WebKit_JS return-value convention.
190*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_WebKit_JS : CallingConv<[
191*9880d681SAndroid Build Coastguard Worker  // Promote all types to i64
192*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker  // Return: RAX
195*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RAX]>>
196*9880d681SAndroid Build Coastguard Worker]>;
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_Swift : CallingConv<[
199*9880d681SAndroid Build Coastguard Worker  // For integers, ECX, R8D can be used as extra return registers.
200*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1],  CCPromoteToType<i8>>,
201*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8] , CCAssignToReg<[AL, DL, CL, R8B]>>,
202*9880d681SAndroid Build Coastguard Worker  CCIfType<[i16], CCAssignToReg<[AX, DX, CX, R8W]>>,
203*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX, R8D]>>,
204*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RAX, RDX, RCX, R8]>>,
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker  // XMM0, XMM1, XMM2 and XMM3 can be used to return FP values.
207*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>,
208*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>,
209*9880d681SAndroid Build Coastguard Worker  CCIfType<[f128], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>,
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker  // MMX vector types are returned in XMM0, XMM1, XMM2 and XMM3.
212*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>,
213*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86Common>
214*9880d681SAndroid Build Coastguard Worker]>;
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker// X86-64 AnyReg return-value convention. No explicit register is specified for
217*9880d681SAndroid Build Coastguard Worker// the return-value. The register allocator is allowed and expected to choose
218*9880d681SAndroid Build Coastguard Worker// any free register.
219*9880d681SAndroid Build Coastguard Worker//
220*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and
221*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug
222*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the X86 C calling convention.
223*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_AnyReg : CallingConv<[
224*9880d681SAndroid Build Coastguard Worker  CCCustom<"CC_X86_AnyReg_Error">
225*9880d681SAndroid Build Coastguard Worker]>;
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker// X86-64 HHVM return-value convention.
228*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64_HHVM: CallingConv<[
229*9880d681SAndroid Build Coastguard Worker  // Promote all types to i64
230*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker  // Return: could return in any GP register save RSP and R12.
233*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RBX, RBP, RDI, RSI, RDX, RCX, R8, R9,
234*9880d681SAndroid Build Coastguard Worker                                 RAX, R10, R11, R13, R14, R15]>>
235*9880d681SAndroid Build Coastguard Worker]>;
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker// This is the root return-value convention for the X86-32 backend.
238*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_32 : CallingConv<[
239*9880d681SAndroid Build Coastguard Worker  // If FastCC, use RetCC_X86_32_Fast.
240*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Fast", CCDelegateTo<RetCC_X86_32_Fast>>,
241*9880d681SAndroid Build Coastguard Worker  // If HiPE, use RetCC_X86_32_HiPE.
242*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HiPE", CCDelegateTo<RetCC_X86_32_HiPE>>,
243*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<RetCC_X86_32_VectorCall>>,
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker  // Otherwise, use RetCC_X86_32_C.
246*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86_32_C>
247*9880d681SAndroid Build Coastguard Worker]>;
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Worker// This is the root return-value convention for the X86-64 backend.
250*9880d681SAndroid Build Coastguard Workerdef RetCC_X86_64 : CallingConv<[
251*9880d681SAndroid Build Coastguard Worker  // HiPE uses RetCC_X86_64_HiPE
252*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HiPE", CCDelegateTo<RetCC_X86_64_HiPE>>,
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker  // Handle JavaScript calls.
255*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::WebKit_JS", CCDelegateTo<RetCC_X86_64_WebKit_JS>>,
256*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_X86_64_AnyReg>>,
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker  // Handle Swift calls.
259*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Swift", CCDelegateTo<RetCC_X86_64_Swift>>,
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker  // Handle explicit CC selection
262*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_64_Win64", CCDelegateTo<RetCC_X86_Win64_C>>,
263*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_64_SysV", CCDelegateTo<RetCC_X86_64_C>>,
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker  // Handle HHVM calls.
266*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HHVM", CCDelegateTo<RetCC_X86_64_HHVM>>,
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker  // Mingw64 and native Win64 use Win64 CC
269*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetWin64()", CCDelegateTo<RetCC_X86_Win64_C>>,
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker  // Otherwise, drop to normal X86-64 CC
272*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86_64_C>
273*9880d681SAndroid Build Coastguard Worker]>;
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker// This is the return-value convention used for the entire X86 backend.
276*9880d681SAndroid Build Coastguard Workerdef RetCC_X86 : CallingConv<[
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker  // Check if this is the Intel OpenCL built-ins calling convention
279*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Intel_OCL_BI", CCDelegateTo<RetCC_Intel_OCL_BI>>,
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"is64Bit()", CCDelegateTo<RetCC_X86_64>>,
282*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<RetCC_X86_32>
283*9880d681SAndroid Build Coastguard Worker]>;
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
286*9880d681SAndroid Build Coastguard Worker// X86-64 Argument Calling Conventions
287*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_C : CallingConv<[
290*9880d681SAndroid Build Coastguard Worker  // Handles byval parameters.
291*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<8, 8>>,
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
294*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in R10.
297*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCIfSubtarget<"isTarget64BitILP32()", CCAssignToReg<[R10D]>>>,
298*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[R10]>>,
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker  // Pass SwiftSelf in a callee saved register.
301*9880d681SAndroid Build Coastguard Worker  CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>,
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker  // A SwiftError is passed in R12.
304*9880d681SAndroid Build Coastguard Worker  CCIfSwiftError<CCIfType<[i64], CCAssignToReg<[R12]>>>,
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker  // For Swift Calling Convention, pass sret in %RAX.
307*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Swift",
308*9880d681SAndroid Build Coastguard Worker    CCIfSRet<CCIfType<[i64], CCAssignToReg<[RAX]>>>>,
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker  // The first 6 integer arguments are passed in integer registers.
311*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>,
312*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>,
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker  // The first 8 MMX vector arguments are passed in XMM registers on Darwin.
315*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx],
316*9880d681SAndroid Build Coastguard Worker            CCIfSubtarget<"isTargetDarwin()",
317*9880d681SAndroid Build Coastguard Worker            CCIfSubtarget<"hasSSE2()",
318*9880d681SAndroid Build Coastguard Worker            CCPromoteToType<v2i64>>>>,
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker  // Boolean vectors of AVX-512 are passed in SIMD registers.
321*9880d681SAndroid Build Coastguard Worker  // The call from AVX to AVX-512 function should work,
322*9880d681SAndroid Build Coastguard Worker  // since the boolean types in AVX/AVX2 are promoted by default.
323*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i1],  CCPromoteToType<v2i64>>,
324*9880d681SAndroid Build Coastguard Worker  CCIfType<[v4i1],  CCPromoteToType<v4i32>>,
325*9880d681SAndroid Build Coastguard Worker  CCIfType<[v8i1],  CCPromoteToType<v8i16>>,
326*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i1], CCPromoteToType<v16i8>>,
327*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i1], CCPromoteToType<v32i8>>,
328*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i1], CCPromoteToType<v64i8>>,
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker  // The first 8 FP/Vector arguments are passed in XMM registers.
331*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, f128, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
332*9880d681SAndroid Build Coastguard Worker            CCIfSubtarget<"hasSSE1()",
333*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7]>>>,
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker  // The first 8 256-bit vector arguments are passed in YMM registers, unless
336*9880d681SAndroid Build Coastguard Worker  // this is a vararg function.
337*9880d681SAndroid Build Coastguard Worker  // FIXME: This isn't precisely correct; the x86-64 ABI document says that
338*9880d681SAndroid Build Coastguard Worker  // fixed arguments to vararg functions are supposed to be passed in
339*9880d681SAndroid Build Coastguard Worker  // registers.  Actually modeling that would be a lot of work, though.
340*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
341*9880d681SAndroid Build Coastguard Worker                          CCIfSubtarget<"hasFp256()",
342*9880d681SAndroid Build Coastguard Worker                          CCAssignToReg<[YMM0, YMM1, YMM2, YMM3,
343*9880d681SAndroid Build Coastguard Worker                                         YMM4, YMM5, YMM6, YMM7]>>>>,
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker  // The first 8 512-bit vector arguments are passed in ZMM registers.
346*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
347*9880d681SAndroid Build Coastguard Worker            CCIfSubtarget<"hasAVX512()",
348*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5, ZMM6, ZMM7]>>>>,
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker  // Integer/FP values get stored in stack slots that are 8 bytes in size and
351*9880d681SAndroid Build Coastguard Worker  // 8-byte aligned if there are no more registers to hold them.
352*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>,
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Worker  // Long doubles get stack slots whose size and alignment depends on the
355*9880d681SAndroid Build Coastguard Worker  // subtarget.
356*9880d681SAndroid Build Coastguard Worker  CCIfType<[f80, f128], CCAssignToStack<0, 0>>,
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker  // Vectors get 16-byte stack slots that are 16-byte aligned.
359*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>,
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker  // 256-bit vectors get 32-byte stack slots that are 32-byte aligned.
362*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
363*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<32, 32>>,
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker  // 512-bit vectors get 64-byte stack slots that are 64-byte aligned.
366*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i32, v8i64, v16f32, v8f64],
367*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<64, 64>>
368*9880d681SAndroid Build Coastguard Worker]>;
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker// Calling convention for X86-64 HHVM.
371*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HHVM : CallingConv<[
372*9880d681SAndroid Build Coastguard Worker  // Use all/any GP registers for args, except RSP.
373*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RBX, R12, RBP, R15,
374*9880d681SAndroid Build Coastguard Worker                                 RDI, RSI, RDX, RCX, R8, R9,
375*9880d681SAndroid Build Coastguard Worker                                 RAX, R10, R11, R13, R14]>>
376*9880d681SAndroid Build Coastguard Worker]>;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker// Calling convention for helper functions in HHVM.
379*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HHVM_C : CallingConv<[
380*9880d681SAndroid Build Coastguard Worker  // Pass the first argument in RBP.
381*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RBP]>>,
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker  // Otherwise it's the same as the regular C calling convention.
384*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_64_C>
385*9880d681SAndroid Build Coastguard Worker]>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker// Calling convention used on Win64
388*9880d681SAndroid Build Coastguard Workerdef CC_X86_Win64_C : CallingConv<[
389*9880d681SAndroid Build Coastguard Worker  // FIXME: Handle byval stuff.
390*9880d681SAndroid Build Coastguard Worker  // FIXME: Handle varargs.
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
393*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in R10.
396*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[R10]>>,
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Worker  // 128 bit vectors are passed by pointer
399*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCPassIndirect<i64>>,
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker  // 256 bit vectors are passed by pointer
403*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64], CCPassIndirect<i64>>,
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker  // 512 bit vectors are passed by pointer
406*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i32, v16f32, v8f64, v8i64], CCPassIndirect<i64>>,
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Worker  // The first 4 MMX vector arguments are passed in GPRs.
409*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCBitConvertToType<i64>>,
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker  // The first 4 integer arguments are passed in integer registers.
412*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ],
413*9880d681SAndroid Build Coastguard Worker                                          [XMM0, XMM1, XMM2, XMM3]>>,
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker  // Do not pass the sret argument in RCX, the Win64 thiscall calling
416*9880d681SAndroid Build Coastguard Worker  // convention requires "this" to be passed in RCX.
417*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_ThisCall",
418*9880d681SAndroid Build Coastguard Worker    CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[RDX , R8  , R9  ],
419*9880d681SAndroid Build Coastguard Worker                                                     [XMM1, XMM2, XMM3]>>>>,
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[RCX , RDX , R8  , R9  ],
422*9880d681SAndroid Build Coastguard Worker                                          [XMM0, XMM1, XMM2, XMM3]>>,
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker  // The first 4 FP/Vector arguments are passed in XMM registers.
425*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
426*9880d681SAndroid Build Coastguard Worker           CCAssignToRegWithShadow<[XMM0, XMM1, XMM2, XMM3],
427*9880d681SAndroid Build Coastguard Worker                                   [RCX , RDX , R8  , R9  ]>>,
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker  // Integer/FP values get stored in stack slots that are 8 bytes in size and
430*9880d681SAndroid Build Coastguard Worker  // 8-byte aligned if there are no more registers to hold them.
431*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>,
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker  // Long doubles get stack slots whose size and alignment depends on the
434*9880d681SAndroid Build Coastguard Worker  // subtarget.
435*9880d681SAndroid Build Coastguard Worker  CCIfType<[f80], CCAssignToStack<0, 0>>
436*9880d681SAndroid Build Coastguard Worker]>;
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Workerdef CC_X86_Win64_VectorCall : CallingConv<[
439*9880d681SAndroid Build Coastguard Worker  // The first 6 floating point and vector types of 128 bits or less use
440*9880d681SAndroid Build Coastguard Worker  // XMM0-XMM5.
441*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
442*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5]>>,
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker  // 256-bit vectors use YMM registers.
445*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
446*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, YMM4, YMM5]>>,
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker  // 512-bit vectors use ZMM registers.
449*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
450*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5]>>,
451*9880d681SAndroid Build Coastguard Worker
452*9880d681SAndroid Build Coastguard Worker  // Delegate to fastcall to handle integer types.
453*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_Win64_C>
454*9880d681SAndroid Build Coastguard Worker]>;
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_GHC : CallingConv<[
458*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16/i32 arguments to i64.
459*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker  // Pass in STG registers: Base, Sp, Hp, R1, R2, R3, R4, R5, R6, SpLim
462*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64],
463*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[R13, RBP, R12, RBX, R14, RSI, RDI, R8, R9, R15]>>,
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker  // Pass in STG registers: F1, F2, F3, F4, D1, D2
466*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
467*9880d681SAndroid Build Coastguard Worker            CCIfSubtarget<"hasSSE1()",
468*9880d681SAndroid Build Coastguard Worker            CCAssignToReg<[XMM1, XMM2, XMM3, XMM4, XMM5, XMM6]>>>
469*9880d681SAndroid Build Coastguard Worker]>;
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_HiPE : CallingConv<[
472*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16/i32 arguments to i64.
473*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker  // Pass in VM's registers: HP, P, ARG0, ARG1, ARG2, ARG3
476*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[R15, RBP, RSI, RDX, RCX, R8]>>,
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Worker  // Integer/FP values get stored in stack slots that are 8 bytes in size and
479*9880d681SAndroid Build Coastguard Worker  // 8-byte aligned if there are no more registers to hold them.
480*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>>
481*9880d681SAndroid Build Coastguard Worker]>;
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_WebKit_JS : CallingConv<[
484*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16 arguments to i32.
485*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16], CCPromoteToType<i32>>,
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Worker  // Only the first integer argument is passed in register.
488*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EAX]>>,
489*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[RAX]>>,
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker  // The remaining integer arguments are passed on the stack. 32bit integer and
492*9880d681SAndroid Build Coastguard Worker  // floating-point arguments are aligned to 4 byte and stored in 4 byte slots.
493*9880d681SAndroid Build Coastguard Worker  // 64bit integer and floating-point arguments are aligned to 8 byte and stored
494*9880d681SAndroid Build Coastguard Worker  // in 8 byte stack slots.
495*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
496*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToStack<8, 8>>
497*9880d681SAndroid Build Coastguard Worker]>;
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker// No explicit register is specified for the AnyReg calling convention. The
500*9880d681SAndroid Build Coastguard Worker// register allocator may assign the arguments to any free register.
501*9880d681SAndroid Build Coastguard Worker//
502*9880d681SAndroid Build Coastguard Worker// This calling convention is currently only supported by the stackmap and
503*9880d681SAndroid Build Coastguard Worker// patchpoint intrinsics. All other uses will result in an assert on Debug
504*9880d681SAndroid Build Coastguard Worker// builds. On Release builds we fallback to the X86 C calling convention.
505*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_AnyReg : CallingConv<[
506*9880d681SAndroid Build Coastguard Worker  CCCustom<"CC_X86_AnyReg_Error">
507*9880d681SAndroid Build Coastguard Worker]>;
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
510*9880d681SAndroid Build Coastguard Worker// X86 C Calling Convention
511*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker/// CC_X86_32_Vector_Common - In all X86-32 calling conventions, extra vector
514*9880d681SAndroid Build Coastguard Worker/// values are spilled on the stack.
515*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Common : CallingConv<[
516*9880d681SAndroid Build Coastguard Worker  // Other SSE vectors get 16-byte stack slots that are 16-byte aligned.
517*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], CCAssignToStack<16, 16>>,
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker  // 256-bit AVX vectors get 32-byte stack slots that are 32-byte aligned.
520*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
521*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<32, 32>>,
522*9880d681SAndroid Build Coastguard Worker
523*9880d681SAndroid Build Coastguard Worker  // 512-bit AVX 512-bit vectors get 64-byte stack slots that are 64-byte aligned.
524*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
525*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<64, 64>>
526*9880d681SAndroid Build Coastguard Worker]>;
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Worker// CC_X86_32_Vector_Standard - The first 3 vector arguments are passed in
529*9880d681SAndroid Build Coastguard Worker// vector registers
530*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Standard : CallingConv<[
531*9880d681SAndroid Build Coastguard Worker  // SSE vector arguments are passed in XMM registers.
532*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
533*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[XMM0, XMM1, XMM2]>>>,
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker  // AVX 256-bit vector arguments are passed in YMM registers.
536*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
537*9880d681SAndroid Build Coastguard Worker                CCIfSubtarget<"hasFp256()",
538*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[YMM0, YMM1, YMM2]>>>>,
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker  // AVX 512-bit vector arguments are passed in ZMM registers.
541*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
542*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[ZMM0, ZMM1, ZMM2]>>>,
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Vector_Common>
545*9880d681SAndroid Build Coastguard Worker]>;
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker// CC_X86_32_Vector_Darwin - The first 4 vector arguments are passed in
548*9880d681SAndroid Build Coastguard Worker// vector registers.
549*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Vector_Darwin : CallingConv<[
550*9880d681SAndroid Build Coastguard Worker  // SSE vector arguments are passed in XMM registers.
551*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
552*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>>,
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Worker  // AVX 256-bit vector arguments are passed in YMM registers.
555*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
556*9880d681SAndroid Build Coastguard Worker                CCIfSubtarget<"hasFp256()",
557*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[YMM0, YMM1, YMM2, YMM3]>>>>,
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker  // AVX 512-bit vector arguments are passed in ZMM registers.
560*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
561*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3]>>>,
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Vector_Common>
564*9880d681SAndroid Build Coastguard Worker]>;
565*9880d681SAndroid Build Coastguard Worker
566*9880d681SAndroid Build Coastguard Worker/// CC_X86_32_Common - In all X86-32 calling conventions, extra integers and FP
567*9880d681SAndroid Build Coastguard Worker/// values are spilled on the stack.
568*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Common : CallingConv<[
569*9880d681SAndroid Build Coastguard Worker  // Handles byval parameters.
570*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<4, 4>>,
571*9880d681SAndroid Build Coastguard Worker
572*9880d681SAndroid Build Coastguard Worker  // The first 3 float or double arguments, if marked 'inreg' and if the call
573*9880d681SAndroid Build Coastguard Worker  // is not a vararg call and if SSE2 is available, are passed in SSE registers.
574*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfInReg<CCIfType<[f32,f64],
575*9880d681SAndroid Build Coastguard Worker                CCIfSubtarget<"hasSSE2()",
576*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[XMM0,XMM1,XMM2]>>>>>,
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Worker  // The first 3 __m64 vector arguments are passed in mmx registers if the
579*9880d681SAndroid Build Coastguard Worker  // call is not a vararg call.
580*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[x86mmx],
581*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[MM0, MM1, MM2]>>>,
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Worker  // Integer/Float values get stored in stack slots that are 4 bytes in
584*9880d681SAndroid Build Coastguard Worker  // size and 4-byte aligned.
585*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker  // Doubles get 8-byte slots that are 4-byte aligned.
588*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToStack<8, 4>>,
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Worker  // Long doubles get slots whose size depends on the subtarget.
591*9880d681SAndroid Build Coastguard Worker  CCIfType<[f80], CCAssignToStack<0, 4>>,
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Worker  // Boolean vectors of AVX-512 are passed in SIMD registers.
594*9880d681SAndroid Build Coastguard Worker  // The call from AVX to AVX-512 function should work,
595*9880d681SAndroid Build Coastguard Worker  // since the boolean types in AVX/AVX2 are promoted by default.
596*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i1],  CCPromoteToType<v2i64>>,
597*9880d681SAndroid Build Coastguard Worker  CCIfType<[v4i1],  CCPromoteToType<v4i32>>,
598*9880d681SAndroid Build Coastguard Worker  CCIfType<[v8i1],  CCPromoteToType<v8i16>>,
599*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i1], CCPromoteToType<v16i8>>,
600*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i1], CCPromoteToType<v32i8>>,
601*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i1], CCPromoteToType<v64i8>>,
602*9880d681SAndroid Build Coastguard Worker
603*9880d681SAndroid Build Coastguard Worker  // __m64 vectors get 8-byte stack slots that are 4-byte aligned. They are
604*9880d681SAndroid Build Coastguard Worker  // passed in the parameter area.
605*9880d681SAndroid Build Coastguard Worker  CCIfType<[x86mmx], CCAssignToStack<8, 4>>,
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Worker  // Darwin passes vectors in a form that differs from the i386 psABI
608*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetDarwin()", CCDelegateTo<CC_X86_32_Vector_Darwin>>,
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Worker  // Otherwise, drop to 'normal' X86-32 CC
611*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Vector_Standard>
612*9880d681SAndroid Build Coastguard Worker]>;
613*9880d681SAndroid Build Coastguard Worker
614*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_C : CallingConv<[
615*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
616*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in ECX.
619*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[ECX]>>,
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker  // The first 3 integer arguments, if marked 'inreg' and if the call is not
622*9880d681SAndroid Build Coastguard Worker  // a vararg call, are passed in integer registers.
623*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfInReg<CCIfType<[i32], CCAssignToReg<[EAX, EDX, ECX]>>>>,
624*9880d681SAndroid Build Coastguard Worker
625*9880d681SAndroid Build Coastguard Worker  // Otherwise, same as everything else.
626*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Common>
627*9880d681SAndroid Build Coastguard Worker]>;
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_MCU : CallingConv<[
630*9880d681SAndroid Build Coastguard Worker  // Handles byval parameters.  Note that, like FastCC, we can't rely on
631*9880d681SAndroid Build Coastguard Worker  // the delegation to CC_X86_32_Common because that happens after code that
632*9880d681SAndroid Build Coastguard Worker  // puts arguments in registers.
633*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<4, 4>>,
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
636*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Worker  // If the call is not a vararg call, some arguments may be passed
639*9880d681SAndroid Build Coastguard Worker  // in integer registers.
640*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[i32], CCCustom<"CC_X86_32_MCUInReg">>>,
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Worker  // Otherwise, same as everything else.
643*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Common>
644*9880d681SAndroid Build Coastguard Worker]>;
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_FastCall : CallingConv<[
647*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
648*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
649*9880d681SAndroid Build Coastguard Worker
650*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in EAX.
651*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[EAX]>>,
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Worker  // The first 2 integer arguments are passed in ECX/EDX
654*9880d681SAndroid Build Coastguard Worker  CCIfInReg<CCIfType<[i32], CCAssignToReg<[ECX, EDX]>>>,
655*9880d681SAndroid Build Coastguard Worker
656*9880d681SAndroid Build Coastguard Worker  // Otherwise, same as everything else.
657*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Common>
658*9880d681SAndroid Build Coastguard Worker]>;
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_VectorCall : CallingConv<[
661*9880d681SAndroid Build Coastguard Worker  // The first 6 floating point and vector types of 128 bits or less use
662*9880d681SAndroid Build Coastguard Worker  // XMM0-XMM5.
663*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
664*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[XMM0, XMM1, XMM2, XMM3, XMM4, XMM5]>>,
665*9880d681SAndroid Build Coastguard Worker
666*9880d681SAndroid Build Coastguard Worker  // 256-bit vectors use YMM registers.
667*9880d681SAndroid Build Coastguard Worker  CCIfType<[v32i8, v16i16, v8i32, v4i64, v8f32, v4f64],
668*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[YMM0, YMM1, YMM2, YMM3, YMM4, YMM5]>>,
669*9880d681SAndroid Build Coastguard Worker
670*9880d681SAndroid Build Coastguard Worker  // 512-bit vectors use ZMM registers.
671*9880d681SAndroid Build Coastguard Worker  CCIfType<[v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
672*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3, ZMM4, ZMM5]>>,
673*9880d681SAndroid Build Coastguard Worker
674*9880d681SAndroid Build Coastguard Worker  // Otherwise, pass it indirectly.
675*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64,
676*9880d681SAndroid Build Coastguard Worker            v32i8, v16i16, v8i32, v4i64, v8f32, v4f64,
677*9880d681SAndroid Build Coastguard Worker            v64i8, v32i16, v16i32, v8i64, v16f32, v8f64],
678*9880d681SAndroid Build Coastguard Worker           CCCustom<"CC_X86_32_VectorCallIndirect">>,
679*9880d681SAndroid Build Coastguard Worker
680*9880d681SAndroid Build Coastguard Worker  // Delegate to fastcall to handle integer types.
681*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_FastCall>
682*9880d681SAndroid Build Coastguard Worker]>;
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Common : CallingConv<[
685*9880d681SAndroid Build Coastguard Worker  // The first integer argument is passed in ECX
686*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[ECX]>>,
687*9880d681SAndroid Build Coastguard Worker
688*9880d681SAndroid Build Coastguard Worker  // Otherwise, same as everything else.
689*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Common>
690*9880d681SAndroid Build Coastguard Worker]>;
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Mingw : CallingConv<[
693*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
694*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_ThisCall_Common>
697*9880d681SAndroid Build Coastguard Worker]>;
698*9880d681SAndroid Build Coastguard Worker
699*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall_Win : CallingConv<[
700*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
701*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Worker  // Pass sret arguments indirectly through stack.
704*9880d681SAndroid Build Coastguard Worker  CCIfSRet<CCAssignToStack<4, 4>>,
705*9880d681SAndroid Build Coastguard Worker
706*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_ThisCall_Common>
707*9880d681SAndroid Build Coastguard Worker]>;
708*9880d681SAndroid Build Coastguard Worker
709*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_ThisCall : CallingConv<[
710*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetCygMing()", CCDelegateTo<CC_X86_32_ThisCall_Mingw>>,
711*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_ThisCall_Win>
712*9880d681SAndroid Build Coastguard Worker]>;
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_FastCC : CallingConv<[
715*9880d681SAndroid Build Coastguard Worker  // Handles byval parameters.  Note that we can't rely on the delegation
716*9880d681SAndroid Build Coastguard Worker  // to CC_X86_32_Common for this because that happens after code that
717*9880d681SAndroid Build Coastguard Worker  // puts arguments in registers.
718*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<4, 4>>,
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Worker  // Promote i1/i8/i16 arguments to i32.
721*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in EAX.
724*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[EAX]>>,
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Worker  // The first 2 integer arguments are passed in ECX/EDX
727*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[ECX, EDX]>>,
728*9880d681SAndroid Build Coastguard Worker
729*9880d681SAndroid Build Coastguard Worker  // The first 3 float or double arguments, if the call is not a vararg
730*9880d681SAndroid Build Coastguard Worker  // call and if SSE2 is available, are passed in SSE registers.
731*9880d681SAndroid Build Coastguard Worker  CCIfNotVarArg<CCIfType<[f32,f64],
732*9880d681SAndroid Build Coastguard Worker                CCIfSubtarget<"hasSSE2()",
733*9880d681SAndroid Build Coastguard Worker                CCAssignToReg<[XMM0,XMM1,XMM2]>>>>,
734*9880d681SAndroid Build Coastguard Worker
735*9880d681SAndroid Build Coastguard Worker  // Doubles get 8-byte slots that are 8-byte aligned.
736*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToStack<8, 8>>,
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker  // Otherwise, same as everything else.
739*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_Common>
740*9880d681SAndroid Build Coastguard Worker]>;
741*9880d681SAndroid Build Coastguard Worker
742*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_GHC : CallingConv<[
743*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16 arguments to i32.
744*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16], CCPromoteToType<i32>>,
745*9880d681SAndroid Build Coastguard Worker
746*9880d681SAndroid Build Coastguard Worker  // Pass in STG registers: Base, Sp, Hp, R1
747*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[EBX, EBP, EDI, ESI]>>
748*9880d681SAndroid Build Coastguard Worker]>;
749*9880d681SAndroid Build Coastguard Worker
750*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_HiPE : CallingConv<[
751*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16 arguments to i32.
752*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16], CCPromoteToType<i32>>,
753*9880d681SAndroid Build Coastguard Worker
754*9880d681SAndroid Build Coastguard Worker  // Pass in VM's registers: HP, P, ARG0, ARG1, ARG2
755*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToReg<[ESI, EBP, EAX, EDX, ECX]>>,
756*9880d681SAndroid Build Coastguard Worker
757*9880d681SAndroid Build Coastguard Worker  // Integer/Float values get stored in stack slots that are 4 bytes in
758*9880d681SAndroid Build Coastguard Worker  // size and 4-byte aligned.
759*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>
760*9880d681SAndroid Build Coastguard Worker]>;
761*9880d681SAndroid Build Coastguard Worker
762*9880d681SAndroid Build Coastguard Worker// X86-64 Intel OpenCL built-ins calling convention.
763*9880d681SAndroid Build Coastguard Workerdef CC_Intel_OCL_BI : CallingConv<[
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCIfSubtarget<"isTargetWin64()", CCAssignToReg<[ECX, EDX, R8D, R9D]>>>,
766*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSubtarget<"isTargetWin64()", CCAssignToReg<[RCX, RDX, R8,  R9 ]>>>,
767*9880d681SAndroid Build Coastguard Worker
768*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCIfSubtarget<"is64Bit()", CCAssignToReg<[EDI, ESI, EDX, ECX]>>>,
769*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSubtarget<"is64Bit()", CCAssignToReg<[RDI, RSI, RDX, RCX]>>>,
770*9880d681SAndroid Build Coastguard Worker
771*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToStack<4, 4>>,
772*9880d681SAndroid Build Coastguard Worker
773*9880d681SAndroid Build Coastguard Worker  // The SSE vector arguments are passed in XMM registers.
774*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32, f64, v4i32, v2i64, v4f32, v2f64],
775*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>,
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Worker  // The 256-bit vector arguments are passed in YMM registers.
778*9880d681SAndroid Build Coastguard Worker  CCIfType<[v8f32, v4f64, v8i32, v4i64],
779*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[YMM0, YMM1, YMM2, YMM3]>>,
780*9880d681SAndroid Build Coastguard Worker
781*9880d681SAndroid Build Coastguard Worker  // The 512-bit vector arguments are passed in ZMM registers.
782*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16f32, v8f64, v16i32, v8i64],
783*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[ZMM0, ZMM1, ZMM2, ZMM3]>>,
784*9880d681SAndroid Build Coastguard Worker
785*9880d681SAndroid Build Coastguard Worker  // Pass masks in mask registers
786*9880d681SAndroid Build Coastguard Worker  CCIfType<[v16i1, v8i1], CCAssignToReg<[K1]>>,
787*9880d681SAndroid Build Coastguard Worker
788*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>,
789*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"is64Bit()",       CCDelegateTo<CC_X86_64_C>>,
790*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_C>
791*9880d681SAndroid Build Coastguard Worker]>;
792*9880d681SAndroid Build Coastguard Worker
793*9880d681SAndroid Build Coastguard Workerdef CC_X86_32_Intr : CallingConv<[
794*9880d681SAndroid Build Coastguard Worker  CCAssignToStack<4, 4>
795*9880d681SAndroid Build Coastguard Worker]>;
796*9880d681SAndroid Build Coastguard Worker
797*9880d681SAndroid Build Coastguard Workerdef CC_X86_64_Intr : CallingConv<[
798*9880d681SAndroid Build Coastguard Worker  CCAssignToStack<8, 8>
799*9880d681SAndroid Build Coastguard Worker]>;
800*9880d681SAndroid Build Coastguard Worker
801*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
802*9880d681SAndroid Build Coastguard Worker// X86 Root Argument Calling Conventions
803*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Worker// This is the root argument convention for the X86-32 backend.
806*9880d681SAndroid Build Coastguard Workerdef CC_X86_32 : CallingConv<[
807*9880d681SAndroid Build Coastguard Worker  // X86_INTR calling convention is valid in MCU target and should override the
808*9880d681SAndroid Build Coastguard Worker  // MCU calling convention. Thus, this should be checked before isTargetMCU().
809*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_INTR", CCDelegateTo<CC_X86_32_Intr>>,
810*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetMCU()", CCDelegateTo<CC_X86_32_MCU>>,
811*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_FastCall", CCDelegateTo<CC_X86_32_FastCall>>,
812*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<CC_X86_32_VectorCall>>,
813*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_ThisCall", CCDelegateTo<CC_X86_32_ThisCall>>,
814*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Fast", CCDelegateTo<CC_X86_32_FastCC>>,
815*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_32_GHC>>,
816*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HiPE", CCDelegateTo<CC_X86_32_HiPE>>,
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Worker  // Otherwise, drop to normal X86-32 CC
819*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32_C>
820*9880d681SAndroid Build Coastguard Worker]>;
821*9880d681SAndroid Build Coastguard Worker
822*9880d681SAndroid Build Coastguard Worker// This is the root argument convention for the X86-64 backend.
823*9880d681SAndroid Build Coastguard Workerdef CC_X86_64 : CallingConv<[
824*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_64_GHC>>,
825*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HiPE", CCDelegateTo<CC_X86_64_HiPE>>,
826*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::WebKit_JS", CCDelegateTo<CC_X86_64_WebKit_JS>>,
827*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_X86_64_AnyReg>>,
828*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_64_Win64", CCDelegateTo<CC_X86_Win64_C>>,
829*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_64_SysV", CCDelegateTo<CC_X86_64_C>>,
830*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_VectorCall", CCDelegateTo<CC_X86_Win64_VectorCall>>,
831*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HHVM", CCDelegateTo<CC_X86_64_HHVM>>,
832*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::HHVM_C", CCDelegateTo<CC_X86_64_HHVM_C>>,
833*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::X86_INTR", CCDelegateTo<CC_X86_64_Intr>>,
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Worker  // Mingw64 and native Win64 use Win64 CC
836*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_C>>,
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Worker  // Otherwise, drop to normal X86-64 CC
839*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_64_C>
840*9880d681SAndroid Build Coastguard Worker]>;
841*9880d681SAndroid Build Coastguard Worker
842*9880d681SAndroid Build Coastguard Worker// This is the argument convention used for the entire X86 backend.
843*9880d681SAndroid Build Coastguard Workerdef CC_X86 : CallingConv<[
844*9880d681SAndroid Build Coastguard Worker  CCIfCC<"CallingConv::Intel_OCL_BI", CCDelegateTo<CC_Intel_OCL_BI>>,
845*9880d681SAndroid Build Coastguard Worker  CCIfSubtarget<"is64Bit()", CCDelegateTo<CC_X86_64>>,
846*9880d681SAndroid Build Coastguard Worker  CCDelegateTo<CC_X86_32>
847*9880d681SAndroid Build Coastguard Worker]>;
848*9880d681SAndroid Build Coastguard Worker
849*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
850*9880d681SAndroid Build Coastguard Worker// Callee-saved Registers.
851*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Workerdef CSR_NoRegs : CalleeSavedRegs<(add)>;
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Workerdef CSR_32 : CalleeSavedRegs<(add ESI, EDI, EBX, EBP)>;
856*9880d681SAndroid Build Coastguard Workerdef CSR_64 : CalleeSavedRegs<(add RBX, R12, R13, R14, R15, RBP)>;
857*9880d681SAndroid Build Coastguard Worker
858*9880d681SAndroid Build Coastguard Workerdef CSR_64_SwiftError : CalleeSavedRegs<(sub CSR_64, R12)>;
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdef CSR_32EHRet : CalleeSavedRegs<(add EAX, EDX, CSR_32)>;
861*9880d681SAndroid Build Coastguard Workerdef CSR_64EHRet : CalleeSavedRegs<(add RAX, RDX, CSR_64)>;
862*9880d681SAndroid Build Coastguard Worker
863*9880d681SAndroid Build Coastguard Workerdef CSR_Win64 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12, R13, R14, R15,
864*9880d681SAndroid Build Coastguard Worker                                     (sequence "XMM%u", 6, 15))>;
865*9880d681SAndroid Build Coastguard Worker
866*9880d681SAndroid Build Coastguard Worker// The function used by Darwin to obtain the address of a thread-local variable
867*9880d681SAndroid Build Coastguard Worker// uses rdi to pass a single parameter and rax for the return value. All other
868*9880d681SAndroid Build Coastguard Worker// GPRs are preserved.
869*9880d681SAndroid Build Coastguard Workerdef CSR_64_TLS_Darwin : CalleeSavedRegs<(add CSR_64, RCX, RDX, RSI,
870*9880d681SAndroid Build Coastguard Worker                                             R8, R9, R10, R11)>;
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue.
873*9880d681SAndroid Build Coastguard Workerdef CSR_64_CXX_TLS_Darwin_PE : CalleeSavedRegs<(add RBP)>;
874*9880d681SAndroid Build Coastguard Worker
875*9880d681SAndroid Build Coastguard Worker// CSRs that are handled explicitly via copies.
876*9880d681SAndroid Build Coastguard Workerdef CSR_64_CXX_TLS_Darwin_ViaCopy : CalleeSavedRegs<(sub CSR_64_TLS_Darwin, RBP)>;
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Worker// All GPRs - except r11
879*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_MostRegs : CalleeSavedRegs<(add CSR_64, RAX, RCX, RDX, RSI, RDI,
880*9880d681SAndroid Build Coastguard Worker                                              R8, R9, R10, RSP)>;
881*9880d681SAndroid Build Coastguard Worker
882*9880d681SAndroid Build Coastguard Worker// All registers - except r11
883*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_AllRegs     : CalleeSavedRegs<(add CSR_64_RT_MostRegs,
884*9880d681SAndroid Build Coastguard Worker                                                 (sequence "XMM%u", 0, 15))>;
885*9880d681SAndroid Build Coastguard Workerdef CSR_64_RT_AllRegs_AVX : CalleeSavedRegs<(add CSR_64_RT_MostRegs,
886*9880d681SAndroid Build Coastguard Worker                                                 (sequence "YMM%u", 0, 15))>;
887*9880d681SAndroid Build Coastguard Worker
888*9880d681SAndroid Build Coastguard Workerdef CSR_64_MostRegs : CalleeSavedRegs<(add RBX, RCX, RDX, RSI, RDI, R8, R9, R10,
889*9880d681SAndroid Build Coastguard Worker                                           R11, R12, R13, R14, R15, RBP,
890*9880d681SAndroid Build Coastguard Worker                                           (sequence "XMM%u", 0, 15))>;
891*9880d681SAndroid Build Coastguard Worker
892*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs     : CalleeSavedRegs<(add EAX, EBX, ECX, EDX, EBP, ESI,
893*9880d681SAndroid Build Coastguard Worker                                              EDI)>;
894*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_SSE : CalleeSavedRegs<(add CSR_32_AllRegs,
895*9880d681SAndroid Build Coastguard Worker                                              (sequence "XMM%u", 0, 7))>;
896*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_AVX : CalleeSavedRegs<(add CSR_32_AllRegs,
897*9880d681SAndroid Build Coastguard Worker                                              (sequence "YMM%u", 0, 7))>;
898*9880d681SAndroid Build Coastguard Workerdef CSR_32_AllRegs_AVX512 : CalleeSavedRegs<(add CSR_32_AllRegs,
899*9880d681SAndroid Build Coastguard Worker                                                 (sequence "ZMM%u", 0, 7),
900*9880d681SAndroid Build Coastguard Worker                                                 (sequence "K%u", 0, 7))>;
901*9880d681SAndroid Build Coastguard Worker
902*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs     : CalleeSavedRegs<(add CSR_64_MostRegs, RAX)>;
903*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_AVX : CalleeSavedRegs<(sub (add CSR_64_MostRegs, RAX,
904*9880d681SAndroid Build Coastguard Worker                                                   (sequence "YMM%u", 0, 15)),
905*9880d681SAndroid Build Coastguard Worker                                              (sequence "XMM%u", 0, 15))>;
906*9880d681SAndroid Build Coastguard Workerdef CSR_64_AllRegs_AVX512 : CalleeSavedRegs<(sub (add CSR_64_MostRegs, RAX,
907*9880d681SAndroid Build Coastguard Worker                                                      (sequence "ZMM%u", 0, 31),
908*9880d681SAndroid Build Coastguard Worker                                                      (sequence "K%u", 0, 7)),
909*9880d681SAndroid Build Coastguard Worker                                                 (sequence "XMM%u", 0, 15))>;
910*9880d681SAndroid Build Coastguard Worker
911*9880d681SAndroid Build Coastguard Worker// Standard C + YMM6-15
912*9880d681SAndroid Build Coastguard Workerdef CSR_Win64_Intel_OCL_BI_AVX : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12,
913*9880d681SAndroid Build Coastguard Worker                                                  R13, R14, R15,
914*9880d681SAndroid Build Coastguard Worker                                                  (sequence "YMM%u", 6, 15))>;
915*9880d681SAndroid Build Coastguard Worker
916*9880d681SAndroid Build Coastguard Workerdef CSR_Win64_Intel_OCL_BI_AVX512 : CalleeSavedRegs<(add RBX, RBP, RDI, RSI,
917*9880d681SAndroid Build Coastguard Worker                                                     R12, R13, R14, R15,
918*9880d681SAndroid Build Coastguard Worker                                                     (sequence "ZMM%u", 6, 21),
919*9880d681SAndroid Build Coastguard Worker                                                     K4, K5, K6, K7)>;
920*9880d681SAndroid Build Coastguard Worker//Standard C + XMM 8-15
921*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI       : CalleeSavedRegs<(add CSR_64,
922*9880d681SAndroid Build Coastguard Worker                                                 (sequence "XMM%u", 8, 15))>;
923*9880d681SAndroid Build Coastguard Worker
924*9880d681SAndroid Build Coastguard Worker//Standard C + YMM 8-15
925*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI_AVX    : CalleeSavedRegs<(add CSR_64,
926*9880d681SAndroid Build Coastguard Worker                                                  (sequence "YMM%u", 8, 15))>;
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Workerdef CSR_64_Intel_OCL_BI_AVX512 : CalleeSavedRegs<(add RBX, RDI, RSI, R14, R15,
929*9880d681SAndroid Build Coastguard Worker                                                  (sequence "ZMM%u", 16, 31),
930*9880d681SAndroid Build Coastguard Worker                                                  K4, K5, K6, K7)>;
931*9880d681SAndroid Build Coastguard Worker
932*9880d681SAndroid Build Coastguard Worker// Only R12 is preserved for PHP calls in HHVM.
933*9880d681SAndroid Build Coastguard Workerdef CSR_64_HHVM : CalleeSavedRegs<(add R12)>;
934