blob: 9c937edee4cc9e2b6bbd8440a8f4aab08ed887c9 [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>;
18
Chris Lattner4f2e4e02007-03-06 00:59:59 +000019//===----------------------------------------------------------------------===//
20// Return Value Calling Convention
21//===----------------------------------------------------------------------===//
22
23// Return-value convention for PowerPC
24def RetCC_PPC : CallingConv<[
Ulrich Weigand339d0592012-11-05 19:39:45 +000025 // On PPC64, integer return values are always promoted to i64
26 CCIfType<[i32], CCIfSubtarget<"isPPC64()", CCPromoteToType<i64>>>,
27
Dale Johannesen92dcf1e2008-03-17 02:13:43 +000028 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Dale Johannesencf87e712008-03-17 17:11:08 +000029 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
Bill Schmidtdee1ef82013-01-17 19:34:57 +000030 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
Chris Lattner4f2e4e02007-03-06 00:59:59 +000031
Bill Schmidt6b2940b2013-01-17 17:45:19 +000032 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
33 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
Chris Lattner4f2e4e02007-03-06 00:59:59 +000034
35 // Vector types are always returned in V2.
36 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>
37]>;
38
39
Bill Schmidtd89f6782013-08-26 19:42:51 +000040// Note that we don't currently have calling conventions for 64-bit
41// PowerPC, but handle all the complexities of the ABI in the lowering
42// logic. FIXME: See if the logic can be simplified with use of CCs.
43// This may require some extensions to current table generation.
44
45// Simple return-value convention for 64-bit ELF PowerPC fast isel.
46// All small ints are promoted to i64. Vector types, quadword ints,
47// and multiple register returns are "supported" to avoid compile
48// errors, but none are handled by the fast selector.
49def RetCC_PPC64_ELF_FIS : CallingConv<[
50 CCIfType<[i8], CCPromoteToType<i64>>,
51 CCIfType<[i16], CCPromoteToType<i64>>,
52 CCIfType<[i32], CCPromoteToType<i64>>,
53 CCIfType<[i64], CCAssignToReg<[X3, X4]>>,
54 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
55 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
56 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
57 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToReg<[V2]>>
58]>;
59
Chris Lattner4f2e4e02007-03-06 00:59:59 +000060//===----------------------------------------------------------------------===//
Bill Schmidtef17c142013-02-06 17:33:58 +000061// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerb93960d2009-07-03 06:45:56 +000062//===----------------------------------------------------------------------===//
63
Bill Schmidtef17c142013-02-06 17:33:58 +000064def CC_PPC32_SVR4_Common : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +000065 // The ABI requires i64 to be passed in two adjacent registers with the first
66 // register having an odd register number.
Bill Schmidtef17c142013-02-06 17:33:58 +000067 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000068
69 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaaf25cf82010-02-16 01:50:18 +000070 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000071
72 // Make sure the i64 words from a long double are either both passed in
73 // registers or both passed on the stack.
Bill Schmidtef17c142013-02-06 17:33:58 +000074 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000075
76 // FP values are passed in F1 - F8.
77 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
78
79 // Split arguments have an alignment of 8 bytes on the stack.
80 CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
81
82 CCIfType<[i32], CCAssignToStack<4, 4>>,
83
84 // Floats are stored in double precision format, thus they have the same
85 // alignment and size as doubles.
86 CCIfType<[f32,f64], CCAssignToStack<8, 8>>,
87
88 // Vectors get 16-byte stack slots that are 16-byte aligned.
89 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToStack<16, 16>>
90]>;
91
92// This calling convention puts vector arguments always on the stack. It is used
93// to assign vector arguments which belong to the variable portion of the
94// parameter list of a variable argument function.
Bill Schmidtef17c142013-02-06 17:33:58 +000095def CC_PPC32_SVR4_VarArg : CallingConv<[
96 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +000097]>;
98
Bill Schmidtef17c142013-02-06 17:33:58 +000099// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
100// put vector arguments in vector registers before putting them on the stack.
101def CC_PPC32_SVR4 : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000102 // The first 12 Vector arguments are passed in AltiVec registers.
103 CCIfType<[v16i8, v8i16, v4i32, v4f32],
104 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13]>>,
105
Bill Schmidtef17c142013-02-06 17:33:58 +0000106 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000107]>;
108
109// Helper "calling convention" to handle aggregate by value arguments.
110// Aggregate by value arguments are always placed in the local variable space
111// of the caller. This calling convention is only used to assign those stack
112// offsets in the callers stack frame.
113//
114// Still, the address of the aggregate copy in the callers stack frame is passed
115// in a GPR (or in the parameter list area if all GPRs are allocated) from the
116// caller to the callee. The location for the address argument is assigned by
Bill Schmidtef17c142013-02-06 17:33:58 +0000117// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000118//
Bill Schmidtef17c142013-02-06 17:33:58 +0000119// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000120// not passed by value.
121
Bill Schmidtef17c142013-02-06 17:33:58 +0000122def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000123 CCIfByVal<CCPassByVal<4, 4>>,
124
Bill Schmidtef17c142013-02-06 17:33:58 +0000125 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000126]>;
127
Hal Finkel52727c62013-07-02 03:39:34 +0000128def CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
129 V28, V29, V30, V31)>;
130
Roman Divackyef21be22012-03-06 16:41:49 +0000131def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
132 R21, R22, R23, R24, R25, R26, R27, R28,
133 R29, R30, R31, F14, F15, F16, F17, F18,
134 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000135 F27, F28, F29, F30, F31, CR2, CR3, CR4
136 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000137
Hal Finkel52727c62013-07-02 03:39:34 +0000138def CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>;
139
140def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
Roman Divackyef21be22012-03-06 16:41:49 +0000141 R21, R22, R23, R24, R25, R26, R27, R28,
142 R29, R30, R31, F14, F15, F16, F17, F18,
143 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000144 F27, F28, F29, F30, F31, CR2, CR3, CR4
145 )>;
146
147def CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
Roman Divackyef21be22012-03-06 16:41:49 +0000148
149def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
150 X21, X22, X23, X24, X25, X26, X27, X28,
151 X29, X30, X31, 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_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>;
157
158def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
Roman Divackyef21be22012-03-06 16:41:49 +0000159 X21, X22, X23, X24, X25, X26, X27, X28,
160 X29, X30, X31, 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 )>;
Hal Finkel756810f2013-03-21 21:37:52 +0000164
Hal Finkel756810f2013-03-21 21:37:52 +0000165
Hal Finkel52727c62013-07-02 03:39:34 +0000166def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>;
167
168def CSR_NoRegs : CalleeSavedRegs<(add)>;
Hal Finkel756810f2013-03-21 21:37:52 +0000169