blob: a584188a1016c840840730e4596473a3e70a6aa1 [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
40//===----------------------------------------------------------------------===//
Bill Schmidtef17c142013-02-06 17:33:58 +000041// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerb93960d2009-07-03 06:45:56 +000042//===----------------------------------------------------------------------===//
43
Bill Schmidtef17c142013-02-06 17:33:58 +000044def CC_PPC32_SVR4_Common : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +000045 // The ABI requires i64 to be passed in two adjacent registers with the first
46 // register having an odd register number.
Bill Schmidtef17c142013-02-06 17:33:58 +000047 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000048
49 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaaf25cf82010-02-16 01:50:18 +000050 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000051
52 // Make sure the i64 words from a long double are either both passed in
53 // registers or both passed on the stack.
Bill Schmidtef17c142013-02-06 17:33:58 +000054 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerb93960d2009-07-03 06:45:56 +000055
56 // FP values are passed in F1 - F8.
57 CCIfType<[f32, f64], CCAssignToReg<[F1, F2, F3, F4, F5, F6, F7, F8]>>,
58
59 // Split arguments have an alignment of 8 bytes on the stack.
60 CCIfType<[i32], CCIfSplit<CCAssignToStack<4, 8>>>,
61
62 CCIfType<[i32], CCAssignToStack<4, 4>>,
63
64 // Floats are stored in double precision format, thus they have the same
65 // alignment and size as doubles.
66 CCIfType<[f32,f64], CCAssignToStack<8, 8>>,
67
68 // Vectors get 16-byte stack slots that are 16-byte aligned.
69 CCIfType<[v16i8, v8i16, v4i32, v4f32], CCAssignToStack<16, 16>>
70]>;
71
72// This calling convention puts vector arguments always on the stack. It is used
73// to assign vector arguments which belong to the variable portion of the
74// parameter list of a variable argument function.
Bill Schmidtef17c142013-02-06 17:33:58 +000075def CC_PPC32_SVR4_VarArg : CallingConv<[
76 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +000077]>;
78
Bill Schmidtef17c142013-02-06 17:33:58 +000079// In contrast to CC_PPC32_SVR4_VarArg, this calling convention first tries to
80// put vector arguments in vector registers before putting them on the stack.
81def CC_PPC32_SVR4 : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +000082 // The first 12 Vector arguments are passed in AltiVec registers.
83 CCIfType<[v16i8, v8i16, v4i32, v4f32],
84 CCAssignToReg<[V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13]>>,
85
Bill Schmidtef17c142013-02-06 17:33:58 +000086 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerb93960d2009-07-03 06:45:56 +000087]>;
88
89// Helper "calling convention" to handle aggregate by value arguments.
90// Aggregate by value arguments are always placed in the local variable space
91// of the caller. This calling convention is only used to assign those stack
92// offsets in the callers stack frame.
93//
94// Still, the address of the aggregate copy in the callers stack frame is passed
95// in a GPR (or in the parameter list area if all GPRs are allocated) from the
96// caller to the callee. The location for the address argument is assigned by
Bill Schmidtef17c142013-02-06 17:33:58 +000097// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerb93960d2009-07-03 06:45:56 +000098//
Bill Schmidtef17c142013-02-06 17:33:58 +000099// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000100// not passed by value.
101
Bill Schmidtef17c142013-02-06 17:33:58 +0000102def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000103 CCIfByVal<CCPassByVal<4, 4>>,
104
Bill Schmidtef17c142013-02-06 17:33:58 +0000105 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerb93960d2009-07-03 06:45:56 +0000106]>;
107
Hal Finkel52727c62013-07-02 03:39:34 +0000108def CSR_Altivec : CalleeSavedRegs<(add V20, V21, V22, V23, V24, V25, V26, V27,
109 V28, V29, V30, V31)>;
110
Roman Divackyef21be22012-03-06 16:41:49 +0000111def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
112 R21, R22, R23, R24, R25, R26, R27, R28,
113 R29, R30, R31, F14, F15, F16, F17, F18,
114 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000115 F27, F28, F29, F30, F31, CR2, CR3, CR4
116 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000117
Hal Finkel52727c62013-07-02 03:39:34 +0000118def CSR_Darwin32_Altivec : CalleeSavedRegs<(add CSR_Darwin32, CSR_Altivec)>;
119
120def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20,
Roman Divackyef21be22012-03-06 16:41:49 +0000121 R21, R22, R23, R24, R25, R26, R27, R28,
122 R29, R30, R31, F14, F15, F16, F17, F18,
123 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000124 F27, F28, F29, F30, F31, CR2, CR3, CR4
125 )>;
126
127def CSR_SVR432_Altivec : CalleeSavedRegs<(add CSR_SVR432, CSR_Altivec)>;
Roman Divackyef21be22012-03-06 16:41:49 +0000128
129def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
130 X21, X22, X23, X24, X25, X26, X27, X28,
131 X29, X30, X31, F14, F15, F16, F17, F18,
132 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000133 F27, F28, F29, F30, F31, CR2, CR3, CR4
134 )>;
Roman Divackyef21be22012-03-06 16:41:49 +0000135
Hal Finkel52727c62013-07-02 03:39:34 +0000136def CSR_Darwin64_Altivec : CalleeSavedRegs<(add CSR_Darwin64, CSR_Altivec)>;
137
138def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20,
Roman Divackyef21be22012-03-06 16:41:49 +0000139 X21, X22, X23, X24, X25, X26, X27, X28,
140 X29, X30, X31, F14, F15, F16, F17, F18,
141 F19, F20, F21, F22, F23, F24, F25, F26,
Hal Finkel52727c62013-07-02 03:39:34 +0000142 F27, F28, F29, F30, F31, CR2, CR3, CR4
143 )>;
Hal Finkel756810f2013-03-21 21:37:52 +0000144
Hal Finkel756810f2013-03-21 21:37:52 +0000145
Hal Finkel52727c62013-07-02 03:39:34 +0000146def CSR_SVR464_Altivec : CalleeSavedRegs<(add CSR_SVR464, CSR_Altivec)>;
147
148def CSR_NoRegs : CalleeSavedRegs<(add)>;
Hal Finkel756810f2013-03-21 21:37:52 +0000149