AArch64/ARM64: remove AArch64 from tree prior to renaming ARM64.
[oota-llvm.git] / test / CodeGen / AArch64 / fastcc.ll
1 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-ARM64-TAIL
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu | FileCheck --check-prefix=CHECK-ARM64 %s
3
4 ; Without tailcallopt fastcc still means the caller cleans up the
5 ; stack, so try to make sure this is respected.
6
7 define fastcc void @func_stack0() {
8 ; CHECK-LABEL: func_stack0:
9 ; CHECK: sub sp, sp, #48
10
11 ; CHECK-ARM64-LABEL: func_stack0:
12 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
13 ; CHECK-ARM64-NEXT: mov x29, sp
14 ; CHECK-ARM64-NEXT: sub sp, sp, #32
15
16 ; CHECK-TAIL-LABEL: func_stack0:
17 ; CHECK-TAIL: sub sp, sp, #48
18
19 ; CHECK-ARM64-TAIL-LABEL: func_stack0:
20 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
21 ; CHECK-ARM64-TAIL-NEXT: mov x29, sp
22 ; CHECK-ARM64-TAIL-NEXT: sub sp, sp, #32
23
24
25   call fastcc void @func_stack8([8 x i32] undef, i32 42)
26 ; CHECK:  bl func_stack8
27 ; CHECK-NOT: sub sp, sp,
28
29 ; CHECK-ARM64:  bl func_stack8
30 ; CHECK-ARM64-NOT: sub sp, sp,
31
32 ; CHECK-TAIL: bl func_stack8
33 ; CHECK-TAIL: sub sp, sp, #16
34
35 ; CHECK-ARM64-TAIL: bl func_stack8
36 ; CHECK-ARM64-TAIL: sub sp, sp, #16
37
38
39   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
40 ; CHECK: bl func_stack32
41 ; CHECK-NOT: sub sp, sp,
42
43 ; CHECK-ARM64: bl func_stack32
44 ; CHECK-ARM64-NOT: sub sp, sp,
45
46 ; CHECK-TAIL: bl func_stack32
47 ; CHECK-TAIL: sub sp, sp, #32
48
49 ; CHECK-ARM64-TAIL: bl func_stack32
50 ; CHECK-ARM64-TAIL: sub sp, sp, #32
51
52
53   call fastcc void @func_stack0()
54 ; CHECK: bl func_stack0
55 ; CHECK-NOT: sub sp, sp
56
57 ; CHECK-ARM64: bl func_stack0
58 ; CHECK-ARM64-NOT: sub sp, sp
59
60 ; CHECK-TAIL: bl func_stack0
61 ; CHECK-TAIL-NOT: sub sp, sp
62
63 ; CHECK-ARM64-TAIL: bl func_stack0
64 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
65
66   ret void
67 ; CHECK: add sp, sp, #48
68 ; CHECK-NEXT: ret
69
70 ; CHECK-ARM64: mov sp, x29
71 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
72 ; CHECK-ARM64-NEXT: ret
73
74 ; CHECK-TAIL: add sp, sp, #48
75 ; CHECK-TAIL-NEXT: ret
76
77 ; CHECK-ARM64-TAIL: mov sp, x29
78 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
79 ; CHECK-ARM64-TAIL-NEXT: ret
80 }
81
82 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
83 ; CHECK-LABEL: func_stack8:
84 ; CHECK: sub sp, sp, #48
85
86 ; CHECK-ARM64-LABEL: func_stack8:
87 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
88 ; CHECK-ARM64: mov x29, sp
89 ; CHECK-ARM64: sub sp, sp, #32
90
91 ; CHECK-TAIL-LABEL: func_stack8:
92 ; CHECK-TAIL: sub sp, sp, #48
93
94 ; CHECK-ARM64-TAIL-LABEL: func_stack8:
95 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
96 ; CHECK-ARM64-TAIL: mov x29, sp
97 ; CHECK-ARM64-TAIL: sub sp, sp, #32
98
99
100   call fastcc void @func_stack8([8 x i32] undef, i32 42)
101 ; CHECK:  bl func_stack8
102 ; CHECK-NOT: sub sp, sp,
103
104 ; CHECK-ARM64:  bl func_stack8
105 ; CHECK-ARM64-NOT: sub sp, sp,
106
107 ; CHECK-TAIL: bl func_stack8
108 ; CHECK-TAIL: sub sp, sp, #16
109
110 ; CHECK-ARM64-TAIL: bl func_stack8
111 ; CHECK-ARM64-TAIL: sub sp, sp, #16
112
113
114   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
115 ; CHECK: bl func_stack32
116 ; CHECK-NOT: sub sp, sp,
117
118 ; CHECK-ARM64: bl func_stack32
119 ; CHECK-ARM64-NOT: sub sp, sp,
120
121 ; CHECK-TAIL: bl func_stack32
122 ; CHECK-TAIL: sub sp, sp, #32
123
124 ; CHECK-ARM64-TAIL: bl func_stack32
125 ; CHECK-ARM64-TAIL: sub sp, sp, #32
126
127
128   call fastcc void @func_stack0()
129 ; CHECK: bl func_stack0
130 ; CHECK-NOT: sub sp, sp
131
132 ; CHECK-ARM64: bl func_stack0
133 ; CHECK-ARM64-NOT: sub sp, sp
134
135 ; CHECK-TAIL: bl func_stack0
136 ; CHECK-TAIL-NOT: sub sp, sp
137
138 ; CHECK-ARM64-TAIL: bl func_stack0
139 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
140
141   ret void
142 ; CHECK: add sp, sp, #48
143 ; CHECK-NEXT: ret
144
145 ; CHECK-ARM64: mov sp, x29
146 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
147 ; CHECK-ARM64-NEXT: ret
148
149 ; CHECK-TAIL: add sp, sp, #64
150 ; CHECK-TAIL-NEXT: ret
151
152 ; CHECK-ARM64-TAIL: mov sp, x29
153 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
154 ; CHECK-ARM64-TAIL-NEXT: ret
155 }
156
157 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
158 ; CHECK-LABEL: func_stack32:
159 ; CHECK: sub sp, sp, #48
160
161 ; CHECK-ARM64-LABEL: func_stack32:
162 ; CHECK-ARM64: mov x29, sp
163
164 ; CHECK-TAIL-LABEL: func_stack32:
165 ; CHECK-TAIL: sub sp, sp, #48
166
167 ; CHECK-ARM64-TAIL-LABEL: func_stack32:
168 ; CHECK-ARM64-TAIL: mov x29, sp
169
170
171   call fastcc void @func_stack8([8 x i32] undef, i32 42)
172 ; CHECK:  bl func_stack8
173 ; CHECK-NOT: sub sp, sp,
174
175 ; CHECK-ARM64:  bl func_stack8
176 ; CHECK-ARM64-NOT: sub sp, sp,
177
178 ; CHECK-TAIL: bl func_stack8
179 ; CHECK-TAIL: sub sp, sp, #16
180
181 ; CHECK-ARM64-TAIL: bl func_stack8
182 ; CHECK-ARM64-TAIL: sub sp, sp, #16
183
184
185   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
186 ; CHECK: bl func_stack32
187 ; CHECK-NOT: sub sp, sp,
188
189 ; CHECK-ARM64: bl func_stack32
190 ; CHECK-ARM64-NOT: sub sp, sp,
191
192 ; CHECK-TAIL: bl func_stack32
193 ; CHECK-TAIL: sub sp, sp, #32
194
195 ; CHECK-ARM64-TAIL: bl func_stack32
196 ; CHECK-ARM64-TAIL: sub sp, sp, #32
197
198
199   call fastcc void @func_stack0()
200 ; CHECK: bl func_stack0
201 ; CHECK-NOT: sub sp, sp
202
203 ; CHECK-ARM64: bl func_stack0
204 ; CHECK-ARM64-NOT: sub sp, sp
205
206 ; CHECK-TAIL: bl func_stack0
207 ; CHECK-TAIL-NOT: sub sp, sp
208
209 ; CHECK-ARM64-TAIL: bl func_stack0
210 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
211
212   ret void
213 ; CHECK: add sp, sp, #48
214 ; CHECK-NEXT: ret
215
216 ; CHECK-ARM64: mov sp, x29
217 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
218 ; CHECK-ARM64-NEXT: ret
219
220 ; CHECK-TAIL: add sp, sp, #80
221 ; CHECK-TAIL-NEXT: ret
222
223 ; CHECK-ARM64-TAIL: mov sp, x29
224 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
225 ; CHECK-ARM64-TAIL-NEXT: ret
226 }