blob: d48164d621604372787d5070b1e987bec894b1f9 [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>
17 : CCIf<!strconcat("State.getTarget().getSubtarget<PPCSubtarget>().", F), A>;
Hal Finkel940ab932014-02-28 00:27:01 +000018class CCIfNotSubtarget<string F, CCAction A>
19 : CCIf<!strconcat("!State.getTarget().getSubtarget<PPCSubtarget>().", F), A>;
Ulrich Weigand339d0592012-11-05 19:39:45 +000020
Chris Lattner4f2e4e02007-03-06 00:59:59 +000021//===----------------------------------------------------------------------===//
22// Return Value Calling Convention
23//===----------------------------------------------------------------------===//
24
25// Return-value convention for PowerPC
26def RetCC_PPC : CallingConv<[
Ulrich Weigand339d0592012-11-05 19:39:45 +000027 // On PPC64, integer return values are always promoted to i64
Hal Finkel940ab932014-02-28 00:27:01 +000028 CCIfType<[i32, i1], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
29 CCIfType<[i1], CCIfNotSubtarget<"isPPC64()", CCPromoteToType<i32>>>,
Ulrich Weigand339d0592012-11-05 19:39:45 +000030
Dale Johannesen92dcf1e2008-03-17 02:13:43 +000031 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Dale Johannesencf87e712008-03-17 17:11:08 +000032 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
Bill Schmidtdee1ef82013-01-17 19:34:57 +000033 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
Chris Lattner4f2e4e02007-03-06 00:59:59 +000034
Bill Schmidt6b2940b2013-01-17 17:45:19 +000035 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
36 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
Chris Lattner4f2e4e02007-03-06 00:59:59 +000037
38 // Vector types are always returned in V2.
Hal Finkel7811c612014-03-28 19:58:11 +000039 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>,
40 CCIfType<[v2f64, v2i64], CCAssignToReg<[VSH2]>>
Chris Lattner4f2e4e02007-03-06 00:59:59 +000041]>;
42
43
Bill Schmidtd89f6782013-08-26 19:42:51 +000044// Note that we don't currently have calling conventions for 64-bit
45// PowerPC, but handle all the complexities of the ABI in the lowering
46// logic. FIXME: See if the logic can be simplified with use of CCs.
47// This may require some extensions to current table generation.
48
Bill Schmidt8470b0f2013-08-30 22:18:55 +000049// Simple calling convention for 64-bit ELF PowerPC fast isel.
50// Only handle ints and floats. All ints are promoted to i64.
51// Vector types and quadword ints are not handled.
52def CC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000053 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidt8470b0f2013-08-30 22:18:55 +000054 CCIfType<[i8], CCPromoteToType<i64>>,
55 CCIfType<[i16], CCPromoteToType<i64>>,
56 CCIfType<[i32], CCPromoteToType<i64>>,
57 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
58 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
59]>;
60
Bill Schmidtd89f6782013-08-26 19:42:51 +000061// Simple return-value convention for 64-bit ELF PowerPC fast isel.
62// All small ints are promoted to i64. Vector types, quadword ints,
63// and multiple register returns are "supported" to avoid compile
64// errors, but none are handled by the fast selector.
65def RetCC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000066 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidtd89f6782013-08-26 19:42:51 +000067 CCIfType<[i8], CCPromoteToType<i64>>,
68 CCIfType<[i16], CCPromoteToType<i64>>,
69 CCIfType<[i32], CCPromoteToType<i64>>,
70 CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
71 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
72 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
73 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
Hal Finkel7811c612014-03-28 19:58:11 +000074 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>,
75 CCIfType<[v2f64, v2i64], CCAssignToReg<[VSH2]>>
Bill Schmidtd89f6782013-08-26 19:42:51 +000076]>;
77
Chris Lattner4f2e4e02007-03-06 00:59:59 +000078//===----------------------------------------------------------------------===//
Bill Schmidtef17c142013-02-06 17:33:58 +000079// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerb93960d2009-07-03 06:45:56 +000080//===----------------------------------------------------------------------===//
81
Bill Schmidtef17c142013-02-06 17:33:58 +000082def CC_PPC32_SVR4_Common : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000083 CCIfType<[i1], CCPromoteToType<i32>>,
84
Tilmann Schellerb93960d2009-07-03 06:45:56 +000085 // The ABI requires i64 to be passed in two adjacent registers with the first
86 // register having an odd register number.
Bill Schmidtef17c142013-02-06 17:33:58 +000087 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000088
89 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaaf25cf82010-02-16 01:50:18 +000090 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000091
92 // Make sure the i64 words from a long double are either both passed in
93 // registers or both passed on the stack.
Bill Schmidtef17c142013-02-06 17:33:58 +000094 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000095
96 // FP values are passed in F1 - F8.
97 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
98
99 // Split arguments have an alignment of 8 bytes on the stack.
100 CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
101
102 CCIfType<[i32], CCAssignToStack<4, 4>>,
103
104 // Floats are stored in double precision format, thus they have the same
105 // alignment and size as doubles.
106 CCIfType<[f32,f64], CCAssignToStack<8, 8>>,
107
108 // Vectors get 16-byte stack slots that are 16-byte aligned.
Hal Finkela6c8b512014-03-26 16:12:58 +0000109 CCIfType<[v16i8, v8i16, v4i32, v4f32, v2f64, v2i64], CCAssignToStack<16, 16>>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000110]>;
111
112// This calling convention puts vector arguments always on the stack. It is used
113// to assign vector arguments which belong to the variable portion of the
114// parameter list of a variable argument function.
Bill Schmidtef17c142013-02-06 17:33:58 +0000115def CC_PPC32_SVR4_VarArg : CallingConv<[
116 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000117]>;
118
Bill Schmidtef17c142013-02-06 17:33:58 +0000119// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
120// put vector arguments in vector registers before putting them on the stack.
121def CC_PPC32_SVR4 : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000122 // The first 12 Vector arguments are passed in AltiVec registers.
Hal Finkel7811c612014-03-28 19:58:11 +0000123 CCIfType<[v16i8, v8i16, v4i32, v4f32],
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000124 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13]>>,
Hal Finkel7811c612014-03-28 19:58:11 +0000125 CCIfType<[v2f64, v2i64],
126 CCAssignToReg<[VSH2, VSH3, VSH4, VSH5, VSH6, VSH7, VSH8, VSH9,
127 VSH10, VSH11, VSH12, VSH13]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000128
Bill Schmidtef17c142013-02-06 17:33:58 +0000129 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000130]>;
131
132// Helper "calling convention" to handle aggregate by value arguments.
133// Aggregate by value arguments are always placed in the local variable space
134// of the caller. This calling convention is only used to assign those stack
135// offsets in the callers stack frame.
136//
137// Still, the address of the aggregate copy in the callers stack frame is passed
138// in a GPR (or in the parameter list area if all GPRs are allocated) from the
139// caller to the callee. The location for the address argument is assigned by
Bill Schmidtef17c142013-02-06 17:33:58 +0000140// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000141//
Bill Schmidtef17c142013-02-06 17:33:58 +0000142// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000143// not passed by value.
144
Bill Schmidtef17c142013-02-06 17:33:58 +0000145def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000146 CCIfByVal<CCPassByVal<4, 4>>,
147
Bill Schmidtef17c142013-02-06 17:33:58 +0000148 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000149]>;
150
Hal Finkel52727c62013-07-02 03:39:34 +0000151def CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
152 V28, V29, V30, V31)>;
153
Roman Divackyef21be22012-03-06 16:41:49 +0000154def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
155 R21, R22, R23, R24, R25, R26, R27, R28,
156 R29, R30, R31, F14, F15, F16, F17, F18,
157 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000158 F27, F28, F29, F30, F31, CR2, CR3, CR4
159 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000160
Hal Finkel52727c62013-07-02 03:39:34 +0000161def CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>;
162
163def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
Roman Divackyef21be22012-03-06 16:41:49 +0000164 R21, R22, R23, R24, R25, R26, R27, R28,
165 R29, R30, R31, F14, F15, F16, F17, F18,
166 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000167 F27, F28, F29, F30, F31, CR2, CR3, CR4
168 )>;
169
170def CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
Roman Divackyef21be22012-03-06 16:41:49 +0000171
172def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
173 X21, X22, X23, X24, X25, X26, X27, X28,
174 X29, X30, X31, F14, F15, F16, F17, F18,
175 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000176 F27, F28, F29, F30, F31, CR2, CR3, CR4
177 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000178
Hal Finkel52727c62013-07-02 03:39:34 +0000179def CSR_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>;
180
181def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
Roman Divackyef21be22012-03-06 16:41:49 +0000182 X21, X22, X23, X24, X25, X26, X27, X28,
183 X29, X30, X31, F14, F15, F16, F17, F18,
184 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000185 F27, F28, F29, F30, F31, CR2, CR3, CR4
186 )>;
Hal Finkel756810f2013-03-21 21:37:52 +0000187
Hal Finkel756810f2013-03-21 21:37:52 +0000188
Hal Finkel52727c62013-07-02 03:39:34 +0000189def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>;
190
191def CSR_NoRegs : CalleeSavedRegs<(add)>;
Hal Finkel756810f2013-03-21 21:37:52 +0000192