blob: 2fd3ab672972d9ea9474fdb3ec3b99e4c1277817 [file] [log] [blame]
Chris Lattner72a364c2010-08-17 16:20:04 +00001//===- PPCCallingConv.td - Calling Conventions for PowerPC -*- tablegen -*-===//
Jia Liub22310f2012-02-18 12:03:15 +00002//
Chris Lattner4f2e4e02007-03-06 00:59:59 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jia Liub22310f2012-02-18 12:03:15 +00007//
Chris Lattner4f2e4e02007-03-06 00:59:59 +00008//===----------------------------------------------------------------------===//
9//
10// This describes the calling conventions for the PowerPC 32- and 64-bit
11// architectures.
12//
13//===----------------------------------------------------------------------===//
14
Ulrich Weigand339d0592012-11-05 19:39:45 +000015/// CCIfSubtarget - Match if the current subtarget has a feature F.
16class CCIfSubtarget<string F, CCAction A>
Eric Christopherb5217502014-08-06 18:45:26 +000017 : CCIf<!strconcat("static_cast<const PPCSubtarget&>"
18 "(State.getMachineFunction().getSubtarget()).",
19 F),
20 A>;
Hal Finkel940ab932014-02-28 00:27:01 +000021class CCIfNotSubtarget<string F, CCAction A>
Eric Christopherb5217502014-08-06 18:45:26 +000022 : CCIf<!strconcat("!static_cast<const PPCSubtarget&>"
23 "(State.getMachineFunction().getSubtarget()).",
24 F),
25 A>;
Ulrich Weigand339d0592012-11-05 19:39:45 +000026
Chris Lattner4f2e4e02007-03-06 00:59:59 +000027//===----------------------------------------------------------------------===//
28// Return Value Calling Convention
29//===----------------------------------------------------------------------===//
30
Hal Finkel934361a2015-01-14 01:07:51 +000031// PPC64 AnyReg return-value convention. No explicit register is specified for
32// the return-value. The register allocator is allowed and expected to choose
33// any free register.
34//
35// This calling convention is currently only supported by the stackmap and
36// patchpoint intrinsics. All other uses will result in an assert on Debug
37// builds. On Release builds we fallback to the PPC C calling convention.
38def RetCC_PPC64_AnyReg : CallingConv<[
39 CCCustom<"CC_PPC_AnyReg_Error">
40]>;
41
Chris Lattner4f2e4e02007-03-06 00:59:59 +000042// Return-value convention for PowerPC
43def RetCC_PPC : CallingConv<[
Hal Finkel934361a2015-01-14 01:07:51 +000044 CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
45
Ulrich Weigand339d0592012-11-05 19:39:45 +000046 // On PPC64, integer return values are always promoted to i64
Hal Finkel940ab932014-02-28 00:27:01 +000047 CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
48 CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>,
Ulrich Weigand339d0592012-11-05 19:39:45 +000049
Dale Johannesen92dcf1e2008-03-17 02:13:43 +000050 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Dale Johannesencf87e712008-03-17 17:11:08 +000051 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
Bill Schmidtdee1ef82013-01-17 19:34:57 +000052 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
Ulrich Weigand85d5df22014-07-21 00:13:26 +000053
54 // Floating point types returned as "direct" go into F1 .. F8; note that
55 // only the ELFv2 ABI fully utilizes all these registers.
56 CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
57 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
Hal Finkelc93a9a22015-02-25 01:06:45 +000058
59 // QPX vectors are returned in QF1 and QF2.
60 CCIfType<[v4f64, v4f32, v4i1],
61 CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>,
62
Ulrich Weigand85d5df22014-07-21 00:13:26 +000063 // Vector types returned as "direct" go into V2 .. V9; note that only the
64 // ELFv2 ABI fully utilizes all these registers.
Kit Bartond4eb73c2015-05-05 16:10:44 +000065 CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32],
66 CCIfSubtarget<"hasAltivec()",
Hal Finkelc93a9a22015-02-25 01:06:45 +000067 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
68 CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()",
69 CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9]>>>
Chris Lattner4f2e4e02007-03-06 00:59:59 +000070]>;
71
Hal Finkel934361a2015-01-14 01:07:51 +000072// No explicit register is specified for the AnyReg calling convention. The
73// register allocator may assign the arguments to any free register.
74//
75// This calling convention is currently only supported by the stackmap and
76// patchpoint intrinsics. All other uses will result in an assert on Debug
77// builds. On Release builds we fallback to the PPC C calling convention.
78def CC_PPC64_AnyReg : CallingConv<[
79 CCCustom<"CC_PPC_AnyReg_Error">
80]>;
Chris Lattner4f2e4e02007-03-06 00:59:59 +000081
Bill Schmidtd89f6782013-08-26 19:42:51 +000082// Note that we don't currently have calling conventions for 64-bit
83// PowerPC, but handle all the complexities of the ABI in the lowering
84// logic. FIXME: See if the logic can be simplified with use of CCs.
85// This may require some extensions to current table generation.
86
Bill Schmidt8470b0f2013-08-30 22:18:55 +000087// Simple calling convention for 64-bit ELF PowerPC fast isel.
88// Only handle ints and floats. All ints are promoted to i64.
89// Vector types and quadword ints are not handled.
90def CC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel934361a2015-01-14 01:07:51 +000091 CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_PPC64_AnyReg>>,
92
Hal Finkel940ab932014-02-28 00:27:01 +000093 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidt8470b0f2013-08-30 22:18:55 +000094 CCIfType<[i8], CCPromoteToType<i64>>,
95 CCIfType<[i16], CCPromoteToType<i64>>,
96 CCIfType<[i32], CCPromoteToType<i64>>,
97 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
98 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
99]>;
100
Bill Schmidtd89f6782013-08-26 19:42:51 +0000101// Simple return-value convention for 64-bit ELF PowerPC fast isel.
102// All small ints are promoted to i64. Vector types, quadword ints,
103// and multiple register returns are "supported" to avoid compile
104// errors, but none are handled by the fast selector.
105def RetCC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel934361a2015-01-14 01:07:51 +0000106 CCIfCC<"CallingConv::AnyReg", CCDelegateTo<RetCC_PPC64_AnyReg>>,
107
Hal Finkel940ab932014-02-28 00:27:01 +0000108 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidtd89f6782013-08-26 19:42:51 +0000109 CCIfType<[i8], CCPromoteToType<i64>>,
110 CCIfType<[i16], CCPromoteToType<i64>>,
111 CCIfType<[i32], CCPromoteToType<i64>>,
112 CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
113 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
Ulrich Weigand85d5df22014-07-21 00:13:26 +0000114 CCIfType<[f32], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
115 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
Hal Finkelc93a9a22015-02-25 01:06:45 +0000116 CCIfType<[v4f64, v4f32, v4i1],
117 CCIfSubtarget<"hasQPX()", CCAssignToReg<[QF1, QF2]>>>,
Kit Bartond4eb73c2015-05-05 16:10:44 +0000118 CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32],
119 CCIfSubtarget<"hasAltivec()",
Hal Finkelc93a9a22015-02-25 01:06:45 +0000120 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9]>>>,
121 CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()",
122 CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9]>>>
Bill Schmidtd89f6782013-08-26 19:42:51 +0000123]>;
124
Chris Lattner4f2e4e02007-03-06 00:59:59 +0000125//===----------------------------------------------------------------------===//
Bill Schmidtef17c142013-02-06 17:33:58 +0000126// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000127//===----------------------------------------------------------------------===//
128
Bill Schmidtef17c142013-02-06 17:33:58 +0000129def CC_PPC32_SVR4_Common : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +0000130 CCIfType<[i1], CCPromoteToType<i32>>,
131
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000132 // The ABI requires i64 to be passed in two adjacent registers with the first
133 // register having an odd register number.
Bill Schmidtef17c142013-02-06 17:33:58 +0000134 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000135
Hal Finkel965cea52015-07-12 00:37:44 +0000136 // The 'nest' parameter, if any, is passed in R11.
137 CCIfNest<CCAssignToReg<[R11]>>,
138
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000139 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaaf25cf82010-02-16 01:50:18 +0000140 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000141
142 // Make sure the i64 words from a long double are either both passed in
143 // registers or both passed on the stack.
Bill Schmidtef17c142013-02-06 17:33:58 +0000144 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000145
146 // FP values are passed in F1 - F8.
147 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
148
149 // Split arguments have an alignment of 8 bytes on the stack.
150 CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
151
152 CCIfType<[i32], CCAssignToStack<4, 4>>,
153
154 // Floats are stored in double precision format, thus they have the same
155 // alignment and size as doubles.
156 CCIfType<[f32,f64], CCAssignToStack<8, 8>>,
157
Hal Finkelc93a9a22015-02-25 01:06:45 +0000158 // QPX vectors that are stored in double precision need 32-byte alignment.
159 CCIfType<[v4f64, v4i1], CCAssignToStack<32, 32>>,
160
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000161 // Vectors get 16-byte stack slots that are 16-byte aligned.
Hal Finkela6c8b512014-03-26 16:12:58 +0000162 CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000163]>;
164
165// This calling convention puts vector arguments always on the stack. It is used
166// to assign vector arguments which belong to the variable portion of the
167// parameter list of a variable argument function.
Bill Schmidtef17c142013-02-06 17:33:58 +0000168def CC_PPC32_SVR4_VarArg : CallingConv<[
169 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000170]>;
171
Bill Schmidtef17c142013-02-06 17:33:58 +0000172// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
173// put vector arguments in vector registers before putting them on the stack.
174def CC_PPC32_SVR4 : CallingConv<[
Hal Finkelc93a9a22015-02-25 01:06:45 +0000175 // QPX vectors mirror the scalar FP convention.
176 CCIfType<[v4f64, v4f32, v4i1], CCIfSubtarget<"hasQPX()",
177 CCAssignToReg<[QF1, QF2, QF3, QF4, QF5, QF6, QF7, QF8]>>>,
178
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000179 // The first 12 Vector arguments are passed in AltiVec registers.
Kit Bartond4eb73c2015-05-05 16:10:44 +0000180 CCIfType<[v16i8, v8i16, v4i32, v2i64, v1i128, v4f32],
181 CCIfSubtarget<"hasAltivec()", CCAssignToReg<[V2, V3, V4, V5, V6, V7,
182 V8, V9, V10, V11, V12, V13]>>>,
Hal Finkelc93a9a22015-02-25 01:06:45 +0000183 CCIfType<[v2f64, v2i64], CCIfSubtarget<"hasVSX()",
Hal Finkel7811c612014-03-28 19:58:11 +0000184 CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9,
Hal Finkelc93a9a22015-02-25 01:06:45 +0000185 VSH10, VSH11, VSH12, VSH13]>>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000186
Bill Schmidtef17c142013-02-06 17:33:58 +0000187 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000188]>;
189
190// Helper "calling convention" to handle aggregate by value arguments.
191// Aggregate by value arguments are always placed in the local variable space
192// of the caller. This calling convention is only used to assign those stack
193// offsets in the callers stack frame.
194//
195// Still, the address of the aggregate copy in the callers stack frame is passed
196// in a GPR (or in the parameter list area if all GPRs are allocated) from the
197// caller to the callee. The location for the address argument is assigned by
Bill Schmidtef17c142013-02-06 17:33:58 +0000198// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000199//
Bill Schmidtef17c142013-02-06 17:33:58 +0000200// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000201// not passed by value.
202
Bill Schmidtef17c142013-02-06 17:33:58 +0000203def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000204 CCIfByVal<CCPassByVal<4, 4>>,
205
Bill Schmidtef17c142013-02-06 17:33:58 +0000206 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000207]>;
208
Hal Finkel52727c62013-07-02 03:39:34 +0000209def CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
210 V28, V29, V30, V31)>;
211
Roman Divackyef21be22012-03-06 16:41:49 +0000212def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
213 R21, R22, R23, R24, R25, R26, R27, R28,
214 R29, R30, R31, F14, F15, F16, F17, F18,
215 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000216 F27, F28, F29, F30, F31, CR2, CR3, CR4
217 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000218
Hal Finkel52727c62013-07-02 03:39:34 +0000219def CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>;
220
221def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
Roman Divackyef21be22012-03-06 16:41:49 +0000222 R21, R22, R23, R24, R25, R26, R27, R28,
223 R29, R30, R31, F14, F15, F16, F17, F18,
224 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000225 F27, F28, F29, F30, F31, CR2, CR3, CR4
226 )>;
227
228def CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
Roman Divackyef21be22012-03-06 16:41:49 +0000229
230def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
231 X21, X22, X23, X24, X25, X26, X27, X28,
232 X29, X30, X31, F14, F15, F16, F17, F18,
233 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000234 F27, F28, F29, F30, F31, CR2, CR3, CR4
235 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000236
Hal Finkel52727c62013-07-02 03:39:34 +0000237def CSR_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>;
238
239def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
Roman Divackyef21be22012-03-06 16:41:49 +0000240 X21, X22, X23, X24, X25, X26, X27, X28,
241 X29, X30, X31, F14, F15, F16, F17, F18,
242 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000243 F27, F28, F29, F30, F31, CR2, CR3, CR4
244 )>;
Hal Finkel756810f2013-03-21 21:37:52 +0000245
Chuang-Yu Cheng98c18942016-04-08 12:04:32 +0000246// CSRs that are handled by prologue, epilogue.
247def CSR_SRV464_TLS_PE : CalleeSavedRegs<(add)>;
248
249def CSR_SVR464_ViaCopy : CalleeSavedRegs<(add CSR_SVR464)>;
250
Hal Finkel52727c62013-07-02 03:39:34 +0000251def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>;
252
Chuang-Yu Cheng98c18942016-04-08 12:04:32 +0000253def CSR_SVR464_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_Altivec)>;
254
Hal Finkele6698d52015-02-01 15:03:28 +0000255def CSR_SVR464_R2 : CalleeSavedRegs<(add CSR_SVR464, X2)>;
256
Chuang-Yu Cheng98c18942016-04-08 12:04:32 +0000257def CSR_SVR464_R2_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2)>;
258
Hal Finkele6698d52015-02-01 15:03:28 +0000259def CSR_SVR464_R2_Altivec : CalleeSavedRegs<(add CSR_SVR464_Altivec, X2)>;
260
Chuang-Yu Cheng98c18942016-04-08 12:04:32 +0000261def CSR_SVR464_R2_Altivec_ViaCopy : CalleeSavedRegs<(add CSR_SVR464_R2_Altivec)>;
262
Hal Finkel52727c62013-07-02 03:39:34 +0000263def CSR_NoRegs : CalleeSavedRegs<(add)>;
Hal Finkel756810f2013-03-21 21:37:52 +0000264
Hal Finkel934361a2015-01-14 01:07:51 +0000265def CSR_64_AllRegs: CalleeSavedRegs<(add X0, (sequence "X%u", 3, 10),
266 (sequence "X%u", 14, 31),
267 (sequence "F%u", 0, 31),
268 (sequence "CR%u", 0, 7))>;
269
270def CSR_64_AllRegs_Altivec : CalleeSavedRegs<(add CSR_64_AllRegs,
271 (sequence "V%u", 0, 31))>;
272
273def CSR_64_AllRegs_VSX : CalleeSavedRegs<(add CSR_64_AllRegs_Altivec,
274 (sequence "VSL%u", 0, 31),
275 (sequence "VSH%u", 0, 31))>;
276