[ARM] MVE compare vector splat combine
[llvm-complete.git] / test / CodeGen / Thumb2 / mve-vcvt.ll
blob524ec692c8c1728a4d78ba136a3c725ad402afbe
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVE
3 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVEFP
5 define arm_aapcs_vfpcc <4 x float> @foo_float_int32(<4 x i32> %src) {
6 ; CHECK-MVE-LABEL: foo_float_int32:
7 ; CHECK-MVE:       @ %bb.0: @ %entry
8 ; CHECK-MVE-NEXT:    vcvt.f32.s32 s7, s3
9 ; CHECK-MVE-NEXT:    vcvt.f32.s32 s6, s2
10 ; CHECK-MVE-NEXT:    vcvt.f32.s32 s5, s1
11 ; CHECK-MVE-NEXT:    vcvt.f32.s32 s4, s0
12 ; CHECK-MVE-NEXT:    vmov q0, q1
13 ; CHECK-MVE-NEXT:    bx lr
15 ; CHECK-MVEFP-LABEL: foo_float_int32:
16 ; CHECK-MVEFP:       @ %bb.0: @ %entry
17 ; CHECK-MVEFP-NEXT:    vcvt.f32.s32 q0, q0
18 ; CHECK-MVEFP-NEXT:    bx lr
19 entry:
20   %out = sitofp <4 x i32> %src to <4 x float>
21   ret <4 x float> %out
24 define arm_aapcs_vfpcc <4 x float> @foo_float_uint32(<4 x i32> %src) {
25 ; CHECK-MVE-LABEL: foo_float_uint32:
26 ; CHECK-MVE:       @ %bb.0: @ %entry
27 ; CHECK-MVE-NEXT:    vcvt.f32.u32 s7, s3
28 ; CHECK-MVE-NEXT:    vcvt.f32.u32 s6, s2
29 ; CHECK-MVE-NEXT:    vcvt.f32.u32 s5, s1
30 ; CHECK-MVE-NEXT:    vcvt.f32.u32 s4, s0
31 ; CHECK-MVE-NEXT:    vmov q0, q1
32 ; CHECK-MVE-NEXT:    bx lr
34 ; CHECK-MVEFP-LABEL: foo_float_uint32:
35 ; CHECK-MVEFP:       @ %bb.0: @ %entry
36 ; CHECK-MVEFP-NEXT:    vcvt.f32.u32 q0, q0
37 ; CHECK-MVEFP-NEXT:    bx lr
38 entry:
39   %out = uitofp <4 x i32> %src to <4 x float>
40   ret <4 x float> %out
43 define arm_aapcs_vfpcc <4 x i32> @foo_int32_float(<4 x float> %src) {
44 ; CHECK-MVE-LABEL: foo_int32_float:
45 ; CHECK-MVE:       @ %bb.0: @ %entry
46 ; CHECK-MVE-NEXT:    vcvt.s32.f32 s4, s0
47 ; CHECK-MVE-NEXT:    vcvt.s32.f32 s6, s1
48 ; CHECK-MVE-NEXT:    vcvt.s32.f32 s8, s3
49 ; CHECK-MVE-NEXT:    vcvt.s32.f32 s10, s2
50 ; CHECK-MVE-NEXT:    vmov r0, s4
51 ; CHECK-MVE-NEXT:    vmov.32 q0[0], r0
52 ; CHECK-MVE-NEXT:    vmov r0, s6
53 ; CHECK-MVE-NEXT:    vmov.32 q0[1], r0
54 ; CHECK-MVE-NEXT:    vmov r0, s10
55 ; CHECK-MVE-NEXT:    vmov.32 q0[2], r0
56 ; CHECK-MVE-NEXT:    vmov r0, s8
57 ; CHECK-MVE-NEXT:    vmov.32 q0[3], r0
58 ; CHECK-MVE-NEXT:    bx lr
60 ; CHECK-MVEFP-LABEL: foo_int32_float:
61 ; CHECK-MVEFP:       @ %bb.0: @ %entry
62 ; CHECK-MVEFP-NEXT:    vcvt.s32.f32 q0, q0
63 ; CHECK-MVEFP-NEXT:    bx lr
64 entry:
65   %out = fptosi <4 x float> %src to <4 x i32>
66   ret <4 x i32> %out
69 define arm_aapcs_vfpcc <4 x i32> @foo_uint32_float(<4 x float> %src) {
70 ; CHECK-MVE-LABEL: foo_uint32_float:
71 ; CHECK-MVE:       @ %bb.0: @ %entry
72 ; CHECK-MVE-NEXT:    vcvt.u32.f32 s4, s0
73 ; CHECK-MVE-NEXT:    vcvt.u32.f32 s6, s1
74 ; CHECK-MVE-NEXT:    vcvt.u32.f32 s8, s3
75 ; CHECK-MVE-NEXT:    vcvt.u32.f32 s10, s2
76 ; CHECK-MVE-NEXT:    vmov r0, s4
77 ; CHECK-MVE-NEXT:    vmov.32 q0[0], r0
78 ; CHECK-MVE-NEXT:    vmov r0, s6
79 ; CHECK-MVE-NEXT:    vmov.32 q0[1], r0
80 ; CHECK-MVE-NEXT:    vmov r0, s10
81 ; CHECK-MVE-NEXT:    vmov.32 q0[2], r0
82 ; CHECK-MVE-NEXT:    vmov r0, s8
83 ; CHECK-MVE-NEXT:    vmov.32 q0[3], r0
84 ; CHECK-MVE-NEXT:    bx lr
86 ; CHECK-MVEFP-LABEL: foo_uint32_float:
87 ; CHECK-MVEFP:       @ %bb.0: @ %entry
88 ; CHECK-MVEFP-NEXT:    vcvt.u32.f32 q0, q0
89 ; CHECK-MVEFP-NEXT:    bx lr
90 entry:
91   %out = fptoui <4 x float> %src to <4 x i32>
92   ret <4 x i32> %out
95 define arm_aapcs_vfpcc <8 x half> @foo_half_int16(<8 x i16> %src) {
96 ; CHECK-MVE-LABEL: foo_half_int16:
97 ; CHECK-MVE:       @ %bb.0: @ %entry
98 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
99 ; CHECK-MVE-NEXT:    vmov.u16 r1, q0[1]
100 ; CHECK-MVE-NEXT:    sxth r0, r0
101 ; CHECK-MVE-NEXT:    sxth r1, r1
102 ; CHECK-MVE-NEXT:    vmov s4, r0
103 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s4, s4
104 ; CHECK-MVE-NEXT:    vmov r0, s4
105 ; CHECK-MVE-NEXT:    vmov s4, r1
106 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s4, s4
107 ; CHECK-MVE-NEXT:    vmov r1, s4
108 ; CHECK-MVE-NEXT:    vmov.16 q1[0], r0
109 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
110 ; CHECK-MVE-NEXT:    vmov.16 q1[1], r1
111 ; CHECK-MVE-NEXT:    sxth r0, r0
112 ; CHECK-MVE-NEXT:    vmov s8, r0
113 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s8, s8
114 ; CHECK-MVE-NEXT:    vmov r0, s8
115 ; CHECK-MVE-NEXT:    vmov.16 q1[2], r0
116 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
117 ; CHECK-MVE-NEXT:    sxth r0, r0
118 ; CHECK-MVE-NEXT:    vmov s8, r0
119 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s8, s8
120 ; CHECK-MVE-NEXT:    vmov r0, s8
121 ; CHECK-MVE-NEXT:    vmov.16 q1[3], r0
122 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
123 ; CHECK-MVE-NEXT:    sxth r0, r0
124 ; CHECK-MVE-NEXT:    vmov s8, r0
125 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s8, s8
126 ; CHECK-MVE-NEXT:    vmov r0, s8
127 ; CHECK-MVE-NEXT:    vmov.16 q1[4], r0
128 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
129 ; CHECK-MVE-NEXT:    sxth r0, r0
130 ; CHECK-MVE-NEXT:    vmov s8, r0
131 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s8, s8
132 ; CHECK-MVE-NEXT:    vmov r0, s8
133 ; CHECK-MVE-NEXT:    vmov.16 q1[5], r0
134 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
135 ; CHECK-MVE-NEXT:    sxth r0, r0
136 ; CHECK-MVE-NEXT:    vmov s8, r0
137 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s8, s8
138 ; CHECK-MVE-NEXT:    vmov r0, s8
139 ; CHECK-MVE-NEXT:    vmov.16 q1[6], r0
140 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
141 ; CHECK-MVE-NEXT:    sxth r0, r0
142 ; CHECK-MVE-NEXT:    vmov s0, r0
143 ; CHECK-MVE-NEXT:    vcvt.f16.s32 s0, s0
144 ; CHECK-MVE-NEXT:    vmov r0, s0
145 ; CHECK-MVE-NEXT:    vmov.16 q1[7], r0
146 ; CHECK-MVE-NEXT:    vmov q0, q1
147 ; CHECK-MVE-NEXT:    bx lr
149 ; CHECK-MVEFP-LABEL: foo_half_int16:
150 ; CHECK-MVEFP:       @ %bb.0: @ %entry
151 ; CHECK-MVEFP-NEXT:    vcvt.f16.s16 q0, q0
152 ; CHECK-MVEFP-NEXT:    bx lr
153 entry:
154   %out = sitofp <8 x i16> %src to <8 x half>
155   ret <8 x half> %out
158 define arm_aapcs_vfpcc <8 x half> @foo_half_uint16(<8 x i16> %src) {
159 ; CHECK-MVE-LABEL: foo_half_uint16:
160 ; CHECK-MVE:       @ %bb.0: @ %entry
161 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
162 ; CHECK-MVE-NEXT:    vmov.u16 r1, q0[1]
163 ; CHECK-MVE-NEXT:    vmov s4, r0
164 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s4, s4
165 ; CHECK-MVE-NEXT:    vmov r0, s4
166 ; CHECK-MVE-NEXT:    vmov s4, r1
167 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s4, s4
168 ; CHECK-MVE-NEXT:    vmov r1, s4
169 ; CHECK-MVE-NEXT:    vmov.16 q1[0], r0
170 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
171 ; CHECK-MVE-NEXT:    vmov.16 q1[1], r1
172 ; CHECK-MVE-NEXT:    vmov s8, r0
173 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s8, s8
174 ; CHECK-MVE-NEXT:    vmov r0, s8
175 ; CHECK-MVE-NEXT:    vmov.16 q1[2], r0
176 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
177 ; CHECK-MVE-NEXT:    vmov s8, r0
178 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s8, s8
179 ; CHECK-MVE-NEXT:    vmov r0, s8
180 ; CHECK-MVE-NEXT:    vmov.16 q1[3], r0
181 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
182 ; CHECK-MVE-NEXT:    vmov s8, r0
183 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s8, s8
184 ; CHECK-MVE-NEXT:    vmov r0, s8
185 ; CHECK-MVE-NEXT:    vmov.16 q1[4], r0
186 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
187 ; CHECK-MVE-NEXT:    vmov s8, r0
188 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s8, s8
189 ; CHECK-MVE-NEXT:    vmov r0, s8
190 ; CHECK-MVE-NEXT:    vmov.16 q1[5], r0
191 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
192 ; CHECK-MVE-NEXT:    vmov s8, r0
193 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s8, s8
194 ; CHECK-MVE-NEXT:    vmov r0, s8
195 ; CHECK-MVE-NEXT:    vmov.16 q1[6], r0
196 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
197 ; CHECK-MVE-NEXT:    vmov s0, r0
198 ; CHECK-MVE-NEXT:    vcvt.f16.u32 s0, s0
199 ; CHECK-MVE-NEXT:    vmov r0, s0
200 ; CHECK-MVE-NEXT:    vmov.16 q1[7], r0
201 ; CHECK-MVE-NEXT:    vmov q0, q1
202 ; CHECK-MVE-NEXT:    bx lr
204 ; CHECK-MVEFP-LABEL: foo_half_uint16:
205 ; CHECK-MVEFP:       @ %bb.0: @ %entry
206 ; CHECK-MVEFP-NEXT:    vcvt.f16.u16 q0, q0
207 ; CHECK-MVEFP-NEXT:    bx lr
208 entry:
209   %out = uitofp <8 x i16> %src to <8 x half>
210   ret <8 x half> %out
213 define arm_aapcs_vfpcc <8 x i16> @foo_int16_half(<8 x half> %src) {
214 ; CHECK-MVE-LABEL: foo_int16_half:
215 ; CHECK-MVE:       @ %bb.0: @ %entry
216 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
217 ; CHECK-MVE-NEXT:    vmov s4, r0
218 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
219 ; CHECK-MVE-NEXT:    vmov s6, r0
220 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
221 ; CHECK-MVE-NEXT:    vmov s8, r0
222 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
223 ; CHECK-MVE-NEXT:    vmov s10, r0
224 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
225 ; CHECK-MVE-NEXT:    vmov s12, r0
226 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[1]
227 ; CHECK-MVE-NEXT:    vmov s14, r0
228 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
229 ; CHECK-MVE-NEXT:    vmov s5, r0
230 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
231 ; CHECK-MVE-NEXT:    vmov s0, r0
232 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s4, s4
233 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s6, s6
234 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s8, s8
235 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s10, s10
236 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s12, s12
237 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s14, s14
238 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s5, s5
239 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s0, s0
240 ; CHECK-MVE-NEXT:    vmov r0, s0
241 ; CHECK-MVE-NEXT:    vmov.16 q0[0], r0
242 ; CHECK-MVE-NEXT:    vmov r0, s14
243 ; CHECK-MVE-NEXT:    vmov.16 q0[1], r0
244 ; CHECK-MVE-NEXT:    vmov r0, s5
245 ; CHECK-MVE-NEXT:    vmov.16 q0[2], r0
246 ; CHECK-MVE-NEXT:    vmov r0, s10
247 ; CHECK-MVE-NEXT:    vmov.16 q0[3], r0
248 ; CHECK-MVE-NEXT:    vmov r0, s12
249 ; CHECK-MVE-NEXT:    vmov.16 q0[4], r0
250 ; CHECK-MVE-NEXT:    vmov r0, s6
251 ; CHECK-MVE-NEXT:    vmov.16 q0[5], r0
252 ; CHECK-MVE-NEXT:    vmov r0, s8
253 ; CHECK-MVE-NEXT:    vmov.16 q0[6], r0
254 ; CHECK-MVE-NEXT:    vmov r0, s4
255 ; CHECK-MVE-NEXT:    vmov.16 q0[7], r0
256 ; CHECK-MVE-NEXT:    bx lr
258 ; CHECK-MVEFP-LABEL: foo_int16_half:
259 ; CHECK-MVEFP:       @ %bb.0: @ %entry
260 ; CHECK-MVEFP-NEXT:    vcvt.s16.f16 q0, q0
261 ; CHECK-MVEFP-NEXT:    bx lr
262 entry:
263   %out = fptosi <8 x half> %src to <8 x i16>
264   ret <8 x i16> %out
267 define arm_aapcs_vfpcc <8 x i16> @foo_uint16_half(<8 x half> %src) {
268 ; CHECK-MVE-LABEL: foo_uint16_half:
269 ; CHECK-MVE:       @ %bb.0: @ %entry
270 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[7]
271 ; CHECK-MVE-NEXT:    vmov s4, r0
272 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[5]
273 ; CHECK-MVE-NEXT:    vmov s6, r0
274 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[6]
275 ; CHECK-MVE-NEXT:    vmov s8, r0
276 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[3]
277 ; CHECK-MVE-NEXT:    vmov s10, r0
278 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[4]
279 ; CHECK-MVE-NEXT:    vmov s12, r0
280 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[1]
281 ; CHECK-MVE-NEXT:    vmov s14, r0
282 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[2]
283 ; CHECK-MVE-NEXT:    vmov s5, r0
284 ; CHECK-MVE-NEXT:    vmov.u16 r0, q0[0]
285 ; CHECK-MVE-NEXT:    vmov s0, r0
286 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s4, s4
287 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s6, s6
288 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s8, s8
289 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s10, s10
290 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s12, s12
291 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s14, s14
292 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s5, s5
293 ; CHECK-MVE-NEXT:    vcvt.s32.f16 s0, s0
294 ; CHECK-MVE-NEXT:    vmov r0, s0
295 ; CHECK-MVE-NEXT:    vmov.16 q0[0], r0
296 ; CHECK-MVE-NEXT:    vmov r0, s14
297 ; CHECK-MVE-NEXT:    vmov.16 q0[1], r0
298 ; CHECK-MVE-NEXT:    vmov r0, s5
299 ; CHECK-MVE-NEXT:    vmov.16 q0[2], r0
300 ; CHECK-MVE-NEXT:    vmov r0, s10
301 ; CHECK-MVE-NEXT:    vmov.16 q0[3], r0
302 ; CHECK-MVE-NEXT:    vmov r0, s12
303 ; CHECK-MVE-NEXT:    vmov.16 q0[4], r0
304 ; CHECK-MVE-NEXT:    vmov r0, s6
305 ; CHECK-MVE-NEXT:    vmov.16 q0[5], r0
306 ; CHECK-MVE-NEXT:    vmov r0, s8
307 ; CHECK-MVE-NEXT:    vmov.16 q0[6], r0
308 ; CHECK-MVE-NEXT:    vmov r0, s4
309 ; CHECK-MVE-NEXT:    vmov.16 q0[7], r0
310 ; CHECK-MVE-NEXT:    bx lr
312 ; CHECK-MVEFP-LABEL: foo_uint16_half:
313 ; CHECK-MVEFP:       @ %bb.0: @ %entry
314 ; CHECK-MVEFP-NEXT:    vcvt.u16.f16 q0, q0
315 ; CHECK-MVEFP-NEXT:    bx lr
316 entry:
317   %out = fptoui <8 x half> %src to <8 x i16>
318   ret <8 x i16> %out
321 define arm_aapcs_vfpcc <2 x double> @foo_float_int64(<2 x i64> %src) {
322 ; CHECK-LABEL: foo_float_int64:
323 ; CHECK:       @ %bb.0: @ %entry
324 ; CHECK-NEXT:    .save {r7, lr}
325 ; CHECK-NEXT:    push {r7, lr}
326 ; CHECK-NEXT:    .vsave {d8, d9}
327 ; CHECK-NEXT:    vpush {d8, d9}
328 ; CHECK-NEXT:    vmov q4, q0
329 ; CHECK-NEXT:    vmov r0, s18
330 ; CHECK-NEXT:    vmov r1, s19
331 ; CHECK-NEXT:    bl __aeabi_l2d
332 ; CHECK-NEXT:    vmov r2, s16
333 ; CHECK-NEXT:    vmov r3, s17
334 ; CHECK-NEXT:    vmov d9, r0, r1
335 ; CHECK-NEXT:    mov r0, r2
336 ; CHECK-NEXT:    mov r1, r3
337 ; CHECK-NEXT:    bl __aeabi_l2d
338 ; CHECK-NEXT:    vmov d8, r0, r1
339 ; CHECK-NEXT:    vmov q0, q4
340 ; CHECK-NEXT:    vpop {d8, d9}
341 ; CHECK-NEXT:    pop {r7, pc}
342 entry:
343   %out = sitofp <2 x i64> %src to <2 x double>
344   ret <2 x double> %out
347 define arm_aapcs_vfpcc <2 x double> @foo_float_uint64(<2 x i64> %src) {
348 ; CHECK-LABEL: foo_float_uint64:
349 ; CHECK:       @ %bb.0: @ %entry
350 ; CHECK-NEXT:    .save {r7, lr}
351 ; CHECK-NEXT:    push {r7, lr}
352 ; CHECK-NEXT:    .vsave {d8, d9}
353 ; CHECK-NEXT:    vpush {d8, d9}
354 ; CHECK-NEXT:    vmov q4, q0
355 ; CHECK-NEXT:    vmov r0, s18
356 ; CHECK-NEXT:    vmov r1, s19
357 ; CHECK-NEXT:    bl __aeabi_ul2d
358 ; CHECK-NEXT:    vmov r2, s16
359 ; CHECK-NEXT:    vmov r3, s17
360 ; CHECK-NEXT:    vmov d9, r0, r1
361 ; CHECK-NEXT:    mov r0, r2
362 ; CHECK-NEXT:    mov r1, r3
363 ; CHECK-NEXT:    bl __aeabi_ul2d
364 ; CHECK-NEXT:    vmov d8, r0, r1
365 ; CHECK-NEXT:    vmov q0, q4
366 ; CHECK-NEXT:    vpop {d8, d9}
367 ; CHECK-NEXT:    pop {r7, pc}
368 entry:
369   %out = uitofp <2 x i64> %src to <2 x double>
370   ret <2 x double> %out
373 define arm_aapcs_vfpcc <2 x i64> @foo_int64_float(<2 x double> %src) {
374 ; CHECK-LABEL: foo_int64_float:
375 ; CHECK:       @ %bb.0: @ %entry
376 ; CHECK-NEXT:    .save {r7, lr}
377 ; CHECK-NEXT:    push {r7, lr}
378 ; CHECK-NEXT:    .vsave {d8, d9}
379 ; CHECK-NEXT:    vpush {d8, d9}
380 ; CHECK-NEXT:    vmov q4, q0
381 ; CHECK-NEXT:    vmov r0, r1, d8
382 ; CHECK-NEXT:    bl __aeabi_d2lz
383 ; CHECK-NEXT:    vmov r2, r3, d9
384 ; CHECK-NEXT:    vmov.32 q4[0], r0
385 ; CHECK-NEXT:    lsrl r0, r1, #32
386 ; CHECK-NEXT:    vmov.32 q4[1], r0
387 ; CHECK-NEXT:    mov r0, r2
388 ; CHECK-NEXT:    mov r1, r3
389 ; CHECK-NEXT:    bl __aeabi_d2lz
390 ; CHECK-NEXT:    vmov.32 q4[2], r0
391 ; CHECK-NEXT:    lsrl r0, r1, #32
392 ; CHECK-NEXT:    vmov.32 q4[3], r0
393 ; CHECK-NEXT:    vmov q0, q4
394 ; CHECK-NEXT:    vpop {d8, d9}
395 ; CHECK-NEXT:    pop {r7, pc}
396 entry:
397   %out = fptosi <2 x double> %src to <2 x i64>
398   ret <2 x i64> %out
401 define arm_aapcs_vfpcc <2 x i64> @foo_uint64_float(<2 x double> %src) {
402 ; CHECK-LABEL: foo_uint64_float:
403 ; CHECK:       @ %bb.0: @ %entry
404 ; CHECK-NEXT:    .save {r7, lr}
405 ; CHECK-NEXT:    push {r7, lr}
406 ; CHECK-NEXT:    .vsave {d8, d9}
407 ; CHECK-NEXT:    vpush {d8, d9}
408 ; CHECK-NEXT:    vmov q4, q0
409 ; CHECK-NEXT:    vmov r0, r1, d8
410 ; CHECK-NEXT:    bl __aeabi_d2ulz
411 ; CHECK-NEXT:    vmov r2, r3, d9
412 ; CHECK-NEXT:    vmov.32 q4[0], r0
413 ; CHECK-NEXT:    lsrl r0, r1, #32
414 ; CHECK-NEXT:    vmov.32 q4[1], r0
415 ; CHECK-NEXT:    mov r0, r2
416 ; CHECK-NEXT:    mov r1, r3
417 ; CHECK-NEXT:    bl __aeabi_d2ulz
418 ; CHECK-NEXT:    vmov.32 q4[2], r0
419 ; CHECK-NEXT:    lsrl r0, r1, #32
420 ; CHECK-NEXT:    vmov.32 q4[3], r0
421 ; CHECK-NEXT:    vmov q0, q4
422 ; CHECK-NEXT:    vpop {d8, d9}
423 ; CHECK-NEXT:    pop {r7, pc}
424 entry:
425   %out = fptoui <2 x double> %src to <2 x i64>
426   ret <2 x i64> %out