[FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'.
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-vcvt.ll
1 ; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s
2
3 define <2 x i32> @fcvtas_2s(<2 x float> %A) nounwind {
4 ;CHECK-LABEL: fcvtas_2s:
5 ;CHECK-NOT: ld1
6 ;CHECK: fcvtas.2s v0, v0
7 ;CHECK-NEXT: ret
8         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float> %A)
9         ret <2 x i32> %tmp3
10 }
11
12 define <4 x i32> @fcvtas_4s(<4 x float> %A) nounwind {
13 ;CHECK-LABEL: fcvtas_4s:
14 ;CHECK-NOT: ld1
15 ;CHECK: fcvtas.4s v0, v0
16 ;CHECK-NEXT: ret
17         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float> %A)
18         ret <4 x i32> %tmp3
19 }
20
21 define <2 x i64> @fcvtas_2d(<2 x double> %A) nounwind {
22 ;CHECK-LABEL: fcvtas_2d:
23 ;CHECK-NOT: ld1
24 ;CHECK: fcvtas.2d v0, v0
25 ;CHECK-NEXT: ret
26         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double> %A)
27         ret <2 x i64> %tmp3
28 }
29
30 declare <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float>) nounwind readnone
31 declare <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float>) nounwind readnone
32 declare <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double>) nounwind readnone
33
34 define <2 x i32> @fcvtau_2s(<2 x float> %A) nounwind {
35 ;CHECK-LABEL: fcvtau_2s:
36 ;CHECK-NOT: ld1
37 ;CHECK: fcvtau.2s v0, v0
38 ;CHECK-NEXT: ret
39         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float> %A)
40         ret <2 x i32> %tmp3
41 }
42
43 define <4 x i32> @fcvtau_4s(<4 x float> %A) nounwind {
44 ;CHECK-LABEL: fcvtau_4s:
45 ;CHECK-NOT: ld1
46 ;CHECK: fcvtau.4s v0, v0
47 ;CHECK-NEXT: ret
48         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float> %A)
49         ret <4 x i32> %tmp3
50 }
51
52 define <2 x i64> @fcvtau_2d(<2 x double> %A) nounwind {
53 ;CHECK-LABEL: fcvtau_2d:
54 ;CHECK-NOT: ld1
55 ;CHECK: fcvtau.2d v0, v0
56 ;CHECK-NEXT: ret
57         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double> %A)
58         ret <2 x i64> %tmp3
59 }
60
61 declare <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float>) nounwind readnone
62 declare <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float>) nounwind readnone
63 declare <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double>) nounwind readnone
64
65 define <2 x i32> @fcvtms_2s(<2 x float> %A) nounwind {
66 ;CHECK-LABEL: fcvtms_2s:
67 ;CHECK-NOT: ld1
68 ;CHECK: fcvtms.2s v0, v0
69 ;CHECK-NEXT: ret
70         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float> %A)
71         ret <2 x i32> %tmp3
72 }
73
74 define <4 x i32> @fcvtms_4s(<4 x float> %A) nounwind {
75 ;CHECK-LABEL: fcvtms_4s:
76 ;CHECK-NOT: ld1
77 ;CHECK: fcvtms.4s v0, v0
78 ;CHECK-NEXT: ret
79         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float> %A)
80         ret <4 x i32> %tmp3
81 }
82
83 define <2 x i64> @fcvtms_2d(<2 x double> %A) nounwind {
84 ;CHECK-LABEL: fcvtms_2d:
85 ;CHECK-NOT: ld1
86 ;CHECK: fcvtms.2d v0, v0
87 ;CHECK-NEXT: ret
88         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double> %A)
89         ret <2 x i64> %tmp3
90 }
91
92 declare <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float>) nounwind readnone
93 declare <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float>) nounwind readnone
94 declare <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double>) nounwind readnone
95
96 define <2 x i32> @fcvtmu_2s(<2 x float> %A) nounwind {
97 ;CHECK-LABEL: fcvtmu_2s:
98 ;CHECK-NOT: ld1
99 ;CHECK: fcvtmu.2s v0, v0
100 ;CHECK-NEXT: ret
101         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float> %A)
102         ret <2 x i32> %tmp3
103 }
104
105 define <4 x i32> @fcvtmu_4s(<4 x float> %A) nounwind {
106 ;CHECK-LABEL: fcvtmu_4s:
107 ;CHECK-NOT: ld1
108 ;CHECK: fcvtmu.4s v0, v0
109 ;CHECK-NEXT: ret
110         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float> %A)
111         ret <4 x i32> %tmp3
112 }
113
114 define <2 x i64> @fcvtmu_2d(<2 x double> %A) nounwind {
115 ;CHECK-LABEL: fcvtmu_2d:
116 ;CHECK-NOT: ld1
117 ;CHECK: fcvtmu.2d v0, v0
118 ;CHECK-NEXT: ret
119         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double> %A)
120         ret <2 x i64> %tmp3
121 }
122
123 declare <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float>) nounwind readnone
124 declare <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float>) nounwind readnone
125 declare <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double>) nounwind readnone
126
127 define <2 x i32> @fcvtps_2s(<2 x float> %A) nounwind {
128 ;CHECK-LABEL: fcvtps_2s:
129 ;CHECK-NOT: ld1
130 ;CHECK: fcvtps.2s v0, v0
131 ;CHECK-NEXT: ret
132         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float> %A)
133         ret <2 x i32> %tmp3
134 }
135
136 define <4 x i32> @fcvtps_4s(<4 x float> %A) nounwind {
137 ;CHECK-LABEL: fcvtps_4s:
138 ;CHECK-NOT: ld1
139 ;CHECK: fcvtps.4s v0, v0
140 ;CHECK-NEXT: ret
141         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float> %A)
142         ret <4 x i32> %tmp3
143 }
144
145 define <2 x i64> @fcvtps_2d(<2 x double> %A) nounwind {
146 ;CHECK-LABEL: fcvtps_2d:
147 ;CHECK-NOT: ld1
148 ;CHECK: fcvtps.2d v0, v0
149 ;CHECK-NEXT: ret
150         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double> %A)
151         ret <2 x i64> %tmp3
152 }
153
154 declare <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float>) nounwind readnone
155 declare <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float>) nounwind readnone
156 declare <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double>) nounwind readnone
157
158 define <2 x i32> @fcvtpu_2s(<2 x float> %A) nounwind {
159 ;CHECK-LABEL: fcvtpu_2s:
160 ;CHECK-NOT: ld1
161 ;CHECK: fcvtpu.2s v0, v0
162 ;CHECK-NEXT: ret
163         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float> %A)
164         ret <2 x i32> %tmp3
165 }
166
167 define <4 x i32> @fcvtpu_4s(<4 x float> %A) nounwind {
168 ;CHECK-LABEL: fcvtpu_4s:
169 ;CHECK-NOT: ld1
170 ;CHECK: fcvtpu.4s v0, v0
171 ;CHECK-NEXT: ret
172         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float> %A)
173         ret <4 x i32> %tmp3
174 }
175
176 define <2 x i64> @fcvtpu_2d(<2 x double> %A) nounwind {
177 ;CHECK-LABEL: fcvtpu_2d:
178 ;CHECK-NOT: ld1
179 ;CHECK: fcvtpu.2d v0, v0
180 ;CHECK-NEXT: ret
181         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double> %A)
182         ret <2 x i64> %tmp3
183 }
184
185 declare <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float>) nounwind readnone
186 declare <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float>) nounwind readnone
187 declare <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double>) nounwind readnone
188
189 define <2 x i32> @fcvtns_2s(<2 x float> %A) nounwind {
190 ;CHECK-LABEL: fcvtns_2s:
191 ;CHECK-NOT: ld1
192 ;CHECK: fcvtns.2s v0, v0
193 ;CHECK-NEXT: ret
194         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float> %A)
195         ret <2 x i32> %tmp3
196 }
197
198 define <4 x i32> @fcvtns_4s(<4 x float> %A) nounwind {
199 ;CHECK-LABEL: fcvtns_4s:
200 ;CHECK-NOT: ld1
201 ;CHECK: fcvtns.4s v0, v0
202 ;CHECK-NEXT: ret
203         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float> %A)
204         ret <4 x i32> %tmp3
205 }
206
207 define <2 x i64> @fcvtns_2d(<2 x double> %A) nounwind {
208 ;CHECK-LABEL: fcvtns_2d:
209 ;CHECK-NOT: ld1
210 ;CHECK: fcvtns.2d v0, v0
211 ;CHECK-NEXT: ret
212         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double> %A)
213         ret <2 x i64> %tmp3
214 }
215
216 declare <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float>) nounwind readnone
217 declare <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float>) nounwind readnone
218 declare <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double>) nounwind readnone
219
220 define <2 x i32> @fcvtnu_2s(<2 x float> %A) nounwind {
221 ;CHECK-LABEL: fcvtnu_2s:
222 ;CHECK-NOT: ld1
223 ;CHECK: fcvtnu.2s v0, v0
224 ;CHECK-NEXT: ret
225         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float> %A)
226         ret <2 x i32> %tmp3
227 }
228
229 define <4 x i32> @fcvtnu_4s(<4 x float> %A) nounwind {
230 ;CHECK-LABEL: fcvtnu_4s:
231 ;CHECK-NOT: ld1
232 ;CHECK: fcvtnu.4s v0, v0
233 ;CHECK-NEXT: ret
234         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float> %A)
235         ret <4 x i32> %tmp3
236 }
237
238 define <2 x i64> @fcvtnu_2d(<2 x double> %A) nounwind {
239 ;CHECK-LABEL: fcvtnu_2d:
240 ;CHECK-NOT: ld1
241 ;CHECK: fcvtnu.2d v0, v0
242 ;CHECK-NEXT: ret
243         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double> %A)
244         ret <2 x i64> %tmp3
245 }
246
247 declare <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float>) nounwind readnone
248 declare <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float>) nounwind readnone
249 declare <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double>) nounwind readnone
250
251 define <2 x i32> @fcvtzs_2s(<2 x float> %A) nounwind {
252 ;CHECK-LABEL: fcvtzs_2s:
253 ;CHECK-NOT: ld1
254 ;CHECK: fcvtzs.2s v0, v0
255 ;CHECK-NEXT: ret
256         %tmp3 = fptosi <2 x float> %A to <2 x i32>
257         ret <2 x i32> %tmp3
258 }
259
260 define <4 x i32> @fcvtzs_4s(<4 x float> %A) nounwind {
261 ;CHECK-LABEL: fcvtzs_4s:
262 ;CHECK-NOT: ld1
263 ;CHECK: fcvtzs.4s v0, v0
264 ;CHECK-NEXT: ret
265         %tmp3 = fptosi <4 x float> %A to <4 x i32>
266         ret <4 x i32> %tmp3
267 }
268
269 define <2 x i64> @fcvtzs_2d(<2 x double> %A) nounwind {
270 ;CHECK-LABEL: fcvtzs_2d:
271 ;CHECK-NOT: ld1
272 ;CHECK: fcvtzs.2d v0, v0
273 ;CHECK-NEXT: ret
274         %tmp3 = fptosi <2 x double> %A to <2 x i64>
275         ret <2 x i64> %tmp3
276 }
277
278
279 define <2 x i32> @fcvtzu_2s(<2 x float> %A) nounwind {
280 ;CHECK-LABEL: fcvtzu_2s:
281 ;CHECK-NOT: ld1
282 ;CHECK: fcvtzu.2s v0, v0
283 ;CHECK-NEXT: ret
284         %tmp3 = fptoui <2 x float> %A to <2 x i32>
285         ret <2 x i32> %tmp3
286 }
287
288 define <4 x i32> @fcvtzu_4s(<4 x float> %A) nounwind {
289 ;CHECK-LABEL: fcvtzu_4s:
290 ;CHECK-NOT: ld1
291 ;CHECK: fcvtzu.4s v0, v0
292 ;CHECK-NEXT: ret
293         %tmp3 = fptoui <4 x float> %A to <4 x i32>
294         ret <4 x i32> %tmp3
295 }
296
297 define <2 x i64> @fcvtzu_2d(<2 x double> %A) nounwind {
298 ;CHECK-LABEL: fcvtzu_2d:
299 ;CHECK-NOT: ld1
300 ;CHECK: fcvtzu.2d v0, v0
301 ;CHECK-NEXT: ret
302         %tmp3 = fptoui <2 x double> %A to <2 x i64>
303         ret <2 x i64> %tmp3
304 }
305
306 define <2 x float> @frinta_2s(<2 x float> %A) nounwind {
307 ;CHECK-LABEL: frinta_2s:
308 ;CHECK-NOT: ld1
309 ;CHECK: frinta.2s v0, v0
310 ;CHECK-NEXT: ret
311         %tmp3 = call <2 x float> @llvm.round.v2f32(<2 x float> %A)
312         ret <2 x float> %tmp3
313 }
314
315 define <4 x float> @frinta_4s(<4 x float> %A) nounwind {
316 ;CHECK-LABEL: frinta_4s:
317 ;CHECK-NOT: ld1
318 ;CHECK: frinta.4s v0, v0
319 ;CHECK-NEXT: ret
320         %tmp3 = call <4 x float> @llvm.round.v4f32(<4 x float> %A)
321         ret <4 x float> %tmp3
322 }
323
324 define <2 x double> @frinta_2d(<2 x double> %A) nounwind {
325 ;CHECK-LABEL: frinta_2d:
326 ;CHECK-NOT: ld1
327 ;CHECK: frinta.2d v0, v0
328 ;CHECK-NEXT: ret
329         %tmp3 = call <2 x double> @llvm.round.v2f64(<2 x double> %A)
330         ret <2 x double> %tmp3
331 }
332
333 declare <2 x float> @llvm.round.v2f32(<2 x float>) nounwind readnone
334 declare <4 x float> @llvm.round.v4f32(<4 x float>) nounwind readnone
335 declare <2 x double> @llvm.round.v2f64(<2 x double>) nounwind readnone
336
337 define <2 x float> @frinti_2s(<2 x float> %A) nounwind {
338 ;CHECK-LABEL: frinti_2s:
339 ;CHECK-NOT: ld1
340 ;CHECK: frinti.2s v0, v0
341 ;CHECK-NEXT: ret
342         %tmp3 = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %A)
343         ret <2 x float> %tmp3
344 }
345
346 define <4 x float> @frinti_4s(<4 x float> %A) nounwind {
347 ;CHECK-LABEL: frinti_4s:
348 ;CHECK-NOT: ld1
349 ;CHECK: frinti.4s v0, v0
350 ;CHECK-NEXT: ret
351         %tmp3 = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %A)
352         ret <4 x float> %tmp3
353 }
354
355 define <2 x double> @frinti_2d(<2 x double> %A) nounwind {
356 ;CHECK-LABEL: frinti_2d:
357 ;CHECK-NOT: ld1
358 ;CHECK: frinti.2d v0, v0
359 ;CHECK-NEXT: ret
360         %tmp3 = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %A)
361         ret <2 x double> %tmp3
362 }
363
364 declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>) nounwind readnone
365 declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) nounwind readnone
366 declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>) nounwind readnone
367
368 define <2 x float> @frintm_2s(<2 x float> %A) nounwind {
369 ;CHECK-LABEL: frintm_2s:
370 ;CHECK-NOT: ld1
371 ;CHECK: frintm.2s v0, v0
372 ;CHECK-NEXT: ret
373         %tmp3 = call <2 x float> @llvm.floor.v2f32(<2 x float> %A)
374         ret <2 x float> %tmp3
375 }
376
377 define <4 x float> @frintm_4s(<4 x float> %A) nounwind {
378 ;CHECK-LABEL: frintm_4s:
379 ;CHECK-NOT: ld1
380 ;CHECK: frintm.4s v0, v0
381 ;CHECK-NEXT: ret
382         %tmp3 = call <4 x float> @llvm.floor.v4f32(<4 x float> %A)
383         ret <4 x float> %tmp3
384 }
385
386 define <2 x double> @frintm_2d(<2 x double> %A) nounwind {
387 ;CHECK-LABEL: frintm_2d:
388 ;CHECK-NOT: ld1
389 ;CHECK: frintm.2d v0, v0
390 ;CHECK-NEXT: ret
391         %tmp3 = call <2 x double> @llvm.floor.v2f64(<2 x double> %A)
392         ret <2 x double> %tmp3
393 }
394
395 declare <2 x float> @llvm.floor.v2f32(<2 x float>) nounwind readnone
396 declare <4 x float> @llvm.floor.v4f32(<4 x float>) nounwind readnone
397 declare <2 x double> @llvm.floor.v2f64(<2 x double>) nounwind readnone
398
399 define <2 x float> @frintn_2s(<2 x float> %A) nounwind {
400 ;CHECK-LABEL: frintn_2s:
401 ;CHECK-NOT: ld1
402 ;CHECK: frintn.2s v0, v0
403 ;CHECK-NEXT: ret
404         %tmp3 = call <2 x float> @llvm.aarch64.neon.frintn.v2f32(<2 x float> %A)
405         ret <2 x float> %tmp3
406 }
407
408 define <4 x float> @frintn_4s(<4 x float> %A) nounwind {
409 ;CHECK-LABEL: frintn_4s:
410 ;CHECK-NOT: ld1
411 ;CHECK: frintn.4s v0, v0
412 ;CHECK-NEXT: ret
413         %tmp3 = call <4 x float> @llvm.aarch64.neon.frintn.v4f32(<4 x float> %A)
414         ret <4 x float> %tmp3
415 }
416
417 define <2 x double> @frintn_2d(<2 x double> %A) nounwind {
418 ;CHECK-LABEL: frintn_2d:
419 ;CHECK-NOT: ld1
420 ;CHECK: frintn.2d v0, v0
421 ;CHECK-NEXT: ret
422         %tmp3 = call <2 x double> @llvm.aarch64.neon.frintn.v2f64(<2 x double> %A)
423         ret <2 x double> %tmp3
424 }
425
426 declare <2 x float> @llvm.aarch64.neon.frintn.v2f32(<2 x float>) nounwind readnone
427 declare <4 x float> @llvm.aarch64.neon.frintn.v4f32(<4 x float>) nounwind readnone
428 declare <2 x double> @llvm.aarch64.neon.frintn.v2f64(<2 x double>) nounwind readnone
429
430 define <2 x float> @frintp_2s(<2 x float> %A) nounwind {
431 ;CHECK-LABEL: frintp_2s:
432 ;CHECK-NOT: ld1
433 ;CHECK: frintp.2s v0, v0
434 ;CHECK-NEXT: ret
435         %tmp3 = call <2 x float> @llvm.ceil.v2f32(<2 x float> %A)
436         ret <2 x float> %tmp3
437 }
438
439 define <4 x float> @frintp_4s(<4 x float> %A) nounwind {
440 ;CHECK-LABEL: frintp_4s:
441 ;CHECK-NOT: ld1
442 ;CHECK: frintp.4s v0, v0
443 ;CHECK-NEXT: ret
444         %tmp3 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %A)
445         ret <4 x float> %tmp3
446 }
447
448 define <2 x double> @frintp_2d(<2 x double> %A) nounwind {
449 ;CHECK-LABEL: frintp_2d:
450 ;CHECK-NOT: ld1
451 ;CHECK: frintp.2d v0, v0
452 ;CHECK-NEXT: ret
453         %tmp3 = call <2 x double> @llvm.ceil.v2f64(<2 x double> %A)
454         ret <2 x double> %tmp3
455 }
456
457 declare <2 x float> @llvm.ceil.v2f32(<2 x float>) nounwind readnone
458 declare <4 x float> @llvm.ceil.v4f32(<4 x float>) nounwind readnone
459 declare <2 x double> @llvm.ceil.v2f64(<2 x double>) nounwind readnone
460
461 define <2 x float> @frintx_2s(<2 x float> %A) nounwind {
462 ;CHECK-LABEL: frintx_2s:
463 ;CHECK-NOT: ld1
464 ;CHECK: frintx.2s v0, v0
465 ;CHECK-NEXT: ret
466         %tmp3 = call <2 x float> @llvm.rint.v2f32(<2 x float> %A)
467         ret <2 x float> %tmp3
468 }
469
470 define <4 x float> @frintx_4s(<4 x float> %A) nounwind {
471 ;CHECK-LABEL: frintx_4s:
472 ;CHECK-NOT: ld1
473 ;CHECK: frintx.4s v0, v0
474 ;CHECK-NEXT: ret
475         %tmp3 = call <4 x float> @llvm.rint.v4f32(<4 x float> %A)
476         ret <4 x float> %tmp3
477 }
478
479 define <2 x double> @frintx_2d(<2 x double> %A) nounwind {
480 ;CHECK-LABEL: frintx_2d:
481 ;CHECK-NOT: ld1
482 ;CHECK: frintx.2d v0, v0
483 ;CHECK-NEXT: ret
484         %tmp3 = call <2 x double> @llvm.rint.v2f64(<2 x double> %A)
485         ret <2 x double> %tmp3
486 }
487
488 declare <2 x float> @llvm.rint.v2f32(<2 x float>) nounwind readnone
489 declare <4 x float> @llvm.rint.v4f32(<4 x float>) nounwind readnone
490 declare <2 x double> @llvm.rint.v2f64(<2 x double>) nounwind readnone
491
492 define <2 x float> @frintz_2s(<2 x float> %A) nounwind {
493 ;CHECK-LABEL: frintz_2s:
494 ;CHECK-NOT: ld1
495 ;CHECK: frintz.2s v0, v0
496 ;CHECK-NEXT: ret
497         %tmp3 = call <2 x float> @llvm.trunc.v2f32(<2 x float> %A)
498         ret <2 x float> %tmp3
499 }
500
501 define <4 x float> @frintz_4s(<4 x float> %A) nounwind {
502 ;CHECK-LABEL: frintz_4s:
503 ;CHECK-NOT: ld1
504 ;CHECK: frintz.4s v0, v0
505 ;CHECK-NEXT: ret
506         %tmp3 = call <4 x float> @llvm.trunc.v4f32(<4 x float> %A)
507         ret <4 x float> %tmp3
508 }
509
510 define <2 x double> @frintz_2d(<2 x double> %A) nounwind {
511 ;CHECK-LABEL: frintz_2d:
512 ;CHECK-NOT: ld1
513 ;CHECK: frintz.2d v0, v0
514 ;CHECK-NEXT: ret
515         %tmp3 = call <2 x double> @llvm.trunc.v2f64(<2 x double> %A)
516         ret <2 x double> %tmp3
517 }
518
519 declare <2 x float> @llvm.trunc.v2f32(<2 x float>) nounwind readnone
520 declare <4 x float> @llvm.trunc.v4f32(<4 x float>) nounwind readnone
521 declare <2 x double> @llvm.trunc.v2f64(<2 x double>) nounwind readnone
522
523 define <2 x float> @fcvtxn_2s(<2 x double> %A) nounwind {
524 ;CHECK-LABEL: fcvtxn_2s:
525 ;CHECK-NOT: ld1
526 ;CHECK: fcvtxn v0.2s, v0.2d
527 ;CHECK-NEXT: ret
528         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
529         ret <2 x float> %tmp3
530 }
531
532 define <4 x float> @fcvtxn_4s(<2 x float> %ret, <2 x double> %A) nounwind {
533 ;CHECK-LABEL: fcvtxn_4s:
534 ;CHECK-NOT: ld1
535 ;CHECK: fcvtxn2 v0.4s, v1.2d
536 ;CHECK-NEXT: ret
537         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
538         %res = shufflevector <2 x float> %ret, <2 x float> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
539         ret <4 x float> %res
540 }
541
542 declare <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double>) nounwind readnone
543
544 define <2 x i32> @fcvtzsc_2s(<2 x float> %A) nounwind {
545 ;CHECK-LABEL: fcvtzsc_2s:
546 ;CHECK-NOT: ld1
547 ;CHECK: fcvtzs.2s v0, v0, #1
548 ;CHECK-NEXT: ret
549         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float> %A, i32 1)
550         ret <2 x i32> %tmp3
551 }
552
553 define <4 x i32> @fcvtzsc_4s(<4 x float> %A) nounwind {
554 ;CHECK-LABEL: fcvtzsc_4s:
555 ;CHECK-NOT: ld1
556 ;CHECK: fcvtzs.4s v0, v0, #1
557 ;CHECK-NEXT: ret
558         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float> %A, i32 1)
559         ret <4 x i32> %tmp3
560 }
561
562 define <2 x i64> @fcvtzsc_2d(<2 x double> %A) nounwind {
563 ;CHECK-LABEL: fcvtzsc_2d:
564 ;CHECK-NOT: ld1
565 ;CHECK: fcvtzs.2d v0, v0, #1
566 ;CHECK-NEXT: ret
567         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double> %A, i32 1)
568         ret <2 x i64> %tmp3
569 }
570
571 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float>, i32) nounwind readnone
572 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float>, i32) nounwind readnone
573 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double>, i32) nounwind readnone
574
575 define <2 x i32> @fcvtzuc_2s(<2 x float> %A) nounwind {
576 ;CHECK-LABEL: fcvtzuc_2s:
577 ;CHECK-NOT: ld1
578 ;CHECK: fcvtzu.2s v0, v0, #1
579 ;CHECK-NEXT: ret
580         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float> %A, i32 1)
581         ret <2 x i32> %tmp3
582 }
583
584 define <4 x i32> @fcvtzuc_4s(<4 x float> %A) nounwind {
585 ;CHECK-LABEL: fcvtzuc_4s:
586 ;CHECK-NOT: ld1
587 ;CHECK: fcvtzu.4s v0, v0, #1
588 ;CHECK-NEXT: ret
589         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float> %A, i32 1)
590         ret <4 x i32> %tmp3
591 }
592
593 define <2 x i64> @fcvtzuc_2d(<2 x double> %A) nounwind {
594 ;CHECK-LABEL: fcvtzuc_2d:
595 ;CHECK-NOT: ld1
596 ;CHECK: fcvtzu.2d v0, v0, #1
597 ;CHECK-NEXT: ret
598         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double> %A, i32 1)
599         ret <2 x i64> %tmp3
600 }
601
602 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float>, i32) nounwind readnone
603 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float>, i32) nounwind readnone
604 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double>, i32) nounwind readnone
605
606 define <2 x float> @scvtf_2sc(<2 x i32> %A) nounwind {
607 ;CHECK-LABEL: scvtf_2sc:
608 ;CHECK-NOT: ld1
609 ;CHECK: scvtf.2s v0, v0, #1
610 ;CHECK-NEXT: ret
611         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
612         ret <2 x float> %tmp3
613 }
614
615 define <4 x float> @scvtf_4sc(<4 x i32> %A) nounwind {
616 ;CHECK-LABEL: scvtf_4sc:
617 ;CHECK-NOT: ld1
618 ;CHECK: scvtf.4s v0, v0, #1
619 ;CHECK-NEXT: ret
620         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
621         ret <4 x float> %tmp3
622 }
623
624 define <2 x double> @scvtf_2dc(<2 x i64> %A) nounwind {
625 ;CHECK-LABEL: scvtf_2dc:
626 ;CHECK-NOT: ld1
627 ;CHECK: scvtf.2d v0, v0, #1
628 ;CHECK-NEXT: ret
629         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
630         ret <2 x double> %tmp3
631 }
632
633 declare <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
634 declare <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
635 declare <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone
636
637 define <2 x float> @ucvtf_2sc(<2 x i32> %A) nounwind {
638 ;CHECK-LABEL: ucvtf_2sc:
639 ;CHECK-NOT: ld1
640 ;CHECK: ucvtf.2s v0, v0, #1
641 ;CHECK-NEXT: ret
642         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
643         ret <2 x float> %tmp3
644 }
645
646 define <4 x float> @ucvtf_4sc(<4 x i32> %A) nounwind {
647 ;CHECK-LABEL: ucvtf_4sc:
648 ;CHECK-NOT: ld1
649 ;CHECK: ucvtf.4s v0, v0, #1
650 ;CHECK-NEXT: ret
651         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
652         ret <4 x float> %tmp3
653 }
654
655 define <2 x double> @ucvtf_2dc(<2 x i64> %A) nounwind {
656 ;CHECK-LABEL: ucvtf_2dc:
657 ;CHECK-NOT: ld1
658 ;CHECK: ucvtf.2d v0, v0, #1
659 ;CHECK-NEXT: ret
660         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
661         ret <2 x double> %tmp3
662 }
663
664
665 ;CHECK-LABEL: autogen_SD28458:
666 ;CHECK: fcvt
667 ;CHECK: ret
668 define void @autogen_SD28458(<8 x double> %val.f64, <8 x float>* %addr.f32) {
669   %Tr53 = fptrunc <8 x double> %val.f64 to <8 x float>
670   store <8 x float> %Tr53, <8 x float>* %addr.f32
671   ret void
672 }
673
674 ;CHECK-LABEL: autogen_SD19225:
675 ;CHECK: fcvt
676 ;CHECK: ret
677 define void @autogen_SD19225(<8 x double>* %addr.f64, <8 x float>* %addr.f32) {
678   %A = load <8 x float>* %addr.f32
679   %Tr53 = fpext <8 x float> %A to <8 x double>
680   store <8 x double> %Tr53, <8 x double>* %addr.f64
681   ret void
682 }
683
684 declare <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
685 declare <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
686 declare <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone