[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-vcvt.ll
blobbe21776e26f8e6da81b2f273caf0236ab9d26141
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 ; FALLBACK-NOT: remark{{.*}}fcvtas_2s
7 define <2 x i32> @fcvtas_2s(<2 x float> %A) nounwind {
8 ;CHECK-LABEL: fcvtas_2s:
9 ;CHECK-NOT: ld1
10 ;CHECK: fcvtas.2s v0, v0
11 ;CHECK-NEXT: ret
12         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float> %A)
13         ret <2 x i32> %tmp3
16 ; FALLBACK-NOT: remark{{.*}}fcvtas_4s
17 define <4 x i32> @fcvtas_4s(<4 x float> %A) nounwind {
18 ;CHECK-LABEL: fcvtas_4s:
19 ;CHECK-NOT: ld1
20 ;CHECK: fcvtas.4s v0, v0
21 ;CHECK-NEXT: ret
22         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float> %A)
23         ret <4 x i32> %tmp3
26 ; FALLBACK-NOT: remark{{.*}}fcvtas_2d
27 define <2 x i64> @fcvtas_2d(<2 x double> %A) nounwind {
28 ;CHECK-LABEL: fcvtas_2d:
29 ;CHECK-NOT: ld1
30 ;CHECK: fcvtas.2d v0, v0
31 ;CHECK-NEXT: ret
32         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double> %A)
33         ret <2 x i64> %tmp3
36 define <1 x i64> @fcvtas_1d(<1 x double> %A) nounwind {
37 ;CHECK-LABEL: fcvtas_1d:
38 ;CHECK-NOT: ld1
39 ;CHECK: fcvtas d0, d0
40 ;CHECK-NEXT: ret
41         %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.v1f64(<1 x double> %A)
42         ret <1 x i64> %tmp3
45 declare <2 x i32> @llvm.aarch64.neon.fcvtas.v2i32.v2f32(<2 x float>) nounwind readnone
46 declare <4 x i32> @llvm.aarch64.neon.fcvtas.v4i32.v4f32(<4 x float>) nounwind readnone
47 declare <2 x i64> @llvm.aarch64.neon.fcvtas.v2i64.v2f64(<2 x double>) nounwind readnone
48 declare <1 x i64> @llvm.aarch64.neon.fcvtas.v1i64.v1f64(<1 x double>) nounwind readnone
50 define <2 x i32> @fcvtau_2s(<2 x float> %A) nounwind {
51 ;CHECK-LABEL: fcvtau_2s:
52 ;CHECK-NOT: ld1
53 ;CHECK: fcvtau.2s v0, v0
54 ;CHECK-NEXT: ret
55         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float> %A)
56         ret <2 x i32> %tmp3
59 define <4 x i32> @fcvtau_4s(<4 x float> %A) nounwind {
60 ;CHECK-LABEL: fcvtau_4s:
61 ;CHECK-NOT: ld1
62 ;CHECK: fcvtau.4s v0, v0
63 ;CHECK-NEXT: ret
64         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float> %A)
65         ret <4 x i32> %tmp3
68 define <2 x i64> @fcvtau_2d(<2 x double> %A) nounwind {
69 ;CHECK-LABEL: fcvtau_2d:
70 ;CHECK-NOT: ld1
71 ;CHECK: fcvtau.2d v0, v0
72 ;CHECK-NEXT: ret
73         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double> %A)
74         ret <2 x i64> %tmp3
77 define <1 x i64> @fcvtau_1d(<1 x double> %A) nounwind {
78 ;CHECK-LABEL: fcvtau_1d:
79 ;CHECK-NOT: ld1
80 ;CHECK: fcvtau d0, d0
81 ;CHECK-NEXT: ret
82         %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.v1f64(<1 x double> %A)
83         ret <1 x i64> %tmp3
86 declare <2 x i32> @llvm.aarch64.neon.fcvtau.v2i32.v2f32(<2 x float>) nounwind readnone
87 declare <4 x i32> @llvm.aarch64.neon.fcvtau.v4i32.v4f32(<4 x float>) nounwind readnone
88 declare <2 x i64> @llvm.aarch64.neon.fcvtau.v2i64.v2f64(<2 x double>) nounwind readnone
89 declare <1 x i64> @llvm.aarch64.neon.fcvtau.v1i64.v1f64(<1 x double>) nounwind readnone
91 define <2 x i32> @fcvtms_2s(<2 x float> %A) nounwind {
92 ;CHECK-LABEL: fcvtms_2s:
93 ;CHECK-NOT: ld1
94 ;CHECK: fcvtms.2s v0, v0
95 ;CHECK-NEXT: ret
96         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float> %A)
97         ret <2 x i32> %tmp3
100 define <4 x i32> @fcvtms_4s(<4 x float> %A) nounwind {
101 ;CHECK-LABEL: fcvtms_4s:
102 ;CHECK-NOT: ld1
103 ;CHECK: fcvtms.4s v0, v0
104 ;CHECK-NEXT: ret
105         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float> %A)
106         ret <4 x i32> %tmp3
109 define <2 x i64> @fcvtms_2d(<2 x double> %A) nounwind {
110 ;CHECK-LABEL: fcvtms_2d:
111 ;CHECK-NOT: ld1
112 ;CHECK: fcvtms.2d v0, v0
113 ;CHECK-NEXT: ret
114         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double> %A)
115         ret <2 x i64> %tmp3
118 define <1 x i64> @fcvtms_1d(<1 x double> %A) nounwind {
119 ;CHECK-LABEL: fcvtms_1d:
120 ;CHECK-NOT: ld1
121 ;CHECK: fcvtms d0, d0
122 ;CHECK-NEXT: ret
123        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.v1f64(<1 x double> %A)
124        ret <1 x i64> %tmp3
127 declare <2 x i32> @llvm.aarch64.neon.fcvtms.v2i32.v2f32(<2 x float>) nounwind readnone
128 declare <4 x i32> @llvm.aarch64.neon.fcvtms.v4i32.v4f32(<4 x float>) nounwind readnone
129 declare <2 x i64> @llvm.aarch64.neon.fcvtms.v2i64.v2f64(<2 x double>) nounwind readnone
130 declare <1 x i64> @llvm.aarch64.neon.fcvtms.v1i64.v1f64(<1 x double>) nounwind readnone
132 define <2 x i32> @fcvtmu_2s(<2 x float> %A) nounwind {
133 ;CHECK-LABEL: fcvtmu_2s:
134 ;CHECK-NOT: ld1
135 ;CHECK: fcvtmu.2s v0, v0
136 ;CHECK-NEXT: ret
137         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float> %A)
138         ret <2 x i32> %tmp3
141 define <4 x i32> @fcvtmu_4s(<4 x float> %A) nounwind {
142 ;CHECK-LABEL: fcvtmu_4s:
143 ;CHECK-NOT: ld1
144 ;CHECK: fcvtmu.4s v0, v0
145 ;CHECK-NEXT: ret
146         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float> %A)
147         ret <4 x i32> %tmp3
150 define <2 x i64> @fcvtmu_2d(<2 x double> %A) nounwind {
151 ;CHECK-LABEL: fcvtmu_2d:
152 ;CHECK-NOT: ld1
153 ;CHECK: fcvtmu.2d v0, v0
154 ;CHECK-NEXT: ret
155         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double> %A)
156         ret <2 x i64> %tmp3
159 define <1 x i64> @fcvtmu_1d(<1 x double> %A) nounwind {
160 ;CHECK-LABEL: fcvtmu_1d:
161 ;CHECK-NOT: ld1
162 ;CHECK: fcvtmu d0, d0
163 ;CHECK-NEXT: ret
164        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.v1f64(<1 x double> %A)
165        ret <1 x i64> %tmp3
168 declare <2 x i32> @llvm.aarch64.neon.fcvtmu.v2i32.v2f32(<2 x float>) nounwind readnone
169 declare <4 x i32> @llvm.aarch64.neon.fcvtmu.v4i32.v4f32(<4 x float>) nounwind readnone
170 declare <2 x i64> @llvm.aarch64.neon.fcvtmu.v2i64.v2f64(<2 x double>) nounwind readnone
171 declare <1 x i64> @llvm.aarch64.neon.fcvtmu.v1i64.v1f64(<1 x double>) nounwind readnone
173 define <2 x i32> @fcvtps_2s(<2 x float> %A) nounwind {
174 ;CHECK-LABEL: fcvtps_2s:
175 ;CHECK-NOT: ld1
176 ;CHECK: fcvtps.2s v0, v0
177 ;CHECK-NEXT: ret
178         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float> %A)
179         ret <2 x i32> %tmp3
182 define <4 x i32> @fcvtps_4s(<4 x float> %A) nounwind {
183 ;CHECK-LABEL: fcvtps_4s:
184 ;CHECK-NOT: ld1
185 ;CHECK: fcvtps.4s v0, v0
186 ;CHECK-NEXT: ret
187         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float> %A)
188         ret <4 x i32> %tmp3
191 define <2 x i64> @fcvtps_2d(<2 x double> %A) nounwind {
192 ;CHECK-LABEL: fcvtps_2d:
193 ;CHECK-NOT: ld1
194 ;CHECK: fcvtps.2d v0, v0
195 ;CHECK-NEXT: ret
196         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double> %A)
197         ret <2 x i64> %tmp3
200 define <1 x i64> @fcvtps_1d(<1 x double> %A) nounwind {
201 ;CHECK-LABEL: fcvtps_1d:
202 ;CHECK-NOT: ld1
203 ;CHECK: fcvtps d0, d0
204 ;CHECK-NEXT: ret
205        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.v1f64(<1 x double> %A)
206        ret <1 x i64> %tmp3
209 declare <2 x i32> @llvm.aarch64.neon.fcvtps.v2i32.v2f32(<2 x float>) nounwind readnone
210 declare <4 x i32> @llvm.aarch64.neon.fcvtps.v4i32.v4f32(<4 x float>) nounwind readnone
211 declare <2 x i64> @llvm.aarch64.neon.fcvtps.v2i64.v2f64(<2 x double>) nounwind readnone
212 declare <1 x i64> @llvm.aarch64.neon.fcvtps.v1i64.v1f64(<1 x double>) nounwind readnone
214 define <2 x i32> @fcvtpu_2s(<2 x float> %A) nounwind {
215 ;CHECK-LABEL: fcvtpu_2s:
216 ;CHECK-NOT: ld1
217 ;CHECK: fcvtpu.2s v0, v0
218 ;CHECK-NEXT: ret
219         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float> %A)
220         ret <2 x i32> %tmp3
223 define <4 x i32> @fcvtpu_4s(<4 x float> %A) nounwind {
224 ;CHECK-LABEL: fcvtpu_4s:
225 ;CHECK-NOT: ld1
226 ;CHECK: fcvtpu.4s v0, v0
227 ;CHECK-NEXT: ret
228         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float> %A)
229         ret <4 x i32> %tmp3
232 define <2 x i64> @fcvtpu_2d(<2 x double> %A) nounwind {
233 ;CHECK-LABEL: fcvtpu_2d:
234 ;CHECK-NOT: ld1
235 ;CHECK: fcvtpu.2d v0, v0
236 ;CHECK-NEXT: ret
237         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double> %A)
238         ret <2 x i64> %tmp3
241 define <1 x i64> @fcvtpu_1d(<1 x double> %A) nounwind {
242 ;CHECK-LABEL: fcvtpu_1d:
243 ;CHECK-NOT: ld1
244 ;CHECK: fcvtpu d0, d0
245 ;CHECK-NEXT: ret
246        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.v1f64(<1 x double> %A)
247        ret <1 x i64> %tmp3
250 declare <2 x i32> @llvm.aarch64.neon.fcvtpu.v2i32.v2f32(<2 x float>) nounwind readnone
251 declare <4 x i32> @llvm.aarch64.neon.fcvtpu.v4i32.v4f32(<4 x float>) nounwind readnone
252 declare <2 x i64> @llvm.aarch64.neon.fcvtpu.v2i64.v2f64(<2 x double>) nounwind readnone
253 declare <1 x i64> @llvm.aarch64.neon.fcvtpu.v1i64.v1f64(<1 x double>) nounwind readnone
255 define <2 x i32> @fcvtns_2s(<2 x float> %A) nounwind {
256 ;CHECK-LABEL: fcvtns_2s:
257 ;CHECK-NOT: ld1
258 ;CHECK: fcvtns.2s v0, v0
259 ;CHECK-NEXT: ret
260         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float> %A)
261         ret <2 x i32> %tmp3
264 define <4 x i32> @fcvtns_4s(<4 x float> %A) nounwind {
265 ;CHECK-LABEL: fcvtns_4s:
266 ;CHECK-NOT: ld1
267 ;CHECK: fcvtns.4s v0, v0
268 ;CHECK-NEXT: ret
269         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float> %A)
270         ret <4 x i32> %tmp3
273 define <2 x i64> @fcvtns_2d(<2 x double> %A) nounwind {
274 ;CHECK-LABEL: fcvtns_2d:
275 ;CHECK-NOT: ld1
276 ;CHECK: fcvtns.2d v0, v0
277 ;CHECK-NEXT: ret
278         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double> %A)
279         ret <2 x i64> %tmp3
282 define <1 x i64> @fcvtns_1d(<1 x double> %A) nounwind {
283 ;CHECK-LABEL: fcvtns_1d:
284 ;CHECK-NOT: ld1
285 ;CHECK: fcvtns d0, d0
286 ;CHECK-NEXT: ret
287        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.v1f64(<1 x double> %A)
288        ret <1 x i64> %tmp3
291 declare <2 x i32> @llvm.aarch64.neon.fcvtns.v2i32.v2f32(<2 x float>) nounwind readnone
292 declare <4 x i32> @llvm.aarch64.neon.fcvtns.v4i32.v4f32(<4 x float>) nounwind readnone
293 declare <2 x i64> @llvm.aarch64.neon.fcvtns.v2i64.v2f64(<2 x double>) nounwind readnone
294 declare <1 x i64> @llvm.aarch64.neon.fcvtns.v1i64.v1f64(<1 x double>) nounwind readnone
296 define <2 x i32> @fcvtnu_2s(<2 x float> %A) nounwind {
297 ;CHECK-LABEL: fcvtnu_2s:
298 ;CHECK-NOT: ld1
299 ;CHECK: fcvtnu.2s v0, v0
300 ;CHECK-NEXT: ret
301         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float> %A)
302         ret <2 x i32> %tmp3
305 define <4 x i32> @fcvtnu_4s(<4 x float> %A) nounwind {
306 ;CHECK-LABEL: fcvtnu_4s:
307 ;CHECK-NOT: ld1
308 ;CHECK: fcvtnu.4s v0, v0
309 ;CHECK-NEXT: ret
310         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float> %A)
311         ret <4 x i32> %tmp3
314 define <2 x i64> @fcvtnu_2d(<2 x double> %A) nounwind {
315 ;CHECK-LABEL: fcvtnu_2d:
316 ;CHECK-NOT: ld1
317 ;CHECK: fcvtnu.2d v0, v0
318 ;CHECK-NEXT: ret
319         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double> %A)
320         ret <2 x i64> %tmp3
323 define <1 x i64> @fcvtnu_1d(<1 x double> %A) nounwind {
324 ;CHECK-LABEL: fcvtnu_1d:
325 ;CHECK-NOT: ld1
326 ;CHECK: fcvtnu d0, d0
327 ;CHECK-NEXT: ret
328        %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.v1f64(<1 x double> %A)
329        ret <1 x i64> %tmp3
332 declare <2 x i32> @llvm.aarch64.neon.fcvtnu.v2i32.v2f32(<2 x float>) nounwind readnone
333 declare <4 x i32> @llvm.aarch64.neon.fcvtnu.v4i32.v4f32(<4 x float>) nounwind readnone
334 declare <2 x i64> @llvm.aarch64.neon.fcvtnu.v2i64.v2f64(<2 x double>) nounwind readnone
335 declare <1 x i64> @llvm.aarch64.neon.fcvtnu.v1i64.v1f64(<1 x double>) nounwind readnone
337 define <2 x i32> @fcvtzs_2s(<2 x float> %A) nounwind {
338 ;CHECK-LABEL: fcvtzs_2s:
339 ;CHECK-NOT: ld1
340 ;CHECK: fcvtzs.2s v0, v0
341 ;CHECK-NEXT: ret
342         %tmp3 = fptosi <2 x float> %A to <2 x i32>
343         ret <2 x i32> %tmp3
346 define <4 x i32> @fcvtzs_4s(<4 x float> %A) nounwind {
347 ;CHECK-LABEL: fcvtzs_4s:
348 ;CHECK-NOT: ld1
349 ;CHECK: fcvtzs.4s v0, v0
350 ;CHECK-NEXT: ret
351         %tmp3 = fptosi <4 x float> %A to <4 x i32>
352         ret <4 x i32> %tmp3
355 define <2 x i64> @fcvtzs_2d(<2 x double> %A) nounwind {
356 ;CHECK-LABEL: fcvtzs_2d:
357 ;CHECK-NOT: ld1
358 ;CHECK: fcvtzs.2d v0, v0
359 ;CHECK-NEXT: ret
360         %tmp3 = fptosi <2 x double> %A to <2 x i64>
361         ret <2 x i64> %tmp3
364 ; FIXME: Generate "fcvtzs d0, d0"?
365 define <1 x i64> @fcvtzs_1d(<1 x double> %A) nounwind {
366 ;CHECK-LABEL: fcvtzs_1d:
367 ;CHECK-NOT: ld1
368 ;CHECK: fcvtzs x8, d0
369 ;CHECK-NEXT: mov d0, x8
370 ;CHECK-NEXT: ret
371         %tmp3 = fptosi <1 x double> %A to <1 x i64>
372         ret <1 x i64> %tmp3
375 define <2 x i32> @fcvtzs_2s_intrinsic(<2 x float> %A) nounwind {
376 ;CHECK-LABEL: fcvtzs_2s_intrinsic:
377 ;CHECK-NOT: ld1
378 ;CHECK: fcvtzs.2s v0, v0
379 ;CHECK-NEXT: ret
380         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtzs.v2i32.v2f32(<2 x float> %A)
381         ret <2 x i32> %tmp3
384 define <4 x i32> @fcvtzs_4s_intrinsic(<4 x float> %A) nounwind {
385 ;CHECK-LABEL: fcvtzs_4s_intrinsic:
386 ;CHECK-NOT: ld1
387 ;CHECK: fcvtzs.4s v0, v0
388 ;CHECK-NEXT: ret
389         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtzs.v4i32.v4f32(<4 x float> %A)
390         ret <4 x i32> %tmp3
393 define <2 x i64> @fcvtzs_2d_intrinsic(<2 x double> %A) nounwind {
394 ;CHECK-LABEL: fcvtzs_2d_intrinsic:
395 ;CHECK-NOT: ld1
396 ;CHECK: fcvtzs.2d v0, v0
397 ;CHECK-NEXT: ret
398         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtzs.v2i64.v2f64(<2 x double> %A)
399         ret <2 x i64> %tmp3
402 define <1 x i64> @fcvtzs_1d_intrinsic(<1 x double> %A) nounwind {
403 ;CHECK-LABEL: fcvtzs_1d_intrinsic:
404 ;CHECK-NOT: ld1
405 ;CHECK: fcvtzs{{.*}}, d0
406 ;CHECK: ret
407         %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.v1f64(<1 x double> %A)
408         ret <1 x i64> %tmp3
411 declare <2 x i32> @llvm.aarch64.neon.fcvtzs.v2i32.v2f32(<2 x float>) nounwind readnone
412 declare <4 x i32> @llvm.aarch64.neon.fcvtzs.v4i32.v4f32(<4 x float>) nounwind readnone
413 declare <2 x i64> @llvm.aarch64.neon.fcvtzs.v2i64.v2f64(<2 x double>) nounwind readnone
414 declare <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.v1f64(<1 x double>) nounwind readnone
416 define <2 x i32> @fcvtzu_2s(<2 x float> %A) nounwind {
417 ;CHECK-LABEL: fcvtzu_2s:
418 ;CHECK-NOT: ld1
419 ;CHECK: fcvtzu.2s v0, v0
420 ;CHECK-NEXT: ret
421         %tmp3 = fptoui <2 x float> %A to <2 x i32>
422         ret <2 x i32> %tmp3
425 define <4 x i32> @fcvtzu_4s(<4 x float> %A) nounwind {
426 ;CHECK-LABEL: fcvtzu_4s:
427 ;CHECK-NOT: ld1
428 ;CHECK: fcvtzu.4s v0, v0
429 ;CHECK-NEXT: ret
430         %tmp3 = fptoui <4 x float> %A to <4 x i32>
431         ret <4 x i32> %tmp3
434 define <2 x i64> @fcvtzu_2d(<2 x double> %A) nounwind {
435 ;CHECK-LABEL: fcvtzu_2d:
436 ;CHECK-NOT: ld1
437 ;CHECK: fcvtzu.2d v0, v0
438 ;CHECK-NEXT: ret
439         %tmp3 = fptoui <2 x double> %A to <2 x i64>
440         ret <2 x i64> %tmp3
443 ; FIXME: Generate "fcvtzu d0, d0"?
444 define <1 x i64> @fcvtzu_1d(<1 x double> %A) nounwind {
445 ;CHECK-LABEL: fcvtzu_1d:
446 ;CHECK-NOT: ld1
447 ;CHECK: fcvtzu x8, d0
448 ;CHECK-NEXT: mov d0, x8
449 ;CHECK-NEXT: ret
450         %tmp3 = fptoui <1 x double> %A to <1 x i64>
451         ret <1 x i64> %tmp3
454 define <2 x i32> @fcvtzu_2s_intrinsic(<2 x float> %A) nounwind {
455 ;CHECK-LABEL: fcvtzu_2s_intrinsic:
456 ;CHECK-NOT: ld1
457 ;CHECK: fcvtzu.2s v0, v0
458 ;CHECK-NEXT: ret
459         %tmp3 = call <2 x i32> @llvm.aarch64.neon.fcvtzu.v2i32.v2f32(<2 x float> %A)
460         ret <2 x i32> %tmp3
463 define <4 x i32> @fcvtzu_4s_intrinsic(<4 x float> %A) nounwind {
464 ;CHECK-LABEL: fcvtzu_4s_intrinsic:
465 ;CHECK-NOT: ld1
466 ;CHECK: fcvtzu.4s v0, v0
467 ;CHECK-NEXT: ret
468         %tmp3 = call <4 x i32> @llvm.aarch64.neon.fcvtzu.v4i32.v4f32(<4 x float> %A)
469         ret <4 x i32> %tmp3
472 define <2 x i64> @fcvtzu_2d_intrinsic(<2 x double> %A) nounwind {
473 ;CHECK-LABEL: fcvtzu_2d_intrinsic:
474 ;CHECK-NOT: ld1
475 ;CHECK: fcvtzu.2d v0, v0
476 ;CHECK-NEXT: ret
477         %tmp3 = call <2 x i64> @llvm.aarch64.neon.fcvtzu.v2i64.v2f64(<2 x double> %A)
478         ret <2 x i64> %tmp3
481 define <1 x i64> @fcvtzu_1d_intrinsic(<1 x double> %A) nounwind {
482 ;CHECK-LABEL: fcvtzu_1d_intrinsic:
483 ;CHECK-NOT: ld1
484 ;CHECK: fcvtzu{{.*}}, d0
485 ;CHECK: ret
486         %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.v1f64(<1 x double> %A)
487         ret <1 x i64> %tmp3
490 declare <2 x i32> @llvm.aarch64.neon.fcvtzu.v2i32.v2f32(<2 x float>) nounwind readnone
491 declare <4 x i32> @llvm.aarch64.neon.fcvtzu.v4i32.v4f32(<4 x float>) nounwind readnone
492 declare <2 x i64> @llvm.aarch64.neon.fcvtzu.v2i64.v2f64(<2 x double>) nounwind readnone
493 declare <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.v1f64(<1 x double>) nounwind readnone
495 define <2 x float> @frinta_2s(<2 x float> %A) nounwind {
496 ;CHECK-LABEL: frinta_2s:
497 ;CHECK-NOT: ld1
498 ;CHECK: frinta.2s v0, v0
499 ;CHECK-NEXT: ret
500         %tmp3 = call <2 x float> @llvm.round.v2f32(<2 x float> %A)
501         ret <2 x float> %tmp3
504 define <4 x float> @frinta_4s(<4 x float> %A) nounwind {
505 ;CHECK-LABEL: frinta_4s:
506 ;CHECK-NOT: ld1
507 ;CHECK: frinta.4s v0, v0
508 ;CHECK-NEXT: ret
509         %tmp3 = call <4 x float> @llvm.round.v4f32(<4 x float> %A)
510         ret <4 x float> %tmp3
513 define <2 x double> @frinta_2d(<2 x double> %A) nounwind {
514 ;CHECK-LABEL: frinta_2d:
515 ;CHECK-NOT: ld1
516 ;CHECK: frinta.2d v0, v0
517 ;CHECK-NEXT: ret
518         %tmp3 = call <2 x double> @llvm.round.v2f64(<2 x double> %A)
519         ret <2 x double> %tmp3
522 declare <2 x float> @llvm.round.v2f32(<2 x float>) nounwind readnone
523 declare <4 x float> @llvm.round.v4f32(<4 x float>) nounwind readnone
524 declare <2 x double> @llvm.round.v2f64(<2 x double>) nounwind readnone
526 define <2 x float> @frinti_2s(<2 x float> %A) nounwind {
527 ;CHECK-LABEL: frinti_2s:
528 ;CHECK-NOT: ld1
529 ;CHECK: frinti.2s v0, v0
530 ;CHECK-NEXT: ret
531         %tmp3 = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %A)
532         ret <2 x float> %tmp3
535 define <4 x float> @frinti_4s(<4 x float> %A) nounwind {
536 ;CHECK-LABEL: frinti_4s:
537 ;CHECK-NOT: ld1
538 ;CHECK: frinti.4s v0, v0
539 ;CHECK-NEXT: ret
540         %tmp3 = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %A)
541         ret <4 x float> %tmp3
544 define <2 x double> @frinti_2d(<2 x double> %A) nounwind {
545 ;CHECK-LABEL: frinti_2d:
546 ;CHECK-NOT: ld1
547 ;CHECK: frinti.2d v0, v0
548 ;CHECK-NEXT: ret
549         %tmp3 = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %A)
550         ret <2 x double> %tmp3
553 declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>) nounwind readnone
554 declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) nounwind readnone
555 declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>) nounwind readnone
557 define <2 x float> @frintm_2s(<2 x float> %A) nounwind {
558 ;CHECK-LABEL: frintm_2s:
559 ;CHECK-NOT: ld1
560 ;CHECK: frintm.2s v0, v0
561 ;CHECK-NEXT: ret
562         %tmp3 = call <2 x float> @llvm.floor.v2f32(<2 x float> %A)
563         ret <2 x float> %tmp3
566 define <4 x float> @frintm_4s(<4 x float> %A) nounwind {
567 ;CHECK-LABEL: frintm_4s:
568 ;CHECK-NOT: ld1
569 ;CHECK: frintm.4s v0, v0
570 ;CHECK-NEXT: ret
571         %tmp3 = call <4 x float> @llvm.floor.v4f32(<4 x float> %A)
572         ret <4 x float> %tmp3
575 define <2 x double> @frintm_2d(<2 x double> %A) nounwind {
576 ;CHECK-LABEL: frintm_2d:
577 ;CHECK-NOT: ld1
578 ;CHECK: frintm.2d v0, v0
579 ;CHECK-NEXT: ret
580         %tmp3 = call <2 x double> @llvm.floor.v2f64(<2 x double> %A)
581         ret <2 x double> %tmp3
584 declare <2 x float> @llvm.floor.v2f32(<2 x float>) nounwind readnone
585 declare <4 x float> @llvm.floor.v4f32(<4 x float>) nounwind readnone
586 declare <2 x double> @llvm.floor.v2f64(<2 x double>) nounwind readnone
588 define <2 x float> @frintn_2s(<2 x float> %A) nounwind {
589 ;CHECK-LABEL: frintn_2s:
590 ;CHECK-NOT: ld1
591 ;CHECK: frintn.2s v0, v0
592 ;CHECK-NEXT: ret
593         %tmp3 = call <2 x float> @llvm.roundeven.v2f32(<2 x float> %A)
594         ret <2 x float> %tmp3
597 define <4 x float> @frintn_4s(<4 x float> %A) nounwind {
598 ;CHECK-LABEL: frintn_4s:
599 ;CHECK-NOT: ld1
600 ;CHECK: frintn.4s v0, v0
601 ;CHECK-NEXT: ret
602         %tmp3 = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %A)
603         ret <4 x float> %tmp3
606 define <2 x double> @frintn_2d(<2 x double> %A) nounwind {
607 ;CHECK-LABEL: frintn_2d:
608 ;CHECK-NOT: ld1
609 ;CHECK: frintn.2d v0, v0
610 ;CHECK-NEXT: ret
611         %tmp3 = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %A)
612         ret <2 x double> %tmp3
615 declare <2 x float> @llvm.roundeven.v2f32(<2 x float>) nounwind readnone
616 declare <4 x float> @llvm.roundeven.v4f32(<4 x float>) nounwind readnone
617 declare <2 x double> @llvm.roundeven.v2f64(<2 x double>) nounwind readnone
619 ; FALLBACK-NOT: remark{{.*}}frintp_2s
620 define <2 x float> @frintp_2s(<2 x float> %A) nounwind {
621 ;CHECK-LABEL: frintp_2s:
622 ;CHECK-NOT: ld1
623 ;CHECK: frintp.2s v0, v0
624 ;CHECK-NEXT: ret
625         %tmp3 = call <2 x float> @llvm.ceil.v2f32(<2 x float> %A)
626         ret <2 x float> %tmp3
629 ; FALLBACK-NOT: remark{{.*}}frintp_4s
630 define <4 x float> @frintp_4s(<4 x float> %A) nounwind {
631 ;CHECK-LABEL: frintp_4s:
632 ;CHECK-NOT: ld1
633 ;CHECK: frintp.4s v0, v0
634 ;CHECK-NEXT: ret
635         %tmp3 = call <4 x float> @llvm.ceil.v4f32(<4 x float> %A)
636         ret <4 x float> %tmp3
639 ; FALLBACK-NOT: remark{{.*}}frintp_2d
640 define <2 x double> @frintp_2d(<2 x double> %A) nounwind {
641 ;CHECK-LABEL: frintp_2d:
642 ;CHECK-NOT: ld1
643 ;CHECK: frintp.2d v0, v0
644 ;CHECK-NEXT: ret
645         %tmp3 = call <2 x double> @llvm.ceil.v2f64(<2 x double> %A)
646         ret <2 x double> %tmp3
649 declare <2 x float> @llvm.ceil.v2f32(<2 x float>) nounwind readnone
650 declare <4 x float> @llvm.ceil.v4f32(<4 x float>) nounwind readnone
651 declare <2 x double> @llvm.ceil.v2f64(<2 x double>) nounwind readnone
653 define <2 x float> @frintx_2s(<2 x float> %A) nounwind {
654 ;CHECK-LABEL: frintx_2s:
655 ;CHECK-NOT: ld1
656 ;CHECK: frintx.2s v0, v0
657 ;CHECK-NEXT: ret
658         %tmp3 = call <2 x float> @llvm.rint.v2f32(<2 x float> %A)
659         ret <2 x float> %tmp3
662 define <4 x float> @frintx_4s(<4 x float> %A) nounwind {
663 ;CHECK-LABEL: frintx_4s:
664 ;CHECK-NOT: ld1
665 ;CHECK: frintx.4s v0, v0
666 ;CHECK-NEXT: ret
667         %tmp3 = call <4 x float> @llvm.rint.v4f32(<4 x float> %A)
668         ret <4 x float> %tmp3
671 define <2 x double> @frintx_2d(<2 x double> %A) nounwind {
672 ;CHECK-LABEL: frintx_2d:
673 ;CHECK-NOT: ld1
674 ;CHECK: frintx.2d v0, v0
675 ;CHECK-NEXT: ret
676         %tmp3 = call <2 x double> @llvm.rint.v2f64(<2 x double> %A)
677         ret <2 x double> %tmp3
680 declare <2 x float> @llvm.rint.v2f32(<2 x float>) nounwind readnone
681 declare <4 x float> @llvm.rint.v4f32(<4 x float>) nounwind readnone
682 declare <2 x double> @llvm.rint.v2f64(<2 x double>) nounwind readnone
684 define <2 x float> @frintz_2s(<2 x float> %A) nounwind {
685 ;CHECK-LABEL: frintz_2s:
686 ;CHECK-NOT: ld1
687 ;CHECK: frintz.2s v0, v0
688 ;CHECK-NEXT: ret
689         %tmp3 = call <2 x float> @llvm.trunc.v2f32(<2 x float> %A)
690         ret <2 x float> %tmp3
693 define <4 x float> @frintz_4s(<4 x float> %A) nounwind {
694 ;CHECK-LABEL: frintz_4s:
695 ;CHECK-NOT: ld1
696 ;CHECK: frintz.4s v0, v0
697 ;CHECK-NEXT: ret
698         %tmp3 = call <4 x float> @llvm.trunc.v4f32(<4 x float> %A)
699         ret <4 x float> %tmp3
702 define <2 x double> @frintz_2d(<2 x double> %A) nounwind {
703 ;CHECK-LABEL: frintz_2d:
704 ;CHECK-NOT: ld1
705 ;CHECK: frintz.2d v0, v0
706 ;CHECK-NEXT: ret
707         %tmp3 = call <2 x double> @llvm.trunc.v2f64(<2 x double> %A)
708         ret <2 x double> %tmp3
711 declare <2 x float> @llvm.trunc.v2f32(<2 x float>) nounwind readnone
712 declare <4 x float> @llvm.trunc.v4f32(<4 x float>) nounwind readnone
713 declare <2 x double> @llvm.trunc.v2f64(<2 x double>) nounwind readnone
715 define <2 x float> @fcvtxn_2s(<2 x double> %A) nounwind {
716 ;CHECK-LABEL: fcvtxn_2s:
717 ;CHECK-NOT: ld1
718 ;CHECK: fcvtxn v0.2s, v0.2d
719 ;CHECK-NEXT: ret
720         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
721         ret <2 x float> %tmp3
724 define <4 x float> @fcvtxn_4s(<2 x float> %ret, <2 x double> %A) nounwind {
725 ;CHECK-LABEL: fcvtxn_4s:
726 ;CHECK-NOT: ld1
727 ;CHECK: fcvtxn2 v0.4s, v1.2d
728 ;CHECK-NEXT: ret
729         %tmp3 = call <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double> %A)
730         %res = shufflevector <2 x float> %ret, <2 x float> %tmp3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
731         ret <4 x float> %res
734 declare <2 x float> @llvm.aarch64.neon.fcvtxn.v2f32.v2f64(<2 x double>) nounwind readnone
736 define <2 x i32> @fcvtzsc_2s(<2 x float> %A) nounwind {
737 ;CHECK-LABEL: fcvtzsc_2s:
738 ;CHECK-NOT: ld1
739 ;CHECK: fcvtzs.2s v0, v0, #1
740 ;CHECK-NEXT: ret
741         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float> %A, i32 1)
742         ret <2 x i32> %tmp3
745 define <4 x i32> @fcvtzsc_4s(<4 x float> %A) nounwind {
746 ;CHECK-LABEL: fcvtzsc_4s:
747 ;CHECK-NOT: ld1
748 ;CHECK: fcvtzs.4s v0, v0, #1
749 ;CHECK-NEXT: ret
750         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float> %A, i32 1)
751         ret <4 x i32> %tmp3
754 define <2 x i64> @fcvtzsc_2d(<2 x double> %A) nounwind {
755 ;CHECK-LABEL: fcvtzsc_2d:
756 ;CHECK-NOT: ld1
757 ;CHECK: fcvtzs.2d v0, v0, #1
758 ;CHECK-NEXT: ret
759         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double> %A, i32 1)
760         ret <2 x i64> %tmp3
763 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v2i32.v2f32(<2 x float>, i32) nounwind readnone
764 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxs.v4i32.v4f32(<4 x float>, i32) nounwind readnone
765 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxs.v2i64.v2f64(<2 x double>, i32) nounwind readnone
767 define <2 x i32> @fcvtzuc_2s(<2 x float> %A) nounwind {
768 ;CHECK-LABEL: fcvtzuc_2s:
769 ;CHECK-NOT: ld1
770 ;CHECK: fcvtzu.2s v0, v0, #1
771 ;CHECK-NEXT: ret
772         %tmp3 = call <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float> %A, i32 1)
773         ret <2 x i32> %tmp3
776 define <4 x i32> @fcvtzuc_4s(<4 x float> %A) nounwind {
777 ;CHECK-LABEL: fcvtzuc_4s:
778 ;CHECK-NOT: ld1
779 ;CHECK: fcvtzu.4s v0, v0, #1
780 ;CHECK-NEXT: ret
781         %tmp3 = call <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float> %A, i32 1)
782         ret <4 x i32> %tmp3
785 define <2 x i64> @fcvtzuc_2d(<2 x double> %A) nounwind {
786 ;CHECK-LABEL: fcvtzuc_2d:
787 ;CHECK-NOT: ld1
788 ;CHECK: fcvtzu.2d v0, v0, #1
789 ;CHECK-NEXT: ret
790         %tmp3 = call <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double> %A, i32 1)
791         ret <2 x i64> %tmp3
794 declare <2 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v2i32.v2f32(<2 x float>, i32) nounwind readnone
795 declare <4 x i32> @llvm.aarch64.neon.vcvtfp2fxu.v4i32.v4f32(<4 x float>, i32) nounwind readnone
796 declare <2 x i64> @llvm.aarch64.neon.vcvtfp2fxu.v2i64.v2f64(<2 x double>, i32) nounwind readnone
798 define <2 x float> @scvtf_2sc(<2 x i32> %A) nounwind {
799 ;CHECK-LABEL: scvtf_2sc:
800 ;CHECK-NOT: ld1
801 ;CHECK: scvtf.2s v0, v0, #1
802 ;CHECK-NEXT: ret
803         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
804         ret <2 x float> %tmp3
807 define <4 x float> @scvtf_4sc(<4 x i32> %A) nounwind {
808 ;CHECK-LABEL: scvtf_4sc:
809 ;CHECK-NOT: ld1
810 ;CHECK: scvtf.4s v0, v0, #1
811 ;CHECK-NEXT: ret
812         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
813         ret <4 x float> %tmp3
816 define <2 x double> @scvtf_2dc(<2 x i64> %A) nounwind {
817 ;CHECK-LABEL: scvtf_2dc:
818 ;CHECK-NOT: ld1
819 ;CHECK: scvtf.2d v0, v0, #1
820 ;CHECK-NEXT: ret
821         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
822         ret <2 x double> %tmp3
825 declare <2 x float> @llvm.aarch64.neon.vcvtfxs2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
826 declare <4 x float> @llvm.aarch64.neon.vcvtfxs2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
827 declare <2 x double> @llvm.aarch64.neon.vcvtfxs2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone
829 define <2 x float> @ucvtf_2sc(<2 x i32> %A) nounwind {
830 ;CHECK-LABEL: ucvtf_2sc:
831 ;CHECK-NOT: ld1
832 ;CHECK: ucvtf.2s v0, v0, #1
833 ;CHECK-NEXT: ret
834         %tmp3 = call <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32> %A, i32 1)
835         ret <2 x float> %tmp3
838 define <4 x float> @ucvtf_4sc(<4 x i32> %A) nounwind {
839 ;CHECK-LABEL: ucvtf_4sc:
840 ;CHECK-NOT: ld1
841 ;CHECK: ucvtf.4s v0, v0, #1
842 ;CHECK-NEXT: ret
843         %tmp3 = call <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32> %A, i32 1)
844         ret <4 x float> %tmp3
847 define <2 x double> @ucvtf_2dc(<2 x i64> %A) nounwind {
848 ;CHECK-LABEL: ucvtf_2dc:
849 ;CHECK-NOT: ld1
850 ;CHECK: ucvtf.2d v0, v0, #1
851 ;CHECK-NEXT: ret
852         %tmp3 = call <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64> %A, i32 1)
853         ret <2 x double> %tmp3
857 ;CHECK-LABEL: autogen_SD28458:
858 ;CHECK: fcvt
859 ;CHECK: ret
860 define void @autogen_SD28458(<8 x double> %val.f64, ptr %addr.f32) {
861   %Tr53 = fptrunc <8 x double> %val.f64 to <8 x float>
862   store <8 x float> %Tr53, ptr %addr.f32
863   ret void
866 ;CHECK-LABEL: autogen_SD19225:
867 ;CHECK: fcvt
868 ;CHECK: ret
869 define void @autogen_SD19225(ptr %addr.f64, ptr %addr.f32) {
870   %A = load <8 x float>, ptr %addr.f32
871   %Tr53 = fpext <8 x float> %A to <8 x double>
872   store <8 x double> %Tr53, ptr %addr.f64
873   ret void
876 declare <2 x float> @llvm.aarch64.neon.vcvtfxu2fp.v2f32.v2i32(<2 x i32>, i32) nounwind readnone
877 declare <4 x float> @llvm.aarch64.neon.vcvtfxu2fp.v4f32.v4i32(<4 x i32>, i32) nounwind readnone
878 declare <2 x double> @llvm.aarch64.neon.vcvtfxu2fp.v2f64.v2i64(<2 x i64>, i32) nounwind readnone