blob: 7852d895b51956d1eee11c1b09dfeba96494ef27 [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.
39 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>
40]>;
41
42
Bill Schmidtd89f6782013-08-26 19:42:51 +000043// Note that we don't currently have calling conventions for 64-bit
44// PowerPC, but handle all the complexities of the ABI in the lowering
45// logic. FIXME: See if the logic can be simplified with use of CCs.
46// This may require some extensions to current table generation.
47
Bill Schmidt8470b0f2013-08-30 22:18:55 +000048// Simple calling convention for 64-bit ELF PowerPC fast isel.
49// Only handle ints and floats. All ints are promoted to i64.
50// Vector types and quadword ints are not handled.
51def CC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000052 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidt8470b0f2013-08-30 22:18:55 +000053 CCIfType<[i8], CCPromoteToType<i64>>,
54 CCIfType<[i16], CCPromoteToType<i64>>,
55 CCIfType<[i32], CCPromoteToType<i64>>,
56 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6, X7, X8, X9, X10]>>,
57 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>
58]>;
59
Bill Schmidtd89f6782013-08-26 19:42:51 +000060// Simple return-value convention for 64-bit ELF PowerPC fast isel.
61// All small ints are promoted to i64. Vector types, quadword ints,
62// and multiple register returns are "supported" to avoid compile
63// errors, but none are handled by the fast selector.
64def RetCC_PPC64_ELF_FIS : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000065 CCIfType<[i1], CCPromoteToType<i64>>,
Bill Schmidtd89f6782013-08-26 19:42:51 +000066 CCIfType<[i8], CCPromoteToType<i64>>,
67 CCIfType<[i16], CCPromoteToType<i64>>,
68 CCIfType<[i32], CCPromoteToType<i64>>,
69 CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
70 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
71 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
72 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
73 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>
74]>;
75
Chris Lattner4f2e4e02007-03-06 00:59:59 +000076//===----------------------------------------------------------------------===//
Bill Schmidtef17c142013-02-06 17:33:58 +000077// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerb93960d2009-07-03 06:45:56 +000078//===----------------------------------------------------------------------===//
79
Bill Schmidtef17c142013-02-06 17:33:58 +000080def CC_PPC32_SVR4_Common : CallingConv<[
Hal Finkel940ab932014-02-28 00:27:01 +000081 CCIfType<[i1], CCPromoteToType<i32>>,
82
Tilmann Schellerb93960d2009-07-03 06:45:56 +000083 // The ABI requires i64 to be passed in two adjacent registers with the first
84 // register having an odd register number.
Bill Schmidtef17c142013-02-06 17:33:58 +000085 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000086
87 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaaf25cf82010-02-16 01:50:18 +000088 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000089
90 // Make sure the i64 words from a long double are either both passed in
91 // registers or both passed on the stack.
Bill Schmidtef17c142013-02-06 17:33:58 +000092 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000093
94 // FP values are passed in F1 - F8.
95 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
96
97 // Split arguments have an alignment of 8 bytes on the stack.
98 CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
99
100 CCIfType<[i32], CCAssignToStack<4, 4>>,
101
102 // Floats are stored in double precision format, thus they have the same
103 // alignment and size as doubles.
104 CCIfType<[f32,f64], CCAssignToStack<8, 8>>,
105
106 // Vectors get 16-byte stack slots that are 16-byte aligned.
107 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToStack<16, 16>>
108]>;
109
110// This calling convention puts vector arguments always on the stack. It is used
111// to assign vector arguments which belong to the variable portion of the
112// parameter list of a variable argument function.
Bill Schmidtef17c142013-02-06 17:33:58 +0000113def CC_PPC32_SVR4_VarArg : CallingConv<[
114 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000115]>;
116
Bill Schmidtef17c142013-02-06 17:33:58 +0000117// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
118// put vector arguments in vector registers before putting them on the stack.
119def CC_PPC32_SVR4 : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000120 // The first 12 Vector arguments are passed in AltiVec registers.
121 CCIfType<[v16i8, v8i16, v4i32, v4f32],
122 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13]>>,
123
Bill Schmidtef17c142013-02-06 17:33:58 +0000124 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000125]>;
126
127// Helper "calling convention" to handle aggregate by value arguments.
128// Aggregate by value arguments are always placed in the local variable space
129// of the caller. This calling convention is only used to assign those stack
130// offsets in the callers stack frame.
131//
132// Still, the address of the aggregate copy in the callers stack frame is passed
133// in a GPR (or in the parameter list area if all GPRs are allocated) from the
134// caller to the callee. The location for the address argument is assigned by
Bill Schmidtef17c142013-02-06 17:33:58 +0000135// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000136//
Bill Schmidtef17c142013-02-06 17:33:58 +0000137// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000138// not passed by value.
139
Bill Schmidtef17c142013-02-06 17:33:58 +0000140def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000141 CCIfByVal<CCPassByVal<4, 4>>,
142
Bill Schmidtef17c142013-02-06 17:33:58 +0000143 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000144]>;
145
Hal Finkel52727c62013-07-02 03:39:34 +0000146def CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
147 V28, V29, V30, V31)>;
148
Roman Divackyef21be22012-03-06 16:41:49 +0000149def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
150 R21, R22, R23, R24, R25, R26, R27, R28,
151 R29, R30, R31, F14, F15, F16, F17, F18,
152 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000153 F27, F28, F29, F30, F31, CR2, CR3, CR4
154 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000155
Hal Finkel52727c62013-07-02 03:39:34 +0000156def CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>;
157
158def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
Roman Divackyef21be22012-03-06 16:41:49 +0000159 R21, R22, R23, R24, R25, R26, R27, R28,
160 R29, R30, R31, F14, F15, F16, F17, F18,
161 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000162 F27, F28, F29, F30, F31, CR2, CR3, CR4
163 )>;
164
165def CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
Roman Divackyef21be22012-03-06 16:41:49 +0000166
167def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
168 X21, X22, X23, X24, X25, X26, X27, X28,
169 X29, X30, X31, F14, F15, F16, F17, F18,
170 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000171 F27, F28, F29, F30, F31, CR2, CR3, CR4
172 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000173
Hal Finkel52727c62013-07-02 03:39:34 +0000174def CSR_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>;
175
176def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
Roman Divackyef21be22012-03-06 16:41:49 +0000177 X21, X22, X23, X24, X25, X26, X27, X28,
178 X29, X30, X31, F14, F15, F16, F17, F18,
179 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000180 F27, F28, F29, F30, F31, CR2, CR3, CR4
181 )>;
Hal Finkel756810f2013-03-21 21:37:52 +0000182
Hal Finkel756810f2013-03-21 21:37:52 +0000183
Hal Finkel52727c62013-07-02 03:39:34 +0000184def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>;
185
186def CSR_NoRegs : CalleeSavedRegs<(add)>;
Hal Finkel756810f2013-03-21 21:37:52 +0000187