blob: f126760cd5e9f5585e5fe63d110c1cc89165b759 [file] [log] [blame]
Bob Wilson1f595bb2009-04-17 19:07:39 +00001//===- ARMCallingConv.td - Calling Conventions for ARM ----------*- C++ -*-===//
Bob Wilsondee46d72009-04-17 20:35:10 +00002//
Bob Wilson1f595bb2009-04-17 19:07:39 +00003// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bob Wilsondee46d72009-04-17 20:35:10 +00007//
Bob Wilson1f595bb2009-04-17 19:07:39 +00008//===----------------------------------------------------------------------===//
9// This describes the calling conventions for ARM architecture.
10//===----------------------------------------------------------------------===//
11
12/// CCIfSubtarget - Match if the current subtarget has a feature F.
Bob Wilsondee46d72009-04-17 20:35:10 +000013class CCIfSubtarget<string F, CCAction A>:
Bob Wilson1f595bb2009-04-17 19:07:39 +000014 CCIf<!strconcat("State.getTarget().getSubtarget<ARMSubtarget>().", F), A>;
15
16/// CCIfAlign - Match of the original alignment of the arg
17class CCIfAlign<string Align, CCAction A>:
18 CCIf<!strconcat("ArgFlags.getOrigAlign() == ", Align), A>;
19
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000020/// CCIfFloatABI - Match of the float ABI and the arg. ABIType may be "Hard" or
21/// "Soft".
22class CCIfFloatABI<string ABIType, CCAction A>:
23 CCIf<!strconcat("llvm::FloatABIType == llvm::FloatABI::", ABIType), A>;
24
Bob Wilson1f595bb2009-04-17 19:07:39 +000025//===----------------------------------------------------------------------===//
26// ARM APCS Calling Convention
27//===----------------------------------------------------------------------===//
28def CC_ARM_APCS : CallingConv<[
29
30 CCIfType<[i8, i16], CCPromoteToType<i32>>,
31
32 // f64 is passed in pairs of GPRs, possibly split onto the stack
33 CCIfType<[f64], CCCustom<"CC_ARM_APCS_Custom_f64">>,
34
35 CCIfType<[f32], CCBitConvertToType<i32>>,
Bob Wilson1c2c4622009-04-24 16:55:25 +000036 CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +000037
Bob Wilson1c2c4622009-04-24 16:55:25 +000038 CCIfType<[i32], CCAssignToStack<4, 4>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +000039 CCIfType<[f64], CCAssignToStack<8, 4>>
40]>;
41
42def RetCC_ARM_APCS : CallingConv<[
43 CCIfType<[f32], CCBitConvertToType<i32>>,
44 CCIfType<[f64], CCCustom<"RetCC_ARM_APCS_Custom_f64">>,
45
46 CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>,
47 CCIfType<[i64], CCAssignToRegWithShadow<[R0, R2], [R1, R3]>>
48]>;
49
50//===----------------------------------------------------------------------===//
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000051// ARM AAPCS (EABI) Calling Convention, common parts
Bob Wilson1f595bb2009-04-17 19:07:39 +000052//===----------------------------------------------------------------------===//
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000053
54def CC_ARM_AAPCS_Common : CallingConv<[
Bob Wilson1f595bb2009-04-17 19:07:39 +000055
56 CCIfType<[i8, i16], CCPromoteToType<i32>>,
57
58 // i64/f64 is passed in even pairs of GPRs
59 // i64 is 8-aligned i32 here, so we may need to eat R1 as a pad register
Bob Wilson04746ea2009-05-19 10:02:36 +000060 // (and the same is true for f64 if VFP is not enabled)
Bob Wilson1f595bb2009-04-17 19:07:39 +000061 CCIfType<[i32], CCIfAlign<"8", CCAssignToRegWithShadow<[R0, R2], [R0, R1]>>>,
Bob Wilson04746ea2009-05-19 10:02:36 +000062 CCIfType<[i32], CCIf<"State.getNextStackOffset() == 0 &&"
63 "ArgFlags.getOrigAlign() != 8",
64 CCAssignToReg<[R0, R1, R2, R3]>>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +000065
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000066 CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +000067 CCIfType<[f64], CCAssignToStack<8, 8>>
68]>;
69
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000070def RetCC_ARM_AAPCS_Common : CallingConv<[
Anton Korobeynikov2e7ccfc2009-06-08 22:59:50 +000071 CCIfType<[i32], CCAssignToReg<[R0, R1, R2, R3]>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +000072 CCIfType<[i64], CCAssignToRegWithShadow<[R0, R2], [R1, R3]>>
73]>;
74
75//===----------------------------------------------------------------------===//
Anton Korobeynikov0eebf652009-06-08 22:53:56 +000076// ARM AAPCS (EABI) Calling Convention
77//===----------------------------------------------------------------------===//
78
79def CC_ARM_AAPCS : CallingConv<[
80 CCIfType<[f64], CCCustom<"CC_ARM_AAPCS_Custom_f64">>,
81 CCIfType<[f32], CCBitConvertToType<i32>>,
82 CCDelegateTo<CC_ARM_AAPCS_Common>
83]>;
84
85def RetCC_ARM_AAPCS : CallingConv<[
86 CCIfType<[f64], CCCustom<"RetCC_ARM_AAPCS_Custom_f64">>,
87 CCIfType<[f32], CCBitConvertToType<i32>>,
88 CCDelegateTo<RetCC_ARM_AAPCS_Common>
89]>;
90
91//===----------------------------------------------------------------------===//
92// ARM AAPCS-VFP (EABI) Calling Convention
93//===----------------------------------------------------------------------===//
94
95def CC_ARM_AAPCS_VFP : CallingConv<[
96 CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>,
97 CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8,
98 S9, S10, S11, S12, S13, S14, S15]>>,
99 CCDelegateTo<CC_ARM_AAPCS_Common>
100]>;
101
102def RetCC_ARM_AAPCS_VFP : CallingConv<[
103 CCIfType<[f64], CCAssignToReg<[D0, D1, D2, D3, D4, D5, D6, D7]>>,
104 CCIfType<[f32], CCAssignToReg<[S0, S1, S2, S3, S4, S5, S6, S7, S8,
105 S9, S10, S11, S12, S13, S14, S15]>>,
106 CCDelegateTo<RetCC_ARM_AAPCS_Common>
107]>;
108
109//===----------------------------------------------------------------------===//
Bob Wilson1f595bb2009-04-17 19:07:39 +0000110// ARM Calling Convention Dispatch
111//===----------------------------------------------------------------------===//
112
113def CC_ARM : CallingConv<[
Anton Korobeynikov0eebf652009-06-08 22:53:56 +0000114 CCIfSubtarget<"isAAPCS_ABI()",
115 CCIfSubtarget<"hasVFP2()",
116 CCIfFloatABI<"Hard",
117 CCDelegateTo<CC_ARM_AAPCS_VFP>>>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +0000118 CCIfSubtarget<"isAAPCS_ABI()", CCDelegateTo<CC_ARM_AAPCS>>,
119 CCDelegateTo<CC_ARM_APCS>
120]>;
121
122def RetCC_ARM : CallingConv<[
Anton Korobeynikov0eebf652009-06-08 22:53:56 +0000123 CCIfSubtarget<"isAAPCS_ABI()",
124 CCIfSubtarget<"hasVFP2()",
125 CCIfFloatABI<"Hard",
126 CCDelegateTo<RetCC_ARM_AAPCS_VFP>>>>,
Bob Wilson1f595bb2009-04-17 19:07:39 +0000127 CCIfSubtarget<"isAAPCS_ABI()", CCDelegateTo<RetCC_ARM_AAPCS>>,
128 CCDelegateTo<RetCC_ARM_APCS>
129]>;