blob: c8a29a3d2cfe69efd2a244e6b4c9ecbfc0bd9923 [file] [log] [blame]
Chris Lattner23e70eb2010-08-17 16:20:04 +00001//===- PPCCallingConv.td - Calling Conventions for PowerPC -*- tablegen -*-===//
Jia Liu31d157a2012-02-18 12:03:15 +00002//
Chris Lattnerb9a7bea2007-03-06 00:59:59 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-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 Liu31d157a2012-02-18 12:03:15 +00007//
Chris Lattnerb9a7bea2007-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 Weigand86aef0a2012-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 Lattnerb9a7bea2007-03-06 00:59:59 +000019//===----------------------------------------------------------------------===//
20// Return Value Calling Convention
21//===----------------------------------------------------------------------===//
22
23// Return-value convention for PowerPC
24def RetCC_PPC : CallingConv<[
Ulrich Weigand86aef0a2012-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 Johannesenfdd3ade2008-03-17 02:13:43 +000028 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Dale Johannesen257f75d2008-03-17 17:11:08 +000029 CCIfType<[i64], CCAssignToReg<[X3, X4, X5, X6]>>,
Bill Schmidt8f4ee4b2013-01-17 19:34:57 +000030 CCIfType<[i128], CCAssignToReg<[X3, X4, X5, X6]>>,
Chris Lattnerb9a7bea2007-03-06 00:59:59 +000031
Bill Schmidt792b1232013-01-17 17:45:19 +000032 CCIfType<[f32], CCAssignToReg<[F1, F2]>>,
33 CCIfType<[f64], CCAssignToReg<[F1, F2, F3, F4]>>,
Chris Lattnerb9a7bea2007-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 Schmidt212af6a2013-02-06 17:33:58 +000041// PowerPC System V Release 4 32-bit ABI
Tilmann Schellerffd02002009-07-03 06:45:56 +000042//===----------------------------------------------------------------------===//
43
Bill Schmidt212af6a2013-02-06 17:33:58 +000044def CC_PPC32_SVR4_Common : CallingConv<[
Tilmann Schellerffd02002009-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 Schmidt212af6a2013-02-06 17:33:58 +000047 CCIfType<[i32], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignArgRegs">>>,
Tilmann Schellerffd02002009-07-03 06:45:56 +000048
49 // The first 8 integer arguments are passed in integer registers.
Rafael Espindolaa3b11192010-02-16 01:50:18 +000050 CCIfType<[i32], CCAssignToReg<[R3, R4, R5, R6, R7, R8, R9, R10]>>,
Tilmann Schellerffd02002009-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 Schmidt212af6a2013-02-06 17:33:58 +000054 CCIfType<[f64], CCIfSplit<CCCustom<"CC_PPC32_SVR4_Custom_AlignFPArgRegs">>>,
Tilmann Schellerffd02002009-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 Schmidt212af6a2013-02-06 17:33:58 +000075def CC_PPC32_SVR4_VarArg : CallingConv<[
76 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerffd02002009-07-03 06:45:56 +000077]>;
78
Bill Schmidt212af6a2013-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 Schellerffd02002009-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 Schmidt212af6a2013-02-06 17:33:58 +000086 CCDelegateTo<CC_PPC32_SVR4_Common>
Tilmann Schellerffd02002009-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 Schmidt212af6a2013-02-06 17:33:58 +000097// the CC_PPC32_SVR4 calling convention.
Tilmann Schellerffd02002009-07-03 06:45:56 +000098//
Bill Schmidt212af6a2013-02-06 17:33:58 +000099// The only purpose of CC_PPC32_SVR4_Custom_Dummy is to skip arguments which are
Tilmann Schellerffd02002009-07-03 06:45:56 +0000100// not passed by value.
101
Bill Schmidt212af6a2013-02-06 17:33:58 +0000102def CC_PPC32_SVR4_ByVal : CallingConv<[
Tilmann Schellerffd02002009-07-03 06:45:56 +0000103 CCIfByVal<CCPassByVal<4, 4>>,
104
Bill Schmidt212af6a2013-02-06 17:33:58 +0000105 CCCustom<"CC_PPC32_SVR4_Custom_Dummy">
Tilmann Schellerffd02002009-07-03 06:45:56 +0000106]>;
107
Roman Divackye46137f2012-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)>;
Hal Finkel7ee74a62013-03-21 21:37:52 +0000139
Hal Finkelb7e11e42013-03-27 00:02:20 +0000140def CSR_NoRegs : CalleeSavedRegs<(add VRSAVE)>;
141def CSR_NoRegs_Darwin : CalleeSavedRegs<(add)>;
Hal Finkel7ee74a62013-03-21 21:37:52 +0000142
143def CSR_NoRegs_Altivec : CalleeSavedRegs<(add (sequence "V%u", 0, 31), VRSAVE)>;
144