xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64CallingConvention.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- AArch64CallingConv.td - Calling Conventions for AArch64 -*- 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 AArch64 architecture.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker/// CCIfAlign - Match of the original alignment of the arg
15*9880d681SAndroid Build Coastguard Workerclass CCIfAlign<string Align, CCAction A> :
16*9880d681SAndroid Build Coastguard Worker  CCIf<!strconcat("ArgFlags.getOrigAlign() == ", Align), A>;
17*9880d681SAndroid Build Coastguard Worker/// CCIfBigEndian - Match only if we're in big endian mode.
18*9880d681SAndroid Build Coastguard Workerclass CCIfBigEndian<CCAction A> :
19*9880d681SAndroid Build Coastguard Worker  CCIf<"State.getMachineFunction().getDataLayout().isBigEndian()", A>;
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
22*9880d681SAndroid Build Coastguard Worker// ARM AAPCS64 Calling Convention
23*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_AAPCS : CallingConv<[
26*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
27*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>,
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  // Big endian vectors must be passed as if they were 1-element vectors so that
30*9880d681SAndroid Build Coastguard Worker  // their lanes are in a consistent order.
31*9880d681SAndroid Build Coastguard Worker  CCIfBigEndian<CCIfType<[v2i32, v2f32, v4i16, v4f16, v8i8],
32*9880d681SAndroid Build Coastguard Worker                         CCBitConvertToType<f64>>>,
33*9880d681SAndroid Build Coastguard Worker  CCIfBigEndian<CCIfType<[v2i64, v2f64, v4i32, v4f32, v8i16, v8f16, v16i8],
34*9880d681SAndroid Build Coastguard Worker                         CCBitConvertToType<f128>>>,
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker  // An SRet is passed in X8, not X0 like a normal pointer parameter.
37*9880d681SAndroid Build Coastguard Worker  CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[X8], [W8]>>>,
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  // Put ByVal arguments directly on the stack. Minimum size and alignment of a
40*9880d681SAndroid Build Coastguard Worker  // slot is 64-bit.
41*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<8, 8>>,
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  // The 'nest' parameter, if any, is passed in X18.
44*9880d681SAndroid Build Coastguard Worker  // Darwin uses X18 as the platform register and hence 'nest' isn't currently
45*9880d681SAndroid Build Coastguard Worker  // supported there.
46*9880d681SAndroid Build Coastguard Worker  CCIfNest<CCAssignToReg<[X18]>>,
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker  // Pass SwiftSelf in a callee saved register.
49*9880d681SAndroid Build Coastguard Worker  CCIfSwiftSelf<CCIfType<[i64], CCAssignToRegWithShadow<[X20], [W20]>>>,
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Block">>,
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  // Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers,
54*9880d681SAndroid Build Coastguard Worker  // up to eight each of GPR and FPR.
55*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
56*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
57*9880d681SAndroid Build Coastguard Worker                                          [X0, X1, X2, X3, X4, X5, X6, X7]>>,
58*9880d681SAndroid Build Coastguard Worker  // i128 is split to two i64s, we can't fit half to register X7.
59*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSplit<CCAssignToRegWithShadow<[X0, X2, X4, X6],
60*9880d681SAndroid Build Coastguard Worker                                                    [X0, X1, X3, X5]>>>,
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker  // i128 is split to two i64s, and its stack alignment is 16 bytes.
63*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSplit<CCAssignToStackWithShadow<8, 16, [X7]>>>,
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
66*9880d681SAndroid Build Coastguard Worker                                          [W0, W1, W2, W3, W4, W5, W6, W7]>>,
67*9880d681SAndroid Build Coastguard Worker  CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7],
68*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
69*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7],
70*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
71*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
72*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
73*9880d681SAndroid Build Coastguard Worker  CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16],
74*9880d681SAndroid Build Coastguard Worker           CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
75*9880d681SAndroid Build Coastguard Worker                                   [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
76*9880d681SAndroid Build Coastguard Worker  CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
77*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker  // If more than will fit in registers, pass them on the stack instead.
80*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16, f16], CCAssignToStack<8, 8>>,
81*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<8, 8>>,
82*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64, v1f64, v2f32, v1i64, v2i32, v4i16, v8i8, v4f16],
83*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<8, 8>>,
84*9880d681SAndroid Build Coastguard Worker  CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
85*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<16, 16>>
86*9880d681SAndroid Build Coastguard Worker]>;
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdef RetCC_AArch64_AAPCS : CallingConv<[
89*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
90*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f64, v4f32], CCBitConvertToType<v2i64>>,
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker  CCIfSwiftError<CCIfType<[i64], CCAssignToRegWithShadow<[X19], [W19]>>>,
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker  // Big endian vectors must be passed as if they were 1-element vectors so that
95*9880d681SAndroid Build Coastguard Worker  // their lanes are in a consistent order.
96*9880d681SAndroid Build Coastguard Worker  CCIfBigEndian<CCIfType<[v2i32, v2f32, v4i16, v4f16, v8i8],
97*9880d681SAndroid Build Coastguard Worker                         CCBitConvertToType<f64>>>,
98*9880d681SAndroid Build Coastguard Worker  CCIfBigEndian<CCIfType<[v2i64, v2f64, v4i32, v4f32, v8i16, v8f16, v16i8],
99*9880d681SAndroid Build Coastguard Worker                         CCBitConvertToType<f128>>>,
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
102*9880d681SAndroid Build Coastguard Worker                                          [X0, X1, X2, X3, X4, X5, X6, X7]>>,
103*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
104*9880d681SAndroid Build Coastguard Worker                                          [W0, W1, W2, W3, W4, W5, W6, W7]>>,
105*9880d681SAndroid Build Coastguard Worker  CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7],
106*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
107*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7],
108*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
109*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
110*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
111*9880d681SAndroid Build Coastguard Worker  CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16],
112*9880d681SAndroid Build Coastguard Worker      CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
113*9880d681SAndroid Build Coastguard Worker                              [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
114*9880d681SAndroid Build Coastguard Worker  CCIfType<[f128, v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
115*9880d681SAndroid Build Coastguard Worker      CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>
116*9880d681SAndroid Build Coastguard Worker]>;
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker// Darwin uses a calling convention which differs in only two ways
120*9880d681SAndroid Build Coastguard Worker// from the standard one at this level:
121*9880d681SAndroid Build Coastguard Worker//     + i128s (i.e. split i64s) don't need even registers.
122*9880d681SAndroid Build Coastguard Worker//     + Stack slots are sized as needed rather than being at least 64-bit.
123*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_DarwinPCS : CallingConv<[
124*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
125*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>,
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker  // An SRet is passed in X8, not X0 like a normal pointer parameter.
128*9880d681SAndroid Build Coastguard Worker  CCIfSRet<CCIfType<[i64], CCAssignToRegWithShadow<[X8], [W8]>>>,
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker  // Put ByVal arguments directly on the stack. Minimum size and alignment of a
131*9880d681SAndroid Build Coastguard Worker  // slot is 64-bit.
132*9880d681SAndroid Build Coastguard Worker  CCIfByVal<CCPassByVal<8, 8>>,
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  // Pass SwiftSelf in a callee saved register.
135*9880d681SAndroid Build Coastguard Worker  CCIfSwiftSelf<CCIfType<[i64], CCAssignToRegWithShadow<[X20], [W20]>>>,
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker  // A SwiftError is passed in X19.
138*9880d681SAndroid Build Coastguard Worker  CCIfSwiftError<CCIfType<[i64], CCAssignToRegWithShadow<[X19], [W19]>>>,
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker  CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Block">>,
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker  // Handle i1, i8, i16, i32, i64, f32, f64 and v2f64 by passing in registers,
143*9880d681SAndroid Build Coastguard Worker  // up to eight each of GPR and FPR.
144*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
145*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
146*9880d681SAndroid Build Coastguard Worker                                          [X0, X1, X2, X3, X4, X5, X6, X7]>>,
147*9880d681SAndroid Build Coastguard Worker  // i128 is split to two i64s, we can't fit half to register X7.
148*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64],
149*9880d681SAndroid Build Coastguard Worker           CCIfSplit<CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6],
150*9880d681SAndroid Build Coastguard Worker                                             [W0, W1, W2, W3, W4, W5, W6]>>>,
151*9880d681SAndroid Build Coastguard Worker  // i128 is split to two i64s, and its stack alignment is 16 bytes.
152*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSplit<CCAssignToStackWithShadow<8, 16, [X7]>>>,
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
155*9880d681SAndroid Build Coastguard Worker                                          [W0, W1, W2, W3, W4, W5, W6, W7]>>,
156*9880d681SAndroid Build Coastguard Worker  CCIfType<[f16], CCAssignToRegWithShadow<[H0, H1, H2, H3, H4, H5, H6, H7],
157*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
158*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7],
159*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
160*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
161*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
162*9880d681SAndroid Build Coastguard Worker  CCIfType<[v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16],
163*9880d681SAndroid Build Coastguard Worker           CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
164*9880d681SAndroid Build Coastguard Worker                                   [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
165*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
166*9880d681SAndroid Build Coastguard Worker           CCAssignToReg<[Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  // If more than will fit in registers, pass them on the stack instead.
169*9880d681SAndroid Build Coastguard Worker  CCIf<"ValVT == MVT::i1 || ValVT == MVT::i8", CCAssignToStack<1, 1>>,
170*9880d681SAndroid Build Coastguard Worker  CCIf<"ValVT == MVT::i16 || ValVT == MVT::f16", CCAssignToStack<2, 2>>,
171*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
172*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64, v1f64, v2f32, v1i64, v2i32, v4i16, v8i8, v4f16],
173*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<8, 8>>,
174*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
175*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<16, 16>>
176*9880d681SAndroid Build Coastguard Worker]>;
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_DarwinPCS_VarArg : CallingConv<[
179*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f32], CCBitConvertToType<v2i32>>,
180*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f64, v4f32, f128], CCBitConvertToType<v2i64>>,
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker  CCIfConsecutiveRegs<CCCustom<"CC_AArch64_Custom_Stack_Block">>,
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Worker  // Handle all scalar types as either i64 or f64.
185*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
186*9880d681SAndroid Build Coastguard Worker  CCIfType<[f16, f32],     CCPromoteToType<f64>>,
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker  // Everything is on the stack.
189*9880d681SAndroid Build Coastguard Worker  // i128 is split to two i64s, and its stack alignment is 16 bytes.
190*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCIfSplit<CCAssignToStack<8, 16>>>,
191*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64, v1i64, v2i32, v4i16, v8i8, v1f64, v2f32, v4f16],
192*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<8, 8>>,
193*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, v2f64, v8f16],
194*9880d681SAndroid Build Coastguard Worker           CCAssignToStack<16, 16>>
195*9880d681SAndroid Build Coastguard Worker]>;
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker// The WebKit_JS calling convention only passes the first argument (the callee)
198*9880d681SAndroid Build Coastguard Worker// in register and the remaining arguments on stack. We allow 32bit stack slots,
199*9880d681SAndroid Build Coastguard Worker// so that WebKit can write partial values in the stack and define the other
200*9880d681SAndroid Build Coastguard Worker// 32bit quantity as undef.
201*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_WebKit_JS : CallingConv<[
202*9880d681SAndroid Build Coastguard Worker  // Handle i1, i8, i16, i32, and i64 passing in register X0 (W0).
203*9880d681SAndroid Build Coastguard Worker  CCIfType<[i1, i8, i16], CCPromoteToType<i32>>,
204*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[W0], [X0]>>,
205*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[X0], [W0]>>,
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker  // Pass the remaining arguments on the stack instead.
208*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
209*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64, f64], CCAssignToStack<8, 8>>
210*9880d681SAndroid Build Coastguard Worker]>;
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdef RetCC_AArch64_WebKit_JS : CallingConv<[
213*9880d681SAndroid Build Coastguard Worker  CCIfType<[i32], CCAssignToRegWithShadow<[W0, W1, W2, W3, W4, W5, W6, W7],
214*9880d681SAndroid Build Coastguard Worker                                          [X0, X1, X2, X3, X4, X5, X6, X7]>>,
215*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToRegWithShadow<[X0, X1, X2, X3, X4, X5, X6, X7],
216*9880d681SAndroid Build Coastguard Worker                                          [W0, W1, W2, W3, W4, W5, W6, W7]>>,
217*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToRegWithShadow<[S0, S1, S2, S3, S4, S5, S6, S7],
218*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>,
219*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToRegWithShadow<[D0, D1, D2, D3, D4, D5, D6, D7],
220*9880d681SAndroid Build Coastguard Worker                                          [Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7]>>
221*9880d681SAndroid Build Coastguard Worker]>;
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
224*9880d681SAndroid Build Coastguard Worker// ARM64 Calling Convention for GHC
225*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker// This calling convention is specific to the Glasgow Haskell Compiler.
228*9880d681SAndroid Build Coastguard Worker// The only documentation is the GHC source code, specifically the C header
229*9880d681SAndroid Build Coastguard Worker// file:
230*9880d681SAndroid Build Coastguard Worker//
231*9880d681SAndroid Build Coastguard Worker//     https://github.com/ghc/ghc/blob/master/includes/stg/MachRegs.h
232*9880d681SAndroid Build Coastguard Worker//
233*9880d681SAndroid Build Coastguard Worker// which defines the registers for the Spineless Tagless G-Machine (STG) that
234*9880d681SAndroid Build Coastguard Worker// GHC uses to implement lazy evaluation. The generic STG machine has a set of
235*9880d681SAndroid Build Coastguard Worker// registers which are mapped to appropriate set of architecture specific
236*9880d681SAndroid Build Coastguard Worker// registers for each CPU architecture.
237*9880d681SAndroid Build Coastguard Worker//
238*9880d681SAndroid Build Coastguard Worker// The STG Machine is documented here:
239*9880d681SAndroid Build Coastguard Worker//
240*9880d681SAndroid Build Coastguard Worker//    https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/GeneratedCode
241*9880d681SAndroid Build Coastguard Worker//
242*9880d681SAndroid Build Coastguard Worker// The AArch64 register mapping is under the heading "The ARMv8/AArch64 ABI
243*9880d681SAndroid Build Coastguard Worker// register mapping".
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdef CC_AArch64_GHC : CallingConv<[
246*9880d681SAndroid Build Coastguard Worker  // Handle all vector types as either f64 or v2f64.
247*9880d681SAndroid Build Coastguard Worker  CCIfType<[v1i64, v2i32, v4i16, v8i8, v2f32], CCBitConvertToType<f64>>,
248*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2i64, v4i32, v8i16, v16i8, v4f32, f128], CCBitConvertToType<v2f64>>,
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker  CCIfType<[v2f64], CCAssignToReg<[Q4, Q5]>>,
251*9880d681SAndroid Build Coastguard Worker  CCIfType<[f32], CCAssignToReg<[S8, S9, S10, S11]>>,
252*9880d681SAndroid Build Coastguard Worker  CCIfType<[f64], CCAssignToReg<[D12, D13, D14, D15]>>,
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker  // Promote i8/i16/i32 arguments to i64.
255*9880d681SAndroid Build Coastguard Worker  CCIfType<[i8, i16, i32], CCPromoteToType<i64>>,
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker  // Pass in STG registers: Base, Sp, Hp, R1, R2, R3, R4, R5, R6, SpLim
258*9880d681SAndroid Build Coastguard Worker  CCIfType<[i64], CCAssignToReg<[X19, X20, X21, X22, X23, X24, X25, X26, X27, X28]>>
259*9880d681SAndroid Build Coastguard Worker]>;
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker// FIXME: LR is only callee-saved in the sense that *we* preserve it and are
262*9880d681SAndroid Build Coastguard Worker// presumably a callee to someone. External functions may not do so, but this
263*9880d681SAndroid Build Coastguard Worker// is currently safe since BL has LR as an implicit-def and what happens after a
264*9880d681SAndroid Build Coastguard Worker// tail call doesn't matter.
265*9880d681SAndroid Build Coastguard Worker//
266*9880d681SAndroid Build Coastguard Worker// It would be better to model its preservation semantics properly (create a
267*9880d681SAndroid Build Coastguard Worker// vreg on entry, use it in RET & tail call generation; make that vreg def if we
268*9880d681SAndroid Build Coastguard Worker// end up saving LR as part of a call frame). Watch this space...
269*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS : CalleeSavedRegs<(add LR, FP, X19, X20, X21, X22,
270*9880d681SAndroid Build Coastguard Worker                                           X23, X24, X25, X26, X27, X28,
271*9880d681SAndroid Build Coastguard Worker                                           D8,  D9,  D10, D11,
272*9880d681SAndroid Build Coastguard Worker                                           D12, D13, D14, D15)>;
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker// Constructors and destructors return 'this' in the iOS 64-bit C++ ABI; since
275*9880d681SAndroid Build Coastguard Worker// 'this' and the pointer return value are both passed in X0 in these cases,
276*9880d681SAndroid Build Coastguard Worker// this can be partially modelled by treating X0 as a callee-saved register;
277*9880d681SAndroid Build Coastguard Worker// only the resulting RegMask is used; the SaveList is ignored
278*9880d681SAndroid Build Coastguard Worker//
279*9880d681SAndroid Build Coastguard Worker// (For generic ARM 64-bit ABI code, clang will not generate constructors or
280*9880d681SAndroid Build Coastguard Worker// destructors with 'this' returns, so this RegMask will not be used in that
281*9880d681SAndroid Build Coastguard Worker// case)
282*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS_ThisReturn : CalleeSavedRegs<(add CSR_AArch64_AAPCS, X0)>;
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AAPCS_SwiftError
285*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(sub CSR_AArch64_AAPCS, X19)>;
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker// The function used by Darwin to obtain the address of a thread-local variable
288*9880d681SAndroid Build Coastguard Worker// guarantees more than a normal AAPCS function. x16 and x17 are used on the
289*9880d681SAndroid Build Coastguard Worker// fast path for calculation, but other registers except X0 (argument/return)
290*9880d681SAndroid Build Coastguard Worker// and LR (it is a call, after all) are preserved.
291*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_TLS_Darwin
292*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(add (sub (sequence "X%u", 1, 28), X16, X17),
293*9880d681SAndroid Build Coastguard Worker                           FP,
294*9880d681SAndroid Build Coastguard Worker                           (sequence "Q%u", 0, 31))>;
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker// We can only handle a register pair with adjacent registers, the register pair
297*9880d681SAndroid Build Coastguard Worker// should belong to the same class as well. Since the access function on the
298*9880d681SAndroid Build Coastguard Worker// fast path calls a function that follows CSR_AArch64_TLS_Darwin,
299*9880d681SAndroid Build Coastguard Worker// CSR_AArch64_CXX_TLS_Darwin should be a subset of CSR_AArch64_TLS_Darwin.
300*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin
301*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(add CSR_AArch64_AAPCS,
302*9880d681SAndroid Build Coastguard Worker                           (sub (sequence "X%u", 1, 28), X15, X16, X17, X18),
303*9880d681SAndroid Build Coastguard Worker                           (sequence "D%u", 0, 31))>;
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker// CSRs that are handled by prologue, epilogue.
306*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin_PE
307*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(add LR, FP)>;
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker// CSRs that are handled explicitly via copies.
310*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_CXX_TLS_Darwin_ViaCopy
311*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(sub CSR_AArch64_CXX_TLS_Darwin, LR, FP)>;
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker// The ELF stub used for TLS-descriptor access saves every feasible
314*9880d681SAndroid Build Coastguard Worker// register. Only X0 and LR are clobbered.
315*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_TLS_ELF
316*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(add (sequence "X%u", 1, 28), FP,
317*9880d681SAndroid Build Coastguard Worker                           (sequence "Q%u", 0, 31))>;
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_AllRegs
320*9880d681SAndroid Build Coastguard Worker    : CalleeSavedRegs<(add (sequence "W%u", 0, 30), WSP,
321*9880d681SAndroid Build Coastguard Worker                           (sequence "X%u", 0, 28), FP, LR, SP,
322*9880d681SAndroid Build Coastguard Worker                           (sequence "B%u", 0, 31), (sequence "H%u", 0, 31),
323*9880d681SAndroid Build Coastguard Worker                           (sequence "S%u", 0, 31), (sequence "D%u", 0, 31),
324*9880d681SAndroid Build Coastguard Worker                           (sequence "Q%u", 0, 31))>;
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_NoRegs : CalleeSavedRegs<(add)>;
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Workerdef CSR_AArch64_RT_MostRegs :  CalleeSavedRegs<(add CSR_AArch64_AAPCS,
329*9880d681SAndroid Build Coastguard Worker                                                (sequence "X%u", 9, 15))>;
330*9880d681SAndroid Build Coastguard Worker
331