[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / vector-fcvt.ll
blob8f38bdbedc629be5d01ae9539aa11aedc6298a44
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK
4 ; Note: halves are tested in fp16-v8-instructions.ll.
6 define <4 x float> @sitofp_v4i8_float(<4 x i8> %a) {
7 ; CHECK-LABEL: sitofp_v4i8_float:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    shl v0.4h, v0.4h, #8
10 ; CHECK-NEXT:    sshr v0.4h, v0.4h, #8
11 ; CHECK-NEXT:    sshll v0.4s, v0.4h, #0
12 ; CHECK-NEXT:    scvtf v0.4s, v0.4s
13 ; CHECK-NEXT:    ret
14   %1 = sitofp <4 x i8> %a to <4 x float>
15   ret <4 x float> %1
18 define <8 x float> @sitofp_v8i8_float(<8 x i8> %a) {
19 ; CHECK-LABEL: sitofp_v8i8_float:
20 ; CHECK:       // %bb.0:
21 ; CHECK-NEXT:    zip1 v1.8b, v0.8b, v0.8b
22 ; CHECK-NEXT:    zip2 v0.8b, v0.8b, v0.8b
23 ; CHECK-NEXT:    shl v1.4h, v1.4h, #8
24 ; CHECK-NEXT:    shl v0.4h, v0.4h, #8
25 ; CHECK-NEXT:    sshr v1.4h, v1.4h, #8
26 ; CHECK-NEXT:    sshr v0.4h, v0.4h, #8
27 ; CHECK-NEXT:    sshll v1.4s, v1.4h, #0
28 ; CHECK-NEXT:    sshll v2.4s, v0.4h, #0
29 ; CHECK-NEXT:    scvtf v0.4s, v1.4s
30 ; CHECK-NEXT:    scvtf v1.4s, v2.4s
31 ; CHECK-NEXT:    ret
32   %1 = sitofp <8 x i8> %a to <8 x float>
33   ret <8 x float> %1
36 define <16 x float> @sitofp_v16i8_float(<16 x i8> %a) {
37 ; CHECK-LABEL: sitofp_v16i8_float:
38 ; CHECK:       // %bb.0:
39 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
40 ; CHECK-NEXT:    zip1 v2.8b, v0.8b, v0.8b
41 ; CHECK-NEXT:    zip2 v0.8b, v0.8b, v0.8b
42 ; CHECK-NEXT:    zip1 v3.8b, v1.8b, v0.8b
43 ; CHECK-NEXT:    zip2 v1.8b, v1.8b, v0.8b
44 ; CHECK-NEXT:    shl v2.4h, v2.4h, #8
45 ; CHECK-NEXT:    shl v0.4h, v0.4h, #8
46 ; CHECK-NEXT:    sshr v2.4h, v2.4h, #8
47 ; CHECK-NEXT:    shl v3.4h, v3.4h, #8
48 ; CHECK-NEXT:    shl v1.4h, v1.4h, #8
49 ; CHECK-NEXT:    sshr v0.4h, v0.4h, #8
50 ; CHECK-NEXT:    sshll v2.4s, v2.4h, #0
51 ; CHECK-NEXT:    sshr v3.4h, v3.4h, #8
52 ; CHECK-NEXT:    sshr v1.4h, v1.4h, #8
53 ; CHECK-NEXT:    sshll v4.4s, v0.4h, #0
54 ; CHECK-NEXT:    scvtf v0.4s, v2.4s
55 ; CHECK-NEXT:    sshll v3.4s, v3.4h, #0
56 ; CHECK-NEXT:    sshll v5.4s, v1.4h, #0
57 ; CHECK-NEXT:    scvtf v1.4s, v4.4s
58 ; CHECK-NEXT:    scvtf v2.4s, v3.4s
59 ; CHECK-NEXT:    scvtf v3.4s, v5.4s
60 ; CHECK-NEXT:    ret
61   %1 = sitofp <16 x i8> %a to <16 x float>
62   ret <16 x float> %1
65 define <8 x float> @sitofp_i16_float(<8 x i16> %a) {
66 ; CHECK-LABEL: sitofp_i16_float:
67 ; CHECK:       // %bb.0:
68 ; CHECK-NEXT:    sshll2 v1.4s, v0.8h, #0
69 ; CHECK-NEXT:    sshll v0.4s, v0.4h, #0
70 ; CHECK-NEXT:    scvtf v1.4s, v1.4s
71 ; CHECK-NEXT:    scvtf v0.4s, v0.4s
72 ; CHECK-NEXT:    ret
73   %1 = sitofp <8 x i16> %a to <8 x float>
74   ret <8 x float> %1
77 define <8 x float> @sitofp_i32_float(<8 x i32> %a) {
78 ; CHECK-LABEL: sitofp_i32_float:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    scvtf v0.4s, v0.4s
81 ; CHECK-NEXT:    scvtf v1.4s, v1.4s
82 ; CHECK-NEXT:    ret
83   %1 = sitofp <8 x i32> %a to <8 x float>
84   ret <8 x float> %1
87 define <8 x float> @sitofp_i64_float(<8 x i64> %a) {
88 ; CHECK-LABEL: sitofp_i64_float:
89 ; CHECK:       // %bb.0:
90 ; CHECK-NEXT:    scvtf v0.2d, v0.2d
91 ; CHECK-NEXT:    scvtf v2.2d, v2.2d
92 ; CHECK-NEXT:    scvtf v4.2d, v1.2d
93 ; CHECK-NEXT:    fcvtn v0.2s, v0.2d
94 ; CHECK-NEXT:    fcvtn v1.2s, v2.2d
95 ; CHECK-NEXT:    scvtf v2.2d, v3.2d
96 ; CHECK-NEXT:    fcvtn2 v0.4s, v4.2d
97 ; CHECK-NEXT:    fcvtn2 v1.4s, v2.2d
98 ; CHECK-NEXT:    ret
99   %1 = sitofp <8 x i64> %a to <8 x float>
100   ret <8 x float> %1
103 define <4 x float> @uitofp_v4i8_float(<4 x i8> %a) {
104 ; CHECK-LABEL: uitofp_v4i8_float:
105 ; CHECK:       // %bb.0:
106 ; CHECK-NEXT:    bic v0.4h, #255, lsl #8
107 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
108 ; CHECK-NEXT:    ucvtf v0.4s, v0.4s
109 ; CHECK-NEXT:    ret
110   %1 = uitofp <4 x i8> %a to <4 x float>
111   ret <4 x float> %1
114 define <8 x float> @uitofp_v8i8_float(<8 x i8> %a) {
115 ; CHECK-LABEL: uitofp_v8i8_float:
116 ; CHECK:       // %bb.0:
117 ; CHECK-NEXT:    zip1 v1.8b, v0.8b, v0.8b
118 ; CHECK-NEXT:    zip2 v0.8b, v0.8b, v0.8b
119 ; CHECK-NEXT:    bic v1.4h, #255, lsl #8
120 ; CHECK-NEXT:    bic v0.4h, #255, lsl #8
121 ; CHECK-NEXT:    ushll v1.4s, v1.4h, #0
122 ; CHECK-NEXT:    ushll v2.4s, v0.4h, #0
123 ; CHECK-NEXT:    ucvtf v0.4s, v1.4s
124 ; CHECK-NEXT:    ucvtf v1.4s, v2.4s
125 ; CHECK-NEXT:    ret
126   %1 = uitofp <8 x i8> %a to <8 x float>
127   ret <8 x float> %1
130 define <16 x float> @uitofp_v16i8_float(<16 x i8> %a) {
131 ; CHECK-LABEL: uitofp_v16i8_float:
132 ; CHECK:       // %bb.0:
133 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
134 ; CHECK-NEXT:    zip1 v2.8b, v0.8b, v0.8b
135 ; CHECK-NEXT:    zip2 v0.8b, v0.8b, v0.8b
136 ; CHECK-NEXT:    zip1 v3.8b, v1.8b, v0.8b
137 ; CHECK-NEXT:    zip2 v1.8b, v1.8b, v0.8b
138 ; CHECK-NEXT:    bic v2.4h, #255, lsl #8
139 ; CHECK-NEXT:    bic v0.4h, #255, lsl #8
140 ; CHECK-NEXT:    ushll v2.4s, v2.4h, #0
141 ; CHECK-NEXT:    bic v3.4h, #255, lsl #8
142 ; CHECK-NEXT:    bic v1.4h, #255, lsl #8
143 ; CHECK-NEXT:    ushll v4.4s, v0.4h, #0
144 ; CHECK-NEXT:    ucvtf v0.4s, v2.4s
145 ; CHECK-NEXT:    ushll v3.4s, v3.4h, #0
146 ; CHECK-NEXT:    ushll v5.4s, v1.4h, #0
147 ; CHECK-NEXT:    ucvtf v1.4s, v4.4s
148 ; CHECK-NEXT:    ucvtf v2.4s, v3.4s
149 ; CHECK-NEXT:    ucvtf v3.4s, v5.4s
150 ; CHECK-NEXT:    ret
151   %1 = uitofp <16 x i8> %a to <16 x float>
152   ret <16 x float> %1
155 define <8 x float> @uitofp_i16_float(<8 x i16> %a) {
156 ; CHECK-LABEL: uitofp_i16_float:
157 ; CHECK:       // %bb.0:
158 ; CHECK-NEXT:    ushll2 v1.4s, v0.8h, #0
159 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
160 ; CHECK-NEXT:    ucvtf v1.4s, v1.4s
161 ; CHECK-NEXT:    ucvtf v0.4s, v0.4s
162 ; CHECK-NEXT:    ret
163   %1 = uitofp <8 x i16> %a to <8 x float>
164   ret <8 x float> %1
167 define <8 x float> @uitofp_i32_float(<8 x i32> %a) {
168 ; CHECK-LABEL: uitofp_i32_float:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    ucvtf v0.4s, v0.4s
171 ; CHECK-NEXT:    ucvtf v1.4s, v1.4s
172 ; CHECK-NEXT:    ret
173   %1 = uitofp <8 x i32> %a to <8 x float>
174   ret <8 x float> %1
177 define <8 x float> @uitofp_i64_float(<8 x i64> %a) {
178 ; CHECK-LABEL: uitofp_i64_float:
179 ; CHECK:       // %bb.0:
180 ; CHECK-NEXT:    ucvtf v0.2d, v0.2d
181 ; CHECK-NEXT:    ucvtf v2.2d, v2.2d
182 ; CHECK-NEXT:    ucvtf v4.2d, v1.2d
183 ; CHECK-NEXT:    fcvtn v0.2s, v0.2d
184 ; CHECK-NEXT:    fcvtn v1.2s, v2.2d
185 ; CHECK-NEXT:    ucvtf v2.2d, v3.2d
186 ; CHECK-NEXT:    fcvtn2 v0.4s, v4.2d
187 ; CHECK-NEXT:    fcvtn2 v1.4s, v2.2d
188 ; CHECK-NEXT:    ret
189   %1 = uitofp <8 x i64> %a to <8 x float>
190   ret <8 x float> %1
194 define <4 x double> @sitofp_v4i8_double(<4 x i8> %a) {
195 ; CHECK-LABEL: sitofp_v4i8_double:
196 ; CHECK:       // %bb.0:
197 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
198 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
199 ; CHECK-NEXT:    shl v0.2s, v0.2s, #24
200 ; CHECK-NEXT:    sshr v0.2s, v0.2s, #24
201 ; CHECK-NEXT:    shl v1.2s, v1.2s, #24
202 ; CHECK-NEXT:    sshll v0.2d, v0.2s, #0
203 ; CHECK-NEXT:    sshr v1.2s, v1.2s, #24
204 ; CHECK-NEXT:    scvtf v0.2d, v0.2d
205 ; CHECK-NEXT:    sshll v1.2d, v1.2s, #0
206 ; CHECK-NEXT:    scvtf v1.2d, v1.2d
207 ; CHECK-NEXT:    ret
208   %1 = sitofp <4 x i8> %a to <4 x double>
209   ret <4 x double> %1
212 define <8 x double> @sitofp_v8i8_double(<8 x i8> %a) {
213 ; CHECK-LABEL: sitofp_v8i8_double:
214 ; CHECK:       // %bb.0:
215 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
216 ; CHECK-NEXT:    umov w8, v0.b[0]
217 ; CHECK-NEXT:    umov w9, v0.b[2]
218 ; CHECK-NEXT:    umov w11, v0.b[4]
219 ; CHECK-NEXT:    umov w12, v0.b[6]
220 ; CHECK-NEXT:    umov w10, v0.b[1]
221 ; CHECK-NEXT:    umov w13, v0.b[3]
222 ; CHECK-NEXT:    umov w14, v0.b[5]
223 ; CHECK-NEXT:    umov w15, v0.b[7]
224 ; CHECK-NEXT:    fmov s0, w8
225 ; CHECK-NEXT:    fmov s1, w9
226 ; CHECK-NEXT:    fmov s2, w11
227 ; CHECK-NEXT:    fmov s3, w12
228 ; CHECK-NEXT:    mov v0.s[1], w10
229 ; CHECK-NEXT:    mov v1.s[1], w13
230 ; CHECK-NEXT:    mov v2.s[1], w14
231 ; CHECK-NEXT:    mov v3.s[1], w15
232 ; CHECK-NEXT:    shl v0.2s, v0.2s, #24
233 ; CHECK-NEXT:    shl v1.2s, v1.2s, #24
234 ; CHECK-NEXT:    shl v2.2s, v2.2s, #24
235 ; CHECK-NEXT:    shl v3.2s, v3.2s, #24
236 ; CHECK-NEXT:    sshr v0.2s, v0.2s, #24
237 ; CHECK-NEXT:    sshr v1.2s, v1.2s, #24
238 ; CHECK-NEXT:    sshr v2.2s, v2.2s, #24
239 ; CHECK-NEXT:    sshr v3.2s, v3.2s, #24
240 ; CHECK-NEXT:    sshll v0.2d, v0.2s, #0
241 ; CHECK-NEXT:    sshll v1.2d, v1.2s, #0
242 ; CHECK-NEXT:    sshll v2.2d, v2.2s, #0
243 ; CHECK-NEXT:    sshll v3.2d, v3.2s, #0
244 ; CHECK-NEXT:    scvtf v0.2d, v0.2d
245 ; CHECK-NEXT:    scvtf v1.2d, v1.2d
246 ; CHECK-NEXT:    scvtf v2.2d, v2.2d
247 ; CHECK-NEXT:    scvtf v3.2d, v3.2d
248 ; CHECK-NEXT:    ret
249   %1 = sitofp <8 x i8> %a to <8 x double>
250   ret <8 x double> %1
253 define <16 x double> @sitofp_v16i8_double(<16 x i8> %a) {
254 ; CHECK-LABEL: sitofp_v16i8_double:
255 ; CHECK:       // %bb.0:
256 ; CHECK-NEXT:    umov w8, v0.b[0]
257 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
258 ; CHECK-NEXT:    umov w9, v0.b[1]
259 ; CHECK-NEXT:    umov w10, v0.b[2]
260 ; CHECK-NEXT:    umov w12, v0.b[4]
261 ; CHECK-NEXT:    umov w14, v0.b[6]
262 ; CHECK-NEXT:    umov w11, v0.b[3]
263 ; CHECK-NEXT:    umov w13, v0.b[5]
264 ; CHECK-NEXT:    fmov s2, w8
265 ; CHECK-NEXT:    umov w15, v1.b[0]
266 ; CHECK-NEXT:    umov w17, v1.b[2]
267 ; CHECK-NEXT:    umov w0, v1.b[4]
268 ; CHECK-NEXT:    umov w16, v1.b[1]
269 ; CHECK-NEXT:    umov w18, v1.b[3]
270 ; CHECK-NEXT:    umov w8, v0.b[7]
271 ; CHECK-NEXT:    fmov s0, w10
272 ; CHECK-NEXT:    umov w10, v1.b[5]
273 ; CHECK-NEXT:    mov v2.s[1], w9
274 ; CHECK-NEXT:    umov w9, v1.b[6]
275 ; CHECK-NEXT:    fmov s3, w12
276 ; CHECK-NEXT:    umov w12, v1.b[7]
277 ; CHECK-NEXT:    fmov s1, w14
278 ; CHECK-NEXT:    fmov s4, w15
279 ; CHECK-NEXT:    fmov s5, w17
280 ; CHECK-NEXT:    fmov s6, w0
281 ; CHECK-NEXT:    mov v0.s[1], w11
282 ; CHECK-NEXT:    mov v3.s[1], w13
283 ; CHECK-NEXT:    fmov s7, w9
284 ; CHECK-NEXT:    mov v1.s[1], w8
285 ; CHECK-NEXT:    mov v4.s[1], w16
286 ; CHECK-NEXT:    mov v5.s[1], w18
287 ; CHECK-NEXT:    mov v6.s[1], w10
288 ; CHECK-NEXT:    shl v2.2s, v2.2s, #24
289 ; CHECK-NEXT:    shl v0.2s, v0.2s, #24
290 ; CHECK-NEXT:    mov v7.s[1], w12
291 ; CHECK-NEXT:    shl v3.2s, v3.2s, #24
292 ; CHECK-NEXT:    shl v1.2s, v1.2s, #24
293 ; CHECK-NEXT:    shl v4.2s, v4.2s, #24
294 ; CHECK-NEXT:    sshr v2.2s, v2.2s, #24
295 ; CHECK-NEXT:    shl v5.2s, v5.2s, #24
296 ; CHECK-NEXT:    shl v6.2s, v6.2s, #24
297 ; CHECK-NEXT:    sshr v0.2s, v0.2s, #24
298 ; CHECK-NEXT:    sshr v3.2s, v3.2s, #24
299 ; CHECK-NEXT:    shl v7.2s, v7.2s, #24
300 ; CHECK-NEXT:    sshr v4.2s, v4.2s, #24
301 ; CHECK-NEXT:    sshr v1.2s, v1.2s, #24
302 ; CHECK-NEXT:    sshr v5.2s, v5.2s, #24
303 ; CHECK-NEXT:    sshr v6.2s, v6.2s, #24
304 ; CHECK-NEXT:    sshll v2.2d, v2.2s, #0
305 ; CHECK-NEXT:    sshll v16.2d, v0.2s, #0
306 ; CHECK-NEXT:    sshll v3.2d, v3.2s, #0
307 ; CHECK-NEXT:    sshr v7.2s, v7.2s, #24
308 ; CHECK-NEXT:    sshll v4.2d, v4.2s, #0
309 ; CHECK-NEXT:    sshll v17.2d, v1.2s, #0
310 ; CHECK-NEXT:    sshll v5.2d, v5.2s, #0
311 ; CHECK-NEXT:    sshll v6.2d, v6.2s, #0
312 ; CHECK-NEXT:    scvtf v0.2d, v2.2d
313 ; CHECK-NEXT:    scvtf v1.2d, v16.2d
314 ; CHECK-NEXT:    scvtf v2.2d, v3.2d
315 ; CHECK-NEXT:    sshll v7.2d, v7.2s, #0
316 ; CHECK-NEXT:    scvtf v4.2d, v4.2d
317 ; CHECK-NEXT:    scvtf v3.2d, v17.2d
318 ; CHECK-NEXT:    scvtf v5.2d, v5.2d
319 ; CHECK-NEXT:    scvtf v6.2d, v6.2d
320 ; CHECK-NEXT:    scvtf v7.2d, v7.2d
321 ; CHECK-NEXT:    ret
322   %1 = sitofp <16 x i8> %a to <16 x double>
323   ret <16 x double> %1
326 define <8 x double> @sitofp_i16_double(<8 x i16> %a) {
327 ; CHECK-LABEL: sitofp_i16_double:
328 ; CHECK:       // %bb.0:
329 ; CHECK-NEXT:    sshll v1.4s, v0.4h, #0
330 ; CHECK-NEXT:    sshll2 v0.4s, v0.8h, #0
331 ; CHECK-NEXT:    sshll v2.2d, v1.2s, #0
332 ; CHECK-NEXT:    sshll2 v3.2d, v0.4s, #0
333 ; CHECK-NEXT:    sshll2 v1.2d, v1.4s, #0
334 ; CHECK-NEXT:    sshll v4.2d, v0.2s, #0
335 ; CHECK-NEXT:    scvtf v0.2d, v2.2d
336 ; CHECK-NEXT:    scvtf v3.2d, v3.2d
337 ; CHECK-NEXT:    scvtf v1.2d, v1.2d
338 ; CHECK-NEXT:    scvtf v2.2d, v4.2d
339 ; CHECK-NEXT:    ret
340   %1 = sitofp <8 x i16> %a to <8 x double>
341   ret <8 x double> %1
344 define <8 x double> @sitofp_i32_double(<8 x i32> %a) {
345 ; CHECK-LABEL: sitofp_i32_double:
346 ; CHECK:       // %bb.0:
347 ; CHECK-NEXT:    sshll v2.2d, v0.2s, #0
348 ; CHECK-NEXT:    sshll2 v3.2d, v0.4s, #0
349 ; CHECK-NEXT:    sshll2 v4.2d, v1.4s, #0
350 ; CHECK-NEXT:    sshll v5.2d, v1.2s, #0
351 ; CHECK-NEXT:    scvtf v0.2d, v2.2d
352 ; CHECK-NEXT:    scvtf v1.2d, v3.2d
353 ; CHECK-NEXT:    scvtf v3.2d, v4.2d
354 ; CHECK-NEXT:    scvtf v2.2d, v5.2d
355 ; CHECK-NEXT:    ret
356   %1 = sitofp <8 x i32> %a to <8 x double>
357   ret <8 x double> %1
360 define <8 x double> @sitofp_i64_double(<8 x i64> %a) {
361 ; CHECK-LABEL: sitofp_i64_double:
362 ; CHECK:       // %bb.0:
363 ; CHECK-NEXT:    scvtf v0.2d, v0.2d
364 ; CHECK-NEXT:    scvtf v1.2d, v1.2d
365 ; CHECK-NEXT:    scvtf v2.2d, v2.2d
366 ; CHECK-NEXT:    scvtf v3.2d, v3.2d
367 ; CHECK-NEXT:    ret
368   %1 = sitofp <8 x i64> %a to <8 x double>
369   ret <8 x double> %1
372 define <4 x double> @uitofp_v4i8_double(<4 x i8> %a) {
373 ; CHECK-LABEL: uitofp_v4i8_double:
374 ; CHECK:       // %bb.0:
375 ; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
376 ; CHECK-NEXT:    movi d1, #0x0000ff000000ff
377 ; CHECK-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
378 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
379 ; CHECK-NEXT:    and v1.8b, v2.8b, v1.8b
380 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
381 ; CHECK-NEXT:    ushll v1.2d, v1.2s, #0
382 ; CHECK-NEXT:    ucvtf v0.2d, v0.2d
383 ; CHECK-NEXT:    ucvtf v1.2d, v1.2d
384 ; CHECK-NEXT:    ret
385   %1 = uitofp <4 x i8> %a to <4 x double>
386   ret <4 x double> %1
389 define <8 x double> @uitofp_v8i8_double(<8 x i8> %a) {
390 ; CHECK-LABEL: uitofp_v8i8_double:
391 ; CHECK:       // %bb.0:
392 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
393 ; CHECK-NEXT:    umov w8, v0.b[0]
394 ; CHECK-NEXT:    umov w9, v0.b[2]
395 ; CHECK-NEXT:    umov w11, v0.b[4]
396 ; CHECK-NEXT:    umov w12, v0.b[6]
397 ; CHECK-NEXT:    umov w10, v0.b[1]
398 ; CHECK-NEXT:    umov w13, v0.b[3]
399 ; CHECK-NEXT:    umov w14, v0.b[5]
400 ; CHECK-NEXT:    umov w15, v0.b[7]
401 ; CHECK-NEXT:    movi d1, #0x0000ff000000ff
402 ; CHECK-NEXT:    fmov s0, w8
403 ; CHECK-NEXT:    fmov s2, w9
404 ; CHECK-NEXT:    fmov s3, w11
405 ; CHECK-NEXT:    fmov s4, w12
406 ; CHECK-NEXT:    mov v0.s[1], w10
407 ; CHECK-NEXT:    mov v2.s[1], w13
408 ; CHECK-NEXT:    mov v3.s[1], w14
409 ; CHECK-NEXT:    mov v4.s[1], w15
410 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
411 ; CHECK-NEXT:    and v2.8b, v2.8b, v1.8b
412 ; CHECK-NEXT:    and v3.8b, v3.8b, v1.8b
413 ; CHECK-NEXT:    and v1.8b, v4.8b, v1.8b
414 ; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
415 ; CHECK-NEXT:    ushll v2.2d, v2.2s, #0
416 ; CHECK-NEXT:    ushll v3.2d, v3.2s, #0
417 ; CHECK-NEXT:    ushll v4.2d, v1.2s, #0
418 ; CHECK-NEXT:    ucvtf v0.2d, v0.2d
419 ; CHECK-NEXT:    ucvtf v1.2d, v2.2d
420 ; CHECK-NEXT:    ucvtf v2.2d, v3.2d
421 ; CHECK-NEXT:    ucvtf v3.2d, v4.2d
422 ; CHECK-NEXT:    ret
423   %1 = uitofp <8 x i8> %a to <8 x double>
424   ret <8 x double> %1
427 define <16 x double> @uitofp_v16i8_double(<16 x i8> %a) {
428 ; CHECK-LABEL: uitofp_v16i8_double:
429 ; CHECK:       // %bb.0:
430 ; CHECK-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
431 ; CHECK-NEXT:    umov w8, v0.b[0]
432 ; CHECK-NEXT:    umov w10, v0.b[2]
433 ; CHECK-NEXT:    umov w9, v0.b[1]
434 ; CHECK-NEXT:    umov w12, v0.b[4]
435 ; CHECK-NEXT:    umov w11, v0.b[3]
436 ; CHECK-NEXT:    umov w13, v0.b[5]
437 ; CHECK-NEXT:    umov w18, v0.b[6]
438 ; CHECK-NEXT:    movi d1, #0x0000ff000000ff
439 ; CHECK-NEXT:    umov w14, v2.b[0]
440 ; CHECK-NEXT:    umov w16, v2.b[2]
441 ; CHECK-NEXT:    umov w0, v2.b[4]
442 ; CHECK-NEXT:    fmov s3, w8
443 ; CHECK-NEXT:    umov w8, v0.b[7]
444 ; CHECK-NEXT:    fmov s0, w10
445 ; CHECK-NEXT:    umov w10, v2.b[6]
446 ; CHECK-NEXT:    umov w15, v2.b[1]
447 ; CHECK-NEXT:    umov w17, v2.b[3]
448 ; CHECK-NEXT:    fmov s4, w12
449 ; CHECK-NEXT:    umov w12, v2.b[5]
450 ; CHECK-NEXT:    fmov s7, w18
451 ; CHECK-NEXT:    mov v3.s[1], w9
452 ; CHECK-NEXT:    umov w9, v2.b[7]
453 ; CHECK-NEXT:    fmov s2, w14
454 ; CHECK-NEXT:    fmov s5, w16
455 ; CHECK-NEXT:    fmov s6, w0
456 ; CHECK-NEXT:    mov v0.s[1], w11
457 ; CHECK-NEXT:    fmov s16, w10
458 ; CHECK-NEXT:    mov v4.s[1], w13
459 ; CHECK-NEXT:    mov v7.s[1], w8
460 ; CHECK-NEXT:    mov v2.s[1], w15
461 ; CHECK-NEXT:    mov v5.s[1], w17
462 ; CHECK-NEXT:    mov v6.s[1], w12
463 ; CHECK-NEXT:    and v3.8b, v3.8b, v1.8b
464 ; CHECK-NEXT:    mov v16.s[1], w9
465 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
466 ; CHECK-NEXT:    and v4.8b, v4.8b, v1.8b
467 ; CHECK-NEXT:    and v7.8b, v7.8b, v1.8b
468 ; CHECK-NEXT:    and v2.8b, v2.8b, v1.8b
469 ; CHECK-NEXT:    ushll v3.2d, v3.2s, #0
470 ; CHECK-NEXT:    and v5.8b, v5.8b, v1.8b
471 ; CHECK-NEXT:    and v6.8b, v6.8b, v1.8b
472 ; CHECK-NEXT:    and v1.8b, v16.8b, v1.8b
473 ; CHECK-NEXT:    ushll v16.2d, v0.2s, #0
474 ; CHECK-NEXT:    ushll v17.2d, v4.2s, #0
475 ; CHECK-NEXT:    ushll v2.2d, v2.2s, #0
476 ; CHECK-NEXT:    ushll v7.2d, v7.2s, #0
477 ; CHECK-NEXT:    ucvtf v0.2d, v3.2d
478 ; CHECK-NEXT:    ushll v5.2d, v5.2s, #0
479 ; CHECK-NEXT:    ushll v6.2d, v6.2s, #0
480 ; CHECK-NEXT:    ushll v18.2d, v1.2s, #0
481 ; CHECK-NEXT:    ucvtf v1.2d, v16.2d
482 ; CHECK-NEXT:    ucvtf v4.2d, v2.2d
483 ; CHECK-NEXT:    ucvtf v2.2d, v17.2d
484 ; CHECK-NEXT:    ucvtf v3.2d, v7.2d
485 ; CHECK-NEXT:    ucvtf v5.2d, v5.2d
486 ; CHECK-NEXT:    ucvtf v6.2d, v6.2d
487 ; CHECK-NEXT:    ucvtf v7.2d, v18.2d
488 ; CHECK-NEXT:    ret
489   %1 = uitofp <16 x i8> %a to <16 x double>
490   ret <16 x double> %1
493 define <8 x double> @uitofp_i16_double(<8 x i16> %a) {
494 ; CHECK-LABEL: uitofp_i16_double:
495 ; CHECK:       // %bb.0:
496 ; CHECK-NEXT:    ushll v1.4s, v0.4h, #0
497 ; CHECK-NEXT:    ushll2 v0.4s, v0.8h, #0
498 ; CHECK-NEXT:    ushll v2.2d, v1.2s, #0
499 ; CHECK-NEXT:    ushll2 v3.2d, v0.4s, #0
500 ; CHECK-NEXT:    ushll2 v1.2d, v1.4s, #0
501 ; CHECK-NEXT:    ushll v4.2d, v0.2s, #0
502 ; CHECK-NEXT:    ucvtf v0.2d, v2.2d
503 ; CHECK-NEXT:    ucvtf v3.2d, v3.2d
504 ; CHECK-NEXT:    ucvtf v1.2d, v1.2d
505 ; CHECK-NEXT:    ucvtf v2.2d, v4.2d
506 ; CHECK-NEXT:    ret
507   %1 = uitofp <8 x i16> %a to <8 x double>
508   ret <8 x double> %1
511 define <8 x double> @uitofp_i32_double(<8 x i32> %a) {
512 ; CHECK-LABEL: uitofp_i32_double:
513 ; CHECK:       // %bb.0:
514 ; CHECK-NEXT:    ushll v2.2d, v0.2s, #0
515 ; CHECK-NEXT:    ushll2 v3.2d, v0.4s, #0
516 ; CHECK-NEXT:    ushll2 v4.2d, v1.4s, #0
517 ; CHECK-NEXT:    ushll v5.2d, v1.2s, #0
518 ; CHECK-NEXT:    ucvtf v0.2d, v2.2d
519 ; CHECK-NEXT:    ucvtf v1.2d, v3.2d
520 ; CHECK-NEXT:    ucvtf v3.2d, v4.2d
521 ; CHECK-NEXT:    ucvtf v2.2d, v5.2d
522 ; CHECK-NEXT:    ret
523   %1 = uitofp <8 x i32> %a to <8 x double>
524   ret <8 x double> %1
527 define <8 x double> @uitofp_i64_double(<8 x i64> %a) {
528 ; CHECK-LABEL: uitofp_i64_double:
529 ; CHECK:       // %bb.0:
530 ; CHECK-NEXT:    ucvtf v0.2d, v0.2d
531 ; CHECK-NEXT:    ucvtf v1.2d, v1.2d
532 ; CHECK-NEXT:    ucvtf v2.2d, v2.2d
533 ; CHECK-NEXT:    ucvtf v3.2d, v3.2d
534 ; CHECK-NEXT:    ret
535   %1 = uitofp <8 x i64> %a to <8 x double>
536   ret <8 x double> %1