[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / arm64-vcvt.ll
blobd236aeaf32a709991f7ec33c319db805bd81d78b
1 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
2 ; RUN: llc < %s -mtriple=arm64-eabi -pass-remarks-missed=gisel-* \
3 ; RUN: -aarch64-neon-syntax=apple -global-isel -global-isel-abort=2 2>&1 | \
4 ; RUN: FileCheck %s --check-prefixes=FALLBACK,CHECK
6 define <2 x i32> @fcvtas_2s(<2 x float> %A) nounwind {
7 ;CHECK-LABEL: fcvtas_2s:
8 ;CHECK-NOT: ld1
9 ;CHECK: fcvtas.2s v0, v0
10 ;CHECK-NEXT: ret
11         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float> %A)
12         ret <2 x i32> %tmp3
15 define <4 x i32> @fcvtas_4s(<4 x float> %A) nounwind {
16 ;CHECK-LABEL: fcvtas_4s:
17 ;CHECK-NOT: ld1
18 ;CHECK: fcvtas.4s v0, v0
19 ;CHECK-NEXT: ret
20         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float> %A)
21         ret <4 x i32> %tmp3
24 define <2 x i64> @fcvtas_2d(<2 x double> %A) nounwind {
25 ;CHECK-LABEL: fcvtas_2d:
26 ;CHECK-NOT: ld1
27 ;CHECK: fcvtas.2d v0, v0
28 ;CHECK-NEXT: ret
29         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double> %A)
30         ret <2 x i64> %tmp3
33 declare <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float>) nounwind readnone
34 declare <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float>) nounwind readnone
35 declare <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double>) nounwind readnone
37 define <2 x i32> @fcvtau_2s(<2 x float> %A) nounwind {
38 ;CHECK-LABEL: fcvtau_2s:
39 ;CHECK-NOT: ld1
40 ;CHECK: fcvtau.2s v0, v0
41 ;CHECK-NEXT: ret
42         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float> %A)
43         ret <2 x i32> %tmp3
46 define <4 x i32> @fcvtau_4s(<4 x float> %A) nounwind {
47 ;CHECK-LABEL: fcvtau_4s:
48 ;CHECK-NOT: ld1
49 ;CHECK: fcvtau.4s v0, v0
50 ;CHECK-NEXT: ret
51         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float> %A)
52         ret <4 x i32> %tmp3
55 define <2 x i64> @fcvtau_2d(<2 x double> %A) nounwind {
56 ;CHECK-LABEL: fcvtau_2d:
57 ;CHECK-NOT: ld1
58 ;CHECK: fcvtau.2d v0, v0
59 ;CHECK-NEXT: ret
60         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double> %A)
61         ret <2 x i64> %tmp3
64 declare <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float>) nounwind readnone
65 declare <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float>) nounwind readnone
66 declare <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double>) nounwind readnone
68 define <2 x i32> @fcvtms_2s(<2 x float> %A) nounwind {
69 ;CHECK-LABEL: fcvtms_2s:
70 ;CHECK-NOT: ld1
71 ;CHECK: fcvtms.2s v0, v0
72 ;CHECK-NEXT: ret
73         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float> %A)
74         ret <2 x i32> %tmp3
77 define <4 x i32> @fcvtms_4s(<4 x float> %A) nounwind {
78 ;CHECK-LABEL: fcvtms_4s:
79 ;CHECK-NOT: ld1
80 ;CHECK: fcvtms.4s v0, v0
81 ;CHECK-NEXT: ret
82         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float> %A)
83         ret <4 x i32> %tmp3
86 define <2 x i64> @fcvtms_2d(<2 x double> %A) nounwind {
87 ;CHECK-LABEL: fcvtms_2d:
88 ;CHECK-NOT: ld1
89 ;CHECK: fcvtms.2d v0, v0
90 ;CHECK-NEXT: ret
91         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double> %A)
92         ret <2 x i64> %tmp3
95 declare <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float>) nounwind readnone
96 declare <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float>) nounwind readnone
97 declare <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double>) nounwind readnone
99 define <2 x i32> @fcvtmu_2s(<2 x float> %A) nounwind {
100 ;CHECK-LABEL: fcvtmu_2s:
101 ;CHECK-NOT: ld1
102 ;CHECK: fcvtmu.2s v0, v0
103 ;CHECK-NEXT: ret
104         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float> %A)
105         ret <2 x i32> %tmp3
108 define <4 x i32> @fcvtmu_4s(<4 x float> %A) nounwind {
109 ;CHECK-LABEL: fcvtmu_4s:
110 ;CHECK-NOT: ld1
111 ;CHECK: fcvtmu.4s v0, v0
112 ;CHECK-NEXT: ret
113         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float> %A)
114         ret <4 x i32> %tmp3
117 define <2 x i64> @fcvtmu_2d(<2 x double> %A) nounwind {
118 ;CHECK-LABEL: fcvtmu_2d:
119 ;CHECK-NOT: ld1
120 ;CHECK: fcvtmu.2d v0, v0
121 ;CHECK-NEXT: ret
122         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double> %A)
123         ret <2 x i64> %tmp3
126 declare <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float>) nounwind readnone
127 declare <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float>) nounwind readnone
128 declare <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double>) nounwind readnone
130 define <2 x i32> @fcvtps_2s(<2 x float> %A) nounwind {
131 ;CHECK-LABEL: fcvtps_2s:
132 ;CHECK-NOT: ld1
133 ;CHECK: fcvtps.2s v0, v0
134 ;CHECK-NEXT: ret
135         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float> %A)
136         ret <2 x i32> %tmp3
139 define <4 x i32> @fcvtps_4s(<4 x float> %A) nounwind {
140 ;CHECK-LABEL: fcvtps_4s:
141 ;CHECK-NOT: ld1
142 ;CHECK: fcvtps.4s v0, v0
143 ;CHECK-NEXT: ret
144         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float> %A)
145         ret <4 x i32> %tmp3
148 define <2 x i64> @fcvtps_2d(<2 x double> %A) nounwind {
149 ;CHECK-LABEL: fcvtps_2d:
150 ;CHECK-NOT: ld1
151 ;CHECK: fcvtps.2d v0, v0
152 ;CHECK-NEXT: ret
153         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double> %A)
154         ret <2 x i64> %tmp3
157 declare <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float>) nounwind readnone
158 declare <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float>) nounwind readnone
159 declare <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double>) nounwind readnone
161 define <2 x i32> @fcvtpu_2s(<2 x float> %A) nounwind {
162 ;CHECK-LABEL: fcvtpu_2s:
163 ;CHECK-NOT: ld1
164 ;CHECK: fcvtpu.2s v0, v0
165 ;CHECK-NEXT: ret
166         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float> %A)
167         ret <2 x i32> %tmp3
170 define <4 x i32> @fcvtpu_4s(<4 x float> %A) nounwind {
171 ;CHECK-LABEL: fcvtpu_4s:
172 ;CHECK-NOT: ld1
173 ;CHECK: fcvtpu.4s v0, v0
174 ;CHECK-NEXT: ret
175         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float> %A)
176         ret <4 x i32> %tmp3
179 define <2 x i64> @fcvtpu_2d(<2 x double> %A) nounwind {
180 ;CHECK-LABEL: fcvtpu_2d:
181 ;CHECK-NOT: ld1
182 ;CHECK: fcvtpu.2d v0, v0
183 ;CHECK-NEXT: ret
184         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double> %A)
185         ret <2 x i64> %tmp3
188 declare <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float>) nounwind readnone
189 declare <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float>) nounwind readnone
190 declare <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double>) nounwind readnone
192 define <2 x i32> @fcvtns_2s(<2 x float> %A) nounwind {
193 ;CHECK-LABEL: fcvtns_2s:
194 ;CHECK-NOT: ld1
195 ;CHECK: fcvtns.2s v0, v0
196 ;CHECK-NEXT: ret
197         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float> %A)
198         ret <2 x i32> %tmp3
201 define <4 x i32> @fcvtns_4s(<4 x float> %A) nounwind {
202 ;CHECK-LABEL: fcvtns_4s:
203 ;CHECK-NOT: ld1
204 ;CHECK: fcvtns.4s v0, v0
205 ;CHECK-NEXT: ret
206         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float> %A)
207         ret <4 x i32> %tmp3
210 define <2 x i64> @fcvtns_2d(<2 x double> %A) nounwind {
211 ;CHECK-LABEL: fcvtns_2d:
212 ;CHECK-NOT: ld1
213 ;CHECK: fcvtns.2d v0, v0
214 ;CHECK-NEXT: ret
215         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double> %A)
216         ret <2 x i64> %tmp3
219 declare <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float>) nounwind readnone
220 declare <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float>) nounwind readnone
221 declare <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double>) nounwind readnone
223 define <2 x i32> @fcvtnu_2s(<2 x float> %A) nounwind {
224 ;CHECK-LABEL: fcvtnu_2s:
225 ;CHECK-NOT: ld1
226 ;CHECK: fcvtnu.2s v0, v0
227 ;CHECK-NEXT: ret
228         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float> %A)
229         ret <2 x i32> %tmp3
232 define <4 x i32> @fcvtnu_4s(<4 x float> %A) nounwind {
233 ;CHECK-LABEL: fcvtnu_4s:
234 ;CHECK-NOT: ld1
235 ;CHECK: fcvtnu.4s v0, v0
236 ;CHECK-NEXT: ret
237         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float> %A)
238         ret <4 x i32> %tmp3
241 define <2 x i64> @fcvtnu_2d(<2 x double> %A) nounwind {
242 ;CHECK-LABEL: fcvtnu_2d:
243 ;CHECK-NOT: ld1
244 ;CHECK: fcvtnu.2d v0, v0
245 ;CHECK-NEXT: ret
246         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double> %A)
247         ret <2 x i64> %tmp3
250 declare <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float>) nounwind readnone
251 declare <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float>) nounwind readnone
252 declare <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double>) nounwind readnone
254 define <2 x i32> @fcvtzs_2s(<2 x float> %A) nounwind {
255 ;CHECK-LABEL: fcvtzs_2s:
256 ;CHECK-NOT: ld1
257 ;CHECK: fcvtzs.2s v0, v0
258 ;CHECK-NEXT: ret
259         %tmp3 = fptosi <2 x float> %A to <2 x i32>
260         ret <2 x i32> %tmp3
263 define <4 x i32> @fcvtzs_4s(<4 x float> %A) nounwind {
264 ;CHECK-LABEL: fcvtzs_4s:
265 ;CHECK-NOT: ld1
266 ;CHECK: fcvtzs.4s v0, v0
267 ;CHECK-NEXT: ret
268         %tmp3 = fptosi <4 x float> %A to <4 x i32>
269         ret <4 x i32> %tmp3
272 define <2 x i64> @fcvtzs_2d(<2 x double> %A) nounwind {
273 ;CHECK-LABEL: fcvtzs_2d:
274 ;CHECK-NOT: ld1
275 ;CHECK: fcvtzs.2d v0, v0
276 ;CHECK-NEXT: ret
277         %tmp3 = fptosi <2 x double> %A to <2 x i64>
278         ret <2 x i64> %tmp3
282 define <2 x i32> @fcvtzu_2s(<2 x float> %A) nounwind {
283 ;CHECK-LABEL: fcvtzu_2s:
284 ;CHECK-NOT: ld1
285 ;CHECK: fcvtzu.2s v0, v0
286 ;CHECK-NEXT: ret
287         %tmp3 = fptoui <2 x float> %A to <2 x i32>
288         ret <2 x i32> %tmp3
291 define <4 x i32> @fcvtzu_4s(<4 x float> %A) nounwind {
292 ;CHECK-LABEL: fcvtzu_4s:
293 ;CHECK-NOT: ld1
294 ;CHECK: fcvtzu.4s v0, v0
295 ;CHECK-NEXT: ret
296         %tmp3 = fptoui <4 x float> %A to <4 x i32>
297         ret <4 x i32> %tmp3
300 define <2 x i64> @fcvtzu_2d(<2 x double> %A) nounwind {
301 ;CHECK-LABEL: fcvtzu_2d:
302 ;CHECK-NOT: ld1
303 ;CHECK: fcvtzu.2d v0, v0
304 ;CHECK-NEXT: ret
305         %tmp3 = fptoui <2 x double> %A to <2 x i64>
306         ret <2 x i64> %tmp3
309 define <2 x float> @frinta_2s(<2 x float> %A) nounwind {
310 ;CHECK-LABEL: frinta_2s:
311 ;CHECK-NOT: ld1
312 ;CHECK: frinta.2s v0, v0
313 ;CHECK-NEXT: ret
314         %tmp3 = call <2 x float> @llvm.round.v2f32(<2 x float> %A)
315         ret <2 x float> %tmp3
318 define <4 x float> @frinta_4s(<4 x float> %A) nounwind {
319 ;CHECK-LABEL: frinta_4s:
320 ;CHECK-NOT: ld1
321 ;CHECK: frinta.4s v0, v0
322 ;CHECK-NEXT: ret
323         %tmp3 = call <4 x float> @llvm.round.v4f32(<4 x float> %A)
324         ret <4 x float> %tmp3
327 define <2 x double> @frinta_2d(<2 x double> %A) nounwind {
328 ;CHECK-LABEL: frinta_2d:
329 ;CHECK-NOT: ld1
330 ;CHECK: frinta.2d v0, v0
331 ;CHECK-NEXT: ret
332         %tmp3 = call <2 x double> @llvm.round.v2f64(<2 x double> %A)
333         ret <2 x double> %tmp3
336 declare <2 x float> @llvm.round.v2f32(<2 x float>) nounwind readnone
337 declare <4 x float> @llvm.round.v4f32(<4 x float>) nounwind readnone
338 declare <2 x double> @llvm.round.v2f64(<2 x double>) nounwind readnone
340 define <2 x float> @frinti_2s(<2 x float> %A) nounwind {
341 ;CHECK-LABEL: frinti_2s:
342 ;CHECK-NOT: ld1
343 ;CHECK: frinti.2s v0, v0
344 ;CHECK-NEXT: ret
345         %tmp3 = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %A)
346         ret <2 x float> %tmp3
349 define <4 x float> @frinti_4s(<4 x float> %A) nounwind {
350 ;CHECK-LABEL: frinti_4s:
351 ;CHECK-NOT: ld1
352 ;CHECK: frinti.4s v0, v0
353 ;CHECK-NEXT: ret
354         %tmp3 = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %A)
355         ret <4 x float> %tmp3
358 define <2 x double> @frinti_2d(<2 x double> %A) nounwind {
359 ;CHECK-LABEL: frinti_2d:
360 ;CHECK-NOT: ld1
361 ;CHECK: frinti.2d v0, v0
362 ;CHECK-NEXT: ret
363         %tmp3 = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %A)
364         ret <2 x double> %tmp3
367 declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>) nounwind readnone
368 declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) nounwind readnone
369 declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>) nounwind readnone
371 define <2 x float> @frintm_2s(<2 x float> %A) nounwind {
372 ;CHECK-LABEL: frintm_2s:
373 ;CHECK-NOT: ld1
374 ;CHECK: frintm.2s v0, v0
375 ;CHECK-NEXT: ret
376         %tmp3 = call <2 x float> @llvm.floor.v2f32(<2 x float> %A)
377         ret <2 x float> %tmp3
380 define <4 x float> @frintm_4s(<4 x float> %A) nounwind {
381 ;CHECK-LABEL: frintm_4s:
382 ;CHECK-NOT: ld1
383 ;CHECK: frintm.4s v0, v0
384 ;CHECK-NEXT: ret
385         %tmp3 = call <4 x float> @llvm.floor.v4f32(<4 x float> %A)
386         ret <4 x float> %tmp3
389 define <2 x double> @frintm_2d(<2 x double> %A) nounwind {
390 ;CHECK-LABEL: frintm_2d:
391 ;CHECK-NOT: ld1
392 ;CHECK: frintm.2d v0, v0
393 ;CHECK-NEXT: ret
394         %tmp3 = call <2 x double> @llvm.floor.v2f64(<2 x double> %A)
395         ret <2 x double> %tmp3
398 declare <2 x float> @llvm.floor.v2f32(<2 x float>) nounwind readnone
399 declare <4 x float> @llvm.floor.v4f32(<4 x float>) nounwind readnone
400 declare <2 x double> @llvm.floor.v2f64(<2 x double>) nounwind readnone
402 define <2 x float> @frintn_2s(<2 x float> %A) nounwind {
403 ;CHECK-LABEL: frintn_2s:
404 ;CHECK-NOT: ld1
405 ;CHECK: frintn.2s v0, v0
406 ;CHECK-NEXT: ret
407         %tmp3 = call <2 x float> @llvm.aarch64.neon.frintn.v2f32(<2 x float> %A)
408         ret <2 x float> %tmp3
411 define <4 x float> @frintn_4s(<4 x float> %A) nounwind {
412 ;CHECK-LABEL: frintn_4s:
413 ;CHECK-NOT: ld1
414 ;CHECK: frintn.4s v0, v0
415 ;CHECK-NEXT: ret
416         %tmp3 = call <4 x float> @llvm.aarch64.neon.frintn.v4f32(<4 x float> %A)
417         ret <4 x float> %tmp3
420 define <2 x double> @frintn_2d(<2 x double> %A) nounwind {
421 ;CHECK-LABEL: frintn_2d:
422 ;CHECK-NOT: ld1
423 ;CHECK: frintn.2d v0, v0
424 ;CHECK-NEXT: ret
425         %tmp3 = call <2 x double> @llvm.aarch64.neon.frintn.v2f64(<2 x double> %A)
426         ret <2 x double> %tmp3
429 declare <2 x float> @llvm.aarch64.neon.frintn.v2f32(<2 x float>) nounwind readnone
430 declare <4 x float> @llvm.aarch64.neon.frintn.v4f32(<4 x float>) nounwind readnone
431 declare <2 x double> @llvm.aarch64.neon.frintn.v2f64(<2 x double>) nounwind readnone
433 ; FALLBACK-NOT: remark{{.*}}frintp_2s
434 define <2 x float> @frintp_2s(<2 x float> %A) nounwind {
435 ;CHECK-LABEL: frintp_2s:
436 ;CHECK-NOT: ld1
437 ;CHECK: frintp.2s v0, v0
438 ;CHECK-NEXT: ret
439         %tmp3 = call <2 x float> @llvm.ceil.v2f32(<2 x float> %A)
440         ret <2 x float> %tmp3
443 ; FALLBACK-NOT: remark{{.*}}frintp_4s
444 define <4 x float> @frintp_4s(<4 x float> %A) nounwind {
445 ;CHECK-LABEL: frintp_4s:
446 ;CHECK-NOT: ld1
447 ;CHECK: frintp.4s v0, v0
448 ;CHECK-NEXT: ret
449         %tmp3 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %A)
450         ret <4 x float> %tmp3
453 ; FALLBACK-NOT: remark{{.*}}frintp_2d
454 define <2 x double> @frintp_2d(<2 x double> %A) nounwind {
455 ;CHECK-LABEL: frintp_2d:
456 ;CHECK-NOT: ld1
457 ;CHECK: frintp.2d v0, v0
458 ;CHECK-NEXT: ret
459         %tmp3 = call <2 x double> @llvm.ceil.v2f64(<2 x double> %A)
460         ret <2 x double> %tmp3
463 declare <2 x float> @llvm.ceil.v2f32(<2 x float>) nounwind readnone
464 declare <4 x float> @llvm.ceil.v4f32(<4 x float>) nounwind readnone
465 declare <2 x double> @llvm.ceil.v2f64(<2 x double>) nounwind readnone
467 define <2 x float> @frintx_2s(<2 x float> %A) nounwind {
468 ;CHECK-LABEL: frintx_2s:
469 ;CHECK-NOT: ld1
470 ;CHECK: frintx.2s v0, v0
471 ;CHECK-NEXT: ret
472         %tmp3 = call <2 x float> @llvm.rint.v2f32(<2 x float> %A)
473         ret <2 x float> %tmp3
476 define <4 x float> @frintx_4s(<4 x float> %A) nounwind {
477 ;CHECK-LABEL: frintx_4s:
478 ;CHECK-NOT: ld1
479 ;CHECK: frintx.4s v0, v0
480 ;CHECK-NEXT: ret
481         %tmp3 = call <4 x float> @llvm.rint.v4f32(<4 x float> %A)
482         ret <4 x float> %tmp3
485 define <2 x double> @frintx_2d(<2 x double> %A) nounwind {
486 ;CHECK-LABEL: frintx_2d:
487 ;CHECK-NOT: ld1
488 ;CHECK: frintx.2d v0, v0
489 ;CHECK-NEXT: ret
490         %tmp3 = call <2 x double> @llvm.rint.v2f64(<2 x double> %A)
491         ret <2 x double> %tmp3
494 declare <2 x float> @llvm.rint.v2f32(<2 x float>) nounwind readnone
495 declare <4 x float> @llvm.rint.v4f32(<4 x float>) nounwind readnone
496 declare <2 x double> @llvm.rint.v2f64(<2 x double>) nounwind readnone
498 define <2 x float> @frintz_2s(<2 x float> %A) nounwind {
499 ;CHECK-LABEL: frintz_2s:
500 ;CHECK-NOT: ld1
501 ;CHECK: frintz.2s v0, v0
502 ;CHECK-NEXT: ret
503         %tmp3 = call <2 x float> @llvm.trunc.v2f32(<2 x float> %A)
504         ret <2 x float> %tmp3
507 define <4 x float> @frintz_4s(<4 x float> %A) nounwind {
508 ;CHECK-LABEL: frintz_4s:
509 ;CHECK-NOT: ld1
510 ;CHECK: frintz.4s v0, v0
511 ;CHECK-NEXT: ret
512         %tmp3 = call <4 x float> @llvm.trunc.v4f32(<4 x float> %A)
513         ret <4 x float> %tmp3
516 define <2 x double> @frintz_2d(<2 x double> %A) nounwind {
517 ;CHECK-LABEL: frintz_2d:
518 ;CHECK-NOT: ld1
519 ;CHECK: frintz.2d v0, v0
520 ;CHECK-NEXT: ret
521         %tmp3 = call <2 x double> @llvm.trunc.v2f64(<2 x double> %A)
522         ret <2 x double> %tmp3
525 declare <2 x float> @llvm.trunc.v2f32(<2 x float>) nounwind readnone
526 declare <4 x float> @llvm.trunc.v4f32(<4 x float>) nounwind readnone
527 declare <2 x double> @llvm.trunc.v2f64(<2 x double>) nounwind readnone
529 define <2 x float> @fcvtxn_2s(<2 x double> %A) nounwind {
530 ;CHECK-LABEL: fcvtxn_2s:
531 ;CHECK-NOT: ld1
532 ;CHECK: fcvtxn v0.2s, v0.2d
533 ;CHECK-NEXT: ret
534         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
535         ret <2 x float> %tmp3
538 define <4 x float> @fcvtxn_4s(<2 x float> %ret, <2 x double> %A) nounwind {
539 ;CHECK-LABEL: fcvtxn_4s:
540 ;CHECK-NOT: ld1
541 ;CHECK: fcvtxn2 v0.4s, v1.2d
542 ;CHECK-NEXT: ret
543         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
544         %res = shufflevector <2 x float> %ret, <2 x float> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
545         ret <4 x float> %res
548 declare <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double>) nounwind readnone
550 define <2 x i32> @fcvtzsc_2s(<2 x float> %A) nounwind {
551 ;CHECK-LABEL: fcvtzsc_2s:
552 ;CHECK-NOT: ld1
553 ;CHECK: fcvtzs.2s v0, v0, #1
554 ;CHECK-NEXT: ret
555         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float> %A, i32 1)
556         ret <2 x i32> %tmp3
559 define <4 x i32> @fcvtzsc_4s(<4 x float> %A) nounwind {
560 ;CHECK-LABEL: fcvtzsc_4s:
561 ;CHECK-NOT: ld1
562 ;CHECK: fcvtzs.4s v0, v0, #1
563 ;CHECK-NEXT: ret
564         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float> %A, i32 1)
565         ret <4 x i32> %tmp3
568 define <2 x i64> @fcvtzsc_2d(<2 x double> %A) nounwind {
569 ;CHECK-LABEL: fcvtzsc_2d:
570 ;CHECK-NOT: ld1
571 ;CHECK: fcvtzs.2d v0, v0, #1
572 ;CHECK-NEXT: ret
573         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double> %A, i32 1)
574         ret <2 x i64> %tmp3
577 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float>, i32) nounwind readnone
578 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float>, i32) nounwind readnone
579 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double>, i32) nounwind readnone
581 define <2 x i32> @fcvtzuc_2s(<2 x float> %A) nounwind {
582 ;CHECK-LABEL: fcvtzuc_2s:
583 ;CHECK-NOT: ld1
584 ;CHECK: fcvtzu.2s v0, v0, #1
585 ;CHECK-NEXT: ret
586         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float> %A, i32 1)
587         ret <2 x i32> %tmp3
590 define <4 x i32> @fcvtzuc_4s(<4 x float> %A) nounwind {
591 ;CHECK-LABEL: fcvtzuc_4s:
592 ;CHECK-NOT: ld1
593 ;CHECK: fcvtzu.4s v0, v0, #1
594 ;CHECK-NEXT: ret
595         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float> %A, i32 1)
596         ret <4 x i32> %tmp3
599 define <2 x i64> @fcvtzuc_2d(<2 x double> %A) nounwind {
600 ;CHECK-LABEL: fcvtzuc_2d:
601 ;CHECK-NOT: ld1
602 ;CHECK: fcvtzu.2d v0, v0, #1
603 ;CHECK-NEXT: ret
604         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double> %A, i32 1)
605         ret <2 x i64> %tmp3
608 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float>, i32) nounwind readnone
609 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float>, i32) nounwind readnone
610 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double>, i32) nounwind readnone
612 define <2 x float> @scvtf_2sc(<2 x i32> %A) nounwind {
613 ;CHECK-LABEL: scvtf_2sc:
614 ;CHECK-NOT: ld1
615 ;CHECK: scvtf.2s v0, v0, #1
616 ;CHECK-NEXT: ret
617         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
618         ret <2 x float> %tmp3
621 define <4 x float> @scvtf_4sc(<4 x i32> %A) nounwind {
622 ;CHECK-LABEL: scvtf_4sc:
623 ;CHECK-NOT: ld1
624 ;CHECK: scvtf.4s v0, v0, #1
625 ;CHECK-NEXT: ret
626         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
627         ret <4 x float> %tmp3
630 define <2 x double> @scvtf_2dc(<2 x i64> %A) nounwind {
631 ;CHECK-LABEL: scvtf_2dc:
632 ;CHECK-NOT: ld1
633 ;CHECK: scvtf.2d v0, v0, #1
634 ;CHECK-NEXT: ret
635         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
636         ret <2 x double> %tmp3
639 declare <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
640 declare <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
641 declare <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone
643 define <2 x float> @ucvtf_2sc(<2 x i32> %A) nounwind {
644 ;CHECK-LABEL: ucvtf_2sc:
645 ;CHECK-NOT: ld1
646 ;CHECK: ucvtf.2s v0, v0, #1
647 ;CHECK-NEXT: ret
648         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
649         ret <2 x float> %tmp3
652 define <4 x float> @ucvtf_4sc(<4 x i32> %A) nounwind {
653 ;CHECK-LABEL: ucvtf_4sc:
654 ;CHECK-NOT: ld1
655 ;CHECK: ucvtf.4s v0, v0, #1
656 ;CHECK-NEXT: ret
657         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
658         ret <4 x float> %tmp3
661 define <2 x double> @ucvtf_2dc(<2 x i64> %A) nounwind {
662 ;CHECK-LABEL: ucvtf_2dc:
663 ;CHECK-NOT: ld1
664 ;CHECK: ucvtf.2d v0, v0, #1
665 ;CHECK-NEXT: ret
666         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
667         ret <2 x double> %tmp3
671 ;CHECK-LABEL: autogen_SD28458:
672 ;CHECK: fcvt
673 ;CHECK: ret
674 define void @autogen_SD28458(<8 x double> %val.f64, <8 x float>* %addr.f32) {
675   %Tr53 = fptrunc <8 x double> %val.f64 to <8 x float>
676   store <8 x float> %Tr53, <8 x float>* %addr.f32
677   ret void
680 ;CHECK-LABEL: autogen_SD19225:
681 ;CHECK: fcvt
682 ;CHECK: ret
683 define void @autogen_SD19225(<8 x double>* %addr.f64, <8 x float>* %addr.f32) {
684   %A = load <8 x float>, <8 x float>* %addr.f32
685   %Tr53 = fpext <8 x float> %A to <8 x double>
686   store <8 x double> %Tr53, <8 x double>* %addr.f64
687   ret void
690 declare <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
691 declare <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
692 declare <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone