blob: caeb1796f7a4ee507c62a796b9502c629b534699 [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
Roman Divackyef21be22012-03-06 16:41:49 +0000108def CSR_Darwin32 : CalleeSavedRegs<(add R13, R14, R15, R16, R17, R18, R19, R20,
109 R21, R22, R23, R24, R25, R26, R27, R28,
110 R29, R30, R31, F14, F15, F16, F17, F18,
111 F19, F20, F21, F22, F23, F24, F25, F26,
112 F27, F28, F29, F30, F31, CR2, CR3, CR4,
113 V20, V21, V22, V23, V24, V25, V26, V27,
114 V28, V29, V30, V31)>;
115
116def CSR_SVR432 : CalleeSavedRegs<(add R14, R15, R16, R17, R18, R19, R20, VRSAVE,
117 R21, R22, R23, R24, R25, R26, R27, R28,
118 R29, R30, R31, F14, F15, F16, F17, F18,
119 F19, F20, F21, F22, F23, F24, F25, F26,
120 F27, F28, F29, F30, F31, CR2, CR3, CR4,
121 V20, V21, V22, V23, V24, V25, V26, V27,
122 V28, V29, V30, V31)>;
123
124def CSR_Darwin64 : CalleeSavedRegs<(add X13, X14, X15, X16, X17, X18, X19, X20,
125 X21, X22, X23, X24, X25, X26, X27, X28,
126 X29, X30, X31, F14, F15, F16, F17, F18,
127 F19, F20, F21, F22, F23, F24, F25, F26,
128 F27, F28, F29, F30, F31, CR2, CR3, CR4,
129 V20, V21, V22, V23, V24, V25, V26, V27,
130 V28, V29, V30, V31)>;
131
132def CSR_SVR464 : CalleeSavedRegs<(add X14, X15, X16, X17, X18, X19, X20, VRSAVE,
133 X21, X22, X23, X24, X25, X26, X27, X28,
134 X29, X30, X31, F14, F15, F16, F17, F18,
135 F19, F20, F21, F22, F23, F24, F25, F26,
136 F27, F28, F29, F30, F31, CR2, CR3, CR4,
137 V20, V21, V22, V23, V24, V25, V26, V27,
138 V28, V29, V30, V31)>;