xref: /llvm-project/llvm/test/CodeGen/AArch64/itofp.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16
3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
4; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
6
7define fp128 @stofp_i128_f128(i128 %a) {
8; CHECK-SD-LABEL: stofp_i128_f128:
9; CHECK-SD:       // %bb.0: // %entry
10; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
11; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
12; CHECK-SD-NEXT:    .cfi_offset w30, -16
13; CHECK-SD-NEXT:    bl __floattitf
14; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
15; CHECK-SD-NEXT:    ret
16;
17; CHECK-GI-LABEL: stofp_i128_f128:
18; CHECK-GI:       // %bb.0: // %entry
19; CHECK-GI-NEXT:    b __floattitf
20entry:
21  %c = sitofp i128 %a to fp128
22  ret fp128 %c
23}
24
25define fp128 @utofp_i128_f128(i128 %a) {
26; CHECK-SD-LABEL: utofp_i128_f128:
27; CHECK-SD:       // %bb.0: // %entry
28; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
29; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
30; CHECK-SD-NEXT:    .cfi_offset w30, -16
31; CHECK-SD-NEXT:    bl __floatuntitf
32; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
33; CHECK-SD-NEXT:    ret
34;
35; CHECK-GI-LABEL: utofp_i128_f128:
36; CHECK-GI:       // %bb.0: // %entry
37; CHECK-GI-NEXT:    b __floatuntitf
38entry:
39  %c = uitofp i128 %a to fp128
40  ret fp128 %c
41}
42
43define fp128 @stofp_i64_f128(i64 %a) {
44; CHECK-SD-LABEL: stofp_i64_f128:
45; CHECK-SD:       // %bb.0: // %entry
46; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
47; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
48; CHECK-SD-NEXT:    .cfi_offset w30, -16
49; CHECK-SD-NEXT:    bl __floatditf
50; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
51; CHECK-SD-NEXT:    ret
52;
53; CHECK-GI-LABEL: stofp_i64_f128:
54; CHECK-GI:       // %bb.0: // %entry
55; CHECK-GI-NEXT:    b __floatditf
56entry:
57  %c = sitofp i64 %a to fp128
58  ret fp128 %c
59}
60
61define fp128 @utofp_i64_f128(i64 %a) {
62; CHECK-SD-LABEL: utofp_i64_f128:
63; CHECK-SD:       // %bb.0: // %entry
64; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
65; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
66; CHECK-SD-NEXT:    .cfi_offset w30, -16
67; CHECK-SD-NEXT:    bl __floatunditf
68; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
69; CHECK-SD-NEXT:    ret
70;
71; CHECK-GI-LABEL: utofp_i64_f128:
72; CHECK-GI:       // %bb.0: // %entry
73; CHECK-GI-NEXT:    b __floatunditf
74entry:
75  %c = uitofp i64 %a to fp128
76  ret fp128 %c
77}
78
79define fp128 @stofp_i32_f128(i32 %a) {
80; CHECK-SD-LABEL: stofp_i32_f128:
81; CHECK-SD:       // %bb.0: // %entry
82; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
83; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
84; CHECK-SD-NEXT:    .cfi_offset w30, -16
85; CHECK-SD-NEXT:    bl __floatsitf
86; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
87; CHECK-SD-NEXT:    ret
88;
89; CHECK-GI-LABEL: stofp_i32_f128:
90; CHECK-GI:       // %bb.0: // %entry
91; CHECK-GI-NEXT:    b __floatsitf
92entry:
93  %c = sitofp i32 %a to fp128
94  ret fp128 %c
95}
96
97define fp128 @utofp_i32_f128(i32 %a) {
98; CHECK-SD-LABEL: utofp_i32_f128:
99; CHECK-SD:       // %bb.0: // %entry
100; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
101; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
102; CHECK-SD-NEXT:    .cfi_offset w30, -16
103; CHECK-SD-NEXT:    bl __floatunsitf
104; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
105; CHECK-SD-NEXT:    ret
106;
107; CHECK-GI-LABEL: utofp_i32_f128:
108; CHECK-GI:       // %bb.0: // %entry
109; CHECK-GI-NEXT:    b __floatunsitf
110entry:
111  %c = uitofp i32 %a to fp128
112  ret fp128 %c
113}
114
115define fp128 @stofp_i16_f128(i16 %a) {
116; CHECK-SD-LABEL: stofp_i16_f128:
117; CHECK-SD:       // %bb.0: // %entry
118; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
119; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
120; CHECK-SD-NEXT:    .cfi_offset w30, -16
121; CHECK-SD-NEXT:    sxth w0, w0
122; CHECK-SD-NEXT:    bl __floatsitf
123; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
124; CHECK-SD-NEXT:    ret
125;
126; CHECK-GI-LABEL: stofp_i16_f128:
127; CHECK-GI:       // %bb.0: // %entry
128; CHECK-GI-NEXT:    sxth w0, w0
129; CHECK-GI-NEXT:    b __floatsitf
130entry:
131  %c = sitofp i16 %a to fp128
132  ret fp128 %c
133}
134
135define fp128 @utofp_i16_f128(i16 %a) {
136; CHECK-SD-LABEL: utofp_i16_f128:
137; CHECK-SD:       // %bb.0: // %entry
138; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
139; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
140; CHECK-SD-NEXT:    .cfi_offset w30, -16
141; CHECK-SD-NEXT:    and w0, w0, #0xffff
142; CHECK-SD-NEXT:    bl __floatunsitf
143; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
144; CHECK-SD-NEXT:    ret
145;
146; CHECK-GI-LABEL: utofp_i16_f128:
147; CHECK-GI:       // %bb.0: // %entry
148; CHECK-GI-NEXT:    and w0, w0, #0xffff
149; CHECK-GI-NEXT:    b __floatunsitf
150entry:
151  %c = uitofp i16 %a to fp128
152  ret fp128 %c
153}
154
155define fp128 @stofp_i8_f128(i8 %a) {
156; CHECK-SD-LABEL: stofp_i8_f128:
157; CHECK-SD:       // %bb.0: // %entry
158; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
159; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
160; CHECK-SD-NEXT:    .cfi_offset w30, -16
161; CHECK-SD-NEXT:    sxtb w0, w0
162; CHECK-SD-NEXT:    bl __floatsitf
163; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
164; CHECK-SD-NEXT:    ret
165;
166; CHECK-GI-LABEL: stofp_i8_f128:
167; CHECK-GI:       // %bb.0: // %entry
168; CHECK-GI-NEXT:    sxtb w0, w0
169; CHECK-GI-NEXT:    b __floatsitf
170entry:
171  %c = sitofp i8 %a to fp128
172  ret fp128 %c
173}
174
175define fp128 @utofp_i8_f128(i8 %a) {
176; CHECK-SD-LABEL: utofp_i8_f128:
177; CHECK-SD:       // %bb.0: // %entry
178; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
179; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
180; CHECK-SD-NEXT:    .cfi_offset w30, -16
181; CHECK-SD-NEXT:    and w0, w0, #0xff
182; CHECK-SD-NEXT:    bl __floatunsitf
183; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
184; CHECK-SD-NEXT:    ret
185;
186; CHECK-GI-LABEL: utofp_i8_f128:
187; CHECK-GI:       // %bb.0: // %entry
188; CHECK-GI-NEXT:    and w0, w0, #0xff
189; CHECK-GI-NEXT:    b __floatunsitf
190entry:
191  %c = uitofp i8 %a to fp128
192  ret fp128 %c
193}
194
195define double @stofp_i128_f64(i128 %a) {
196; CHECK-SD-LABEL: stofp_i128_f64:
197; CHECK-SD:       // %bb.0: // %entry
198; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
199; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
200; CHECK-SD-NEXT:    .cfi_offset w30, -16
201; CHECK-SD-NEXT:    bl __floattidf
202; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
203; CHECK-SD-NEXT:    ret
204;
205; CHECK-GI-LABEL: stofp_i128_f64:
206; CHECK-GI:       // %bb.0: // %entry
207; CHECK-GI-NEXT:    b __floattidf
208entry:
209  %c = sitofp i128 %a to double
210  ret double %c
211}
212
213define double @utofp_i128_f64(i128 %a) {
214; CHECK-SD-LABEL: utofp_i128_f64:
215; CHECK-SD:       // %bb.0: // %entry
216; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
217; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
218; CHECK-SD-NEXT:    .cfi_offset w30, -16
219; CHECK-SD-NEXT:    bl __floatuntidf
220; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
221; CHECK-SD-NEXT:    ret
222;
223; CHECK-GI-LABEL: utofp_i128_f64:
224; CHECK-GI:       // %bb.0: // %entry
225; CHECK-GI-NEXT:    b __floatuntidf
226entry:
227  %c = uitofp i128 %a to double
228  ret double %c
229}
230
231define double @stofp_i64_f64(i64 %a) {
232; CHECK-LABEL: stofp_i64_f64:
233; CHECK:       // %bb.0: // %entry
234; CHECK-NEXT:    scvtf d0, x0
235; CHECK-NEXT:    ret
236entry:
237  %c = sitofp i64 %a to double
238  ret double %c
239}
240
241define double @utofp_i64_f64(i64 %a) {
242; CHECK-LABEL: utofp_i64_f64:
243; CHECK:       // %bb.0: // %entry
244; CHECK-NEXT:    ucvtf d0, x0
245; CHECK-NEXT:    ret
246entry:
247  %c = uitofp i64 %a to double
248  ret double %c
249}
250
251define double @stofp_i32_f64(i32 %a) {
252; CHECK-LABEL: stofp_i32_f64:
253; CHECK:       // %bb.0: // %entry
254; CHECK-NEXT:    scvtf d0, w0
255; CHECK-NEXT:    ret
256entry:
257  %c = sitofp i32 %a to double
258  ret double %c
259}
260
261define double @utofp_i32_f64(i32 %a) {
262; CHECK-LABEL: utofp_i32_f64:
263; CHECK:       // %bb.0: // %entry
264; CHECK-NEXT:    ucvtf d0, w0
265; CHECK-NEXT:    ret
266entry:
267  %c = uitofp i32 %a to double
268  ret double %c
269}
270
271define double @stofp_i16_f64(i16 %a) {
272; CHECK-LABEL: stofp_i16_f64:
273; CHECK:       // %bb.0: // %entry
274; CHECK-NEXT:    sxth w8, w0
275; CHECK-NEXT:    scvtf d0, w8
276; CHECK-NEXT:    ret
277entry:
278  %c = sitofp i16 %a to double
279  ret double %c
280}
281
282define double @utofp_i16_f64(i16 %a) {
283; CHECK-LABEL: utofp_i16_f64:
284; CHECK:       // %bb.0: // %entry
285; CHECK-NEXT:    and w8, w0, #0xffff
286; CHECK-NEXT:    ucvtf d0, w8
287; CHECK-NEXT:    ret
288entry:
289  %c = uitofp i16 %a to double
290  ret double %c
291}
292
293define double @stofp_i8_f64(i8 %a) {
294; CHECK-LABEL: stofp_i8_f64:
295; CHECK:       // %bb.0: // %entry
296; CHECK-NEXT:    sxtb w8, w0
297; CHECK-NEXT:    scvtf d0, w8
298; CHECK-NEXT:    ret
299entry:
300  %c = sitofp i8 %a to double
301  ret double %c
302}
303
304define double @utofp_i8_f64(i8 %a) {
305; CHECK-LABEL: utofp_i8_f64:
306; CHECK:       // %bb.0: // %entry
307; CHECK-NEXT:    and w8, w0, #0xff
308; CHECK-NEXT:    ucvtf d0, w8
309; CHECK-NEXT:    ret
310entry:
311  %c = uitofp i8 %a to double
312  ret double %c
313}
314
315define float @stofp_i128_f32(i128 %a) {
316; CHECK-SD-LABEL: stofp_i128_f32:
317; CHECK-SD:       // %bb.0: // %entry
318; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
319; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
320; CHECK-SD-NEXT:    .cfi_offset w30, -16
321; CHECK-SD-NEXT:    bl __floattisf
322; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
323; CHECK-SD-NEXT:    ret
324;
325; CHECK-GI-LABEL: stofp_i128_f32:
326; CHECK-GI:       // %bb.0: // %entry
327; CHECK-GI-NEXT:    b __floattisf
328entry:
329  %c = sitofp i128 %a to float
330  ret float %c
331}
332
333define float @utofp_i128_f32(i128 %a) {
334; CHECK-SD-LABEL: utofp_i128_f32:
335; CHECK-SD:       // %bb.0: // %entry
336; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
337; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
338; CHECK-SD-NEXT:    .cfi_offset w30, -16
339; CHECK-SD-NEXT:    bl __floatuntisf
340; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
341; CHECK-SD-NEXT:    ret
342;
343; CHECK-GI-LABEL: utofp_i128_f32:
344; CHECK-GI:       // %bb.0: // %entry
345; CHECK-GI-NEXT:    b __floatuntisf
346entry:
347  %c = uitofp i128 %a to float
348  ret float %c
349}
350
351define float @stofp_i64_f32(i64 %a) {
352; CHECK-LABEL: stofp_i64_f32:
353; CHECK:       // %bb.0: // %entry
354; CHECK-NEXT:    scvtf s0, x0
355; CHECK-NEXT:    ret
356entry:
357  %c = sitofp i64 %a to float
358  ret float %c
359}
360
361define float @utofp_i64_f32(i64 %a) {
362; CHECK-LABEL: utofp_i64_f32:
363; CHECK:       // %bb.0: // %entry
364; CHECK-NEXT:    ucvtf s0, x0
365; CHECK-NEXT:    ret
366entry:
367  %c = uitofp i64 %a to float
368  ret float %c
369}
370
371define float @stofp_i32_f32(i32 %a) {
372; CHECK-LABEL: stofp_i32_f32:
373; CHECK:       // %bb.0: // %entry
374; CHECK-NEXT:    scvtf s0, w0
375; CHECK-NEXT:    ret
376entry:
377  %c = sitofp i32 %a to float
378  ret float %c
379}
380
381define float @utofp_i32_f32(i32 %a) {
382; CHECK-LABEL: utofp_i32_f32:
383; CHECK:       // %bb.0: // %entry
384; CHECK-NEXT:    ucvtf s0, w0
385; CHECK-NEXT:    ret
386entry:
387  %c = uitofp i32 %a to float
388  ret float %c
389}
390
391define float @stofp_i16_f32(i16 %a) {
392; CHECK-LABEL: stofp_i16_f32:
393; CHECK:       // %bb.0: // %entry
394; CHECK-NEXT:    sxth w8, w0
395; CHECK-NEXT:    scvtf s0, w8
396; CHECK-NEXT:    ret
397entry:
398  %c = sitofp i16 %a to float
399  ret float %c
400}
401
402define float @utofp_i16_f32(i16 %a) {
403; CHECK-LABEL: utofp_i16_f32:
404; CHECK:       // %bb.0: // %entry
405; CHECK-NEXT:    and w8, w0, #0xffff
406; CHECK-NEXT:    ucvtf s0, w8
407; CHECK-NEXT:    ret
408entry:
409  %c = uitofp i16 %a to float
410  ret float %c
411}
412
413define float @stofp_i8_f32(i8 %a) {
414; CHECK-LABEL: stofp_i8_f32:
415; CHECK:       // %bb.0: // %entry
416; CHECK-NEXT:    sxtb w8, w0
417; CHECK-NEXT:    scvtf s0, w8
418; CHECK-NEXT:    ret
419entry:
420  %c = sitofp i8 %a to float
421  ret float %c
422}
423
424define float @utofp_i8_f32(i8 %a) {
425; CHECK-LABEL: utofp_i8_f32:
426; CHECK:       // %bb.0: // %entry
427; CHECK-NEXT:    and w8, w0, #0xff
428; CHECK-NEXT:    ucvtf s0, w8
429; CHECK-NEXT:    ret
430entry:
431  %c = uitofp i8 %a to float
432  ret float %c
433}
434
435define half @stofp_i128_f16(i128 %a) {
436; CHECK-SD-NOFP16-LABEL: stofp_i128_f16:
437; CHECK-SD-NOFP16:       // %bb.0: // %entry
438; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
439; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 16
440; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -16
441; CHECK-SD-NOFP16-NEXT:    bl __floattisf
442; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
443; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
444; CHECK-SD-NOFP16-NEXT:    ret
445;
446; CHECK-SD-FP16-LABEL: stofp_i128_f16:
447; CHECK-SD-FP16:       // %bb.0: // %entry
448; CHECK-SD-FP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
449; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 16
450; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -16
451; CHECK-SD-FP16-NEXT:    bl __floattihf
452; CHECK-SD-FP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
453; CHECK-SD-FP16-NEXT:    ret
454;
455; CHECK-GI-NOFP16-LABEL: stofp_i128_f16:
456; CHECK-GI-NOFP16:       // %bb.0: // %entry
457; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
458; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 16
459; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -16
460; CHECK-GI-NOFP16-NEXT:    bl __floattisf
461; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
462; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
463; CHECK-GI-NOFP16-NEXT:    ret
464;
465; CHECK-GI-FP16-LABEL: stofp_i128_f16:
466; CHECK-GI-FP16:       // %bb.0: // %entry
467; CHECK-GI-FP16-NEXT:    b __floattihf
468entry:
469  %c = sitofp i128 %a to half
470  ret half %c
471}
472
473define half @utofp_i128_f16(i128 %a) {
474; CHECK-SD-NOFP16-LABEL: utofp_i128_f16:
475; CHECK-SD-NOFP16:       // %bb.0: // %entry
476; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
477; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 16
478; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -16
479; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
480; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
481; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
482; CHECK-SD-NOFP16-NEXT:    ret
483;
484; CHECK-SD-FP16-LABEL: utofp_i128_f16:
485; CHECK-SD-FP16:       // %bb.0: // %entry
486; CHECK-SD-FP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
487; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 16
488; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -16
489; CHECK-SD-FP16-NEXT:    bl __floatuntihf
490; CHECK-SD-FP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
491; CHECK-SD-FP16-NEXT:    ret
492;
493; CHECK-GI-NOFP16-LABEL: utofp_i128_f16:
494; CHECK-GI-NOFP16:       // %bb.0: // %entry
495; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
496; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 16
497; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -16
498; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
499; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
500; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
501; CHECK-GI-NOFP16-NEXT:    ret
502;
503; CHECK-GI-FP16-LABEL: utofp_i128_f16:
504; CHECK-GI-FP16:       // %bb.0: // %entry
505; CHECK-GI-FP16-NEXT:    b __floatuntihf
506entry:
507  %c = uitofp i128 %a to half
508  ret half %c
509}
510
511define half @stofp_i64_f16(i64 %a) {
512; CHECK-SD-NOFP16-LABEL: stofp_i64_f16:
513; CHECK-SD-NOFP16:       // %bb.0: // %entry
514; CHECK-SD-NOFP16-NEXT:    scvtf s0, x0
515; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
516; CHECK-SD-NOFP16-NEXT:    ret
517;
518; CHECK-SD-FP16-LABEL: stofp_i64_f16:
519; CHECK-SD-FP16:       // %bb.0: // %entry
520; CHECK-SD-FP16-NEXT:    scvtf h0, x0
521; CHECK-SD-FP16-NEXT:    ret
522;
523; CHECK-GI-NOFP16-LABEL: stofp_i64_f16:
524; CHECK-GI-NOFP16:       // %bb.0: // %entry
525; CHECK-GI-NOFP16-NEXT:    scvtf s0, x0
526; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
527; CHECK-GI-NOFP16-NEXT:    ret
528;
529; CHECK-GI-FP16-LABEL: stofp_i64_f16:
530; CHECK-GI-FP16:       // %bb.0: // %entry
531; CHECK-GI-FP16-NEXT:    scvtf h0, x0
532; CHECK-GI-FP16-NEXT:    ret
533entry:
534  %c = sitofp i64 %a to half
535  ret half %c
536}
537
538define half @utofp_i64_f16(i64 %a) {
539; CHECK-SD-NOFP16-LABEL: utofp_i64_f16:
540; CHECK-SD-NOFP16:       // %bb.0: // %entry
541; CHECK-SD-NOFP16-NEXT:    ucvtf s0, x0
542; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
543; CHECK-SD-NOFP16-NEXT:    ret
544;
545; CHECK-SD-FP16-LABEL: utofp_i64_f16:
546; CHECK-SD-FP16:       // %bb.0: // %entry
547; CHECK-SD-FP16-NEXT:    ucvtf h0, x0
548; CHECK-SD-FP16-NEXT:    ret
549;
550; CHECK-GI-NOFP16-LABEL: utofp_i64_f16:
551; CHECK-GI-NOFP16:       // %bb.0: // %entry
552; CHECK-GI-NOFP16-NEXT:    ucvtf s0, x0
553; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
554; CHECK-GI-NOFP16-NEXT:    ret
555;
556; CHECK-GI-FP16-LABEL: utofp_i64_f16:
557; CHECK-GI-FP16:       // %bb.0: // %entry
558; CHECK-GI-FP16-NEXT:    ucvtf h0, x0
559; CHECK-GI-FP16-NEXT:    ret
560entry:
561  %c = uitofp i64 %a to half
562  ret half %c
563}
564
565define half @stofp_i32_f16(i32 %a) {
566; CHECK-SD-NOFP16-LABEL: stofp_i32_f16:
567; CHECK-SD-NOFP16:       // %bb.0: // %entry
568; CHECK-SD-NOFP16-NEXT:    scvtf s0, w0
569; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
570; CHECK-SD-NOFP16-NEXT:    ret
571;
572; CHECK-SD-FP16-LABEL: stofp_i32_f16:
573; CHECK-SD-FP16:       // %bb.0: // %entry
574; CHECK-SD-FP16-NEXT:    scvtf h0, w0
575; CHECK-SD-FP16-NEXT:    ret
576;
577; CHECK-GI-NOFP16-LABEL: stofp_i32_f16:
578; CHECK-GI-NOFP16:       // %bb.0: // %entry
579; CHECK-GI-NOFP16-NEXT:    scvtf s0, w0
580; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
581; CHECK-GI-NOFP16-NEXT:    ret
582;
583; CHECK-GI-FP16-LABEL: stofp_i32_f16:
584; CHECK-GI-FP16:       // %bb.0: // %entry
585; CHECK-GI-FP16-NEXT:    scvtf h0, w0
586; CHECK-GI-FP16-NEXT:    ret
587entry:
588  %c = sitofp i32 %a to half
589  ret half %c
590}
591
592define half @utofp_i32_f16(i32 %a) {
593; CHECK-SD-NOFP16-LABEL: utofp_i32_f16:
594; CHECK-SD-NOFP16:       // %bb.0: // %entry
595; CHECK-SD-NOFP16-NEXT:    ucvtf s0, w0
596; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
597; CHECK-SD-NOFP16-NEXT:    ret
598;
599; CHECK-SD-FP16-LABEL: utofp_i32_f16:
600; CHECK-SD-FP16:       // %bb.0: // %entry
601; CHECK-SD-FP16-NEXT:    ucvtf h0, w0
602; CHECK-SD-FP16-NEXT:    ret
603;
604; CHECK-GI-NOFP16-LABEL: utofp_i32_f16:
605; CHECK-GI-NOFP16:       // %bb.0: // %entry
606; CHECK-GI-NOFP16-NEXT:    ucvtf s0, w0
607; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
608; CHECK-GI-NOFP16-NEXT:    ret
609;
610; CHECK-GI-FP16-LABEL: utofp_i32_f16:
611; CHECK-GI-FP16:       // %bb.0: // %entry
612; CHECK-GI-FP16-NEXT:    ucvtf h0, w0
613; CHECK-GI-FP16-NEXT:    ret
614entry:
615  %c = uitofp i32 %a to half
616  ret half %c
617}
618
619define half @stofp_i16_f16(i16 %a) {
620; CHECK-SD-NOFP16-LABEL: stofp_i16_f16:
621; CHECK-SD-NOFP16:       // %bb.0: // %entry
622; CHECK-SD-NOFP16-NEXT:    sxth w8, w0
623; CHECK-SD-NOFP16-NEXT:    scvtf s0, w8
624; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
625; CHECK-SD-NOFP16-NEXT:    ret
626;
627; CHECK-SD-FP16-LABEL: stofp_i16_f16:
628; CHECK-SD-FP16:       // %bb.0: // %entry
629; CHECK-SD-FP16-NEXT:    sxth w8, w0
630; CHECK-SD-FP16-NEXT:    scvtf h0, w8
631; CHECK-SD-FP16-NEXT:    ret
632;
633; CHECK-GI-NOFP16-LABEL: stofp_i16_f16:
634; CHECK-GI-NOFP16:       // %bb.0: // %entry
635; CHECK-GI-NOFP16-NEXT:    sxth w8, w0
636; CHECK-GI-NOFP16-NEXT:    scvtf s0, w8
637; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
638; CHECK-GI-NOFP16-NEXT:    ret
639;
640; CHECK-GI-FP16-LABEL: stofp_i16_f16:
641; CHECK-GI-FP16:       // %bb.0: // %entry
642; CHECK-GI-FP16-NEXT:    sxth w8, w0
643; CHECK-GI-FP16-NEXT:    scvtf h0, w8
644; CHECK-GI-FP16-NEXT:    ret
645entry:
646  %c = sitofp i16 %a to half
647  ret half %c
648}
649
650define half @utofp_i16_f16(i16 %a) {
651; CHECK-SD-NOFP16-LABEL: utofp_i16_f16:
652; CHECK-SD-NOFP16:       // %bb.0: // %entry
653; CHECK-SD-NOFP16-NEXT:    and w8, w0, #0xffff
654; CHECK-SD-NOFP16-NEXT:    ucvtf s0, w8
655; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
656; CHECK-SD-NOFP16-NEXT:    ret
657;
658; CHECK-SD-FP16-LABEL: utofp_i16_f16:
659; CHECK-SD-FP16:       // %bb.0: // %entry
660; CHECK-SD-FP16-NEXT:    and w8, w0, #0xffff
661; CHECK-SD-FP16-NEXT:    ucvtf h0, w8
662; CHECK-SD-FP16-NEXT:    ret
663;
664; CHECK-GI-NOFP16-LABEL: utofp_i16_f16:
665; CHECK-GI-NOFP16:       // %bb.0: // %entry
666; CHECK-GI-NOFP16-NEXT:    and w8, w0, #0xffff
667; CHECK-GI-NOFP16-NEXT:    ucvtf s0, w8
668; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
669; CHECK-GI-NOFP16-NEXT:    ret
670;
671; CHECK-GI-FP16-LABEL: utofp_i16_f16:
672; CHECK-GI-FP16:       // %bb.0: // %entry
673; CHECK-GI-FP16-NEXT:    and w8, w0, #0xffff
674; CHECK-GI-FP16-NEXT:    ucvtf h0, w8
675; CHECK-GI-FP16-NEXT:    ret
676entry:
677  %c = uitofp i16 %a to half
678  ret half %c
679}
680
681define half @stofp_i8_f16(i8 %a) {
682; CHECK-SD-NOFP16-LABEL: stofp_i8_f16:
683; CHECK-SD-NOFP16:       // %bb.0: // %entry
684; CHECK-SD-NOFP16-NEXT:    sxtb w8, w0
685; CHECK-SD-NOFP16-NEXT:    scvtf s0, w8
686; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
687; CHECK-SD-NOFP16-NEXT:    ret
688;
689; CHECK-SD-FP16-LABEL: stofp_i8_f16:
690; CHECK-SD-FP16:       // %bb.0: // %entry
691; CHECK-SD-FP16-NEXT:    sxtb w8, w0
692; CHECK-SD-FP16-NEXT:    scvtf h0, w8
693; CHECK-SD-FP16-NEXT:    ret
694;
695; CHECK-GI-NOFP16-LABEL: stofp_i8_f16:
696; CHECK-GI-NOFP16:       // %bb.0: // %entry
697; CHECK-GI-NOFP16-NEXT:    sxtb w8, w0
698; CHECK-GI-NOFP16-NEXT:    scvtf s0, w8
699; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
700; CHECK-GI-NOFP16-NEXT:    ret
701;
702; CHECK-GI-FP16-LABEL: stofp_i8_f16:
703; CHECK-GI-FP16:       // %bb.0: // %entry
704; CHECK-GI-FP16-NEXT:    sxtb w8, w0
705; CHECK-GI-FP16-NEXT:    scvtf h0, w8
706; CHECK-GI-FP16-NEXT:    ret
707entry:
708  %c = sitofp i8 %a to half
709  ret half %c
710}
711
712define half @utofp_i8_f16(i8 %a) {
713; CHECK-SD-NOFP16-LABEL: utofp_i8_f16:
714; CHECK-SD-NOFP16:       // %bb.0: // %entry
715; CHECK-SD-NOFP16-NEXT:    and w8, w0, #0xff
716; CHECK-SD-NOFP16-NEXT:    ucvtf s0, w8
717; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
718; CHECK-SD-NOFP16-NEXT:    ret
719;
720; CHECK-SD-FP16-LABEL: utofp_i8_f16:
721; CHECK-SD-FP16:       // %bb.0: // %entry
722; CHECK-SD-FP16-NEXT:    and w8, w0, #0xff
723; CHECK-SD-FP16-NEXT:    ucvtf h0, w8
724; CHECK-SD-FP16-NEXT:    ret
725;
726; CHECK-GI-NOFP16-LABEL: utofp_i8_f16:
727; CHECK-GI-NOFP16:       // %bb.0: // %entry
728; CHECK-GI-NOFP16-NEXT:    and w8, w0, #0xff
729; CHECK-GI-NOFP16-NEXT:    ucvtf s0, w8
730; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
731; CHECK-GI-NOFP16-NEXT:    ret
732;
733; CHECK-GI-FP16-LABEL: utofp_i8_f16:
734; CHECK-GI-FP16:       // %bb.0: // %entry
735; CHECK-GI-FP16-NEXT:    and w8, w0, #0xff
736; CHECK-GI-FP16-NEXT:    ucvtf h0, w8
737; CHECK-GI-FP16-NEXT:    ret
738entry:
739  %c = uitofp i8 %a to half
740  ret half %c
741}
742
743define <2 x fp128> @stofp_v2i128_v2f128(<2 x i128> %a) {
744; CHECK-SD-LABEL: stofp_v2i128_v2f128:
745; CHECK-SD:       // %bb.0: // %entry
746; CHECK-SD-NEXT:    sub sp, sp, #48
747; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
748; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
749; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
750; CHECK-SD-NEXT:    .cfi_offset w19, -8
751; CHECK-SD-NEXT:    .cfi_offset w20, -16
752; CHECK-SD-NEXT:    .cfi_offset w30, -32
753; CHECK-SD-NEXT:    mov x19, x3
754; CHECK-SD-NEXT:    mov x20, x2
755; CHECK-SD-NEXT:    bl __floattitf
756; CHECK-SD-NEXT:    mov x0, x20
757; CHECK-SD-NEXT:    mov x1, x19
758; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
759; CHECK-SD-NEXT:    bl __floattitf
760; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
761; CHECK-SD-NEXT:    mov v1.16b, v0.16b
762; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
763; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
764; CHECK-SD-NEXT:    add sp, sp, #48
765; CHECK-SD-NEXT:    ret
766;
767; CHECK-GI-LABEL: stofp_v2i128_v2f128:
768; CHECK-GI:       // %bb.0: // %entry
769; CHECK-GI-NEXT:    sub sp, sp, #48
770; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
771; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
772; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
773; CHECK-GI-NEXT:    .cfi_offset w19, -8
774; CHECK-GI-NEXT:    .cfi_offset w20, -16
775; CHECK-GI-NEXT:    .cfi_offset w30, -32
776; CHECK-GI-NEXT:    mov x19, x2
777; CHECK-GI-NEXT:    mov x20, x3
778; CHECK-GI-NEXT:    bl __floattitf
779; CHECK-GI-NEXT:    mov x0, x19
780; CHECK-GI-NEXT:    mov x1, x20
781; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
782; CHECK-GI-NEXT:    bl __floattitf
783; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
784; CHECK-GI-NEXT:    mov v1.16b, v0.16b
785; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
786; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
787; CHECK-GI-NEXT:    add sp, sp, #48
788; CHECK-GI-NEXT:    ret
789entry:
790  %c = sitofp <2 x i128> %a to <2 x fp128>
791  ret <2 x fp128> %c
792}
793
794define <2 x fp128> @utofp_v2i128_v2f128(<2 x i128> %a) {
795; CHECK-SD-LABEL: utofp_v2i128_v2f128:
796; CHECK-SD:       // %bb.0: // %entry
797; CHECK-SD-NEXT:    sub sp, sp, #48
798; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
799; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
800; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
801; CHECK-SD-NEXT:    .cfi_offset w19, -8
802; CHECK-SD-NEXT:    .cfi_offset w20, -16
803; CHECK-SD-NEXT:    .cfi_offset w30, -32
804; CHECK-SD-NEXT:    mov x19, x3
805; CHECK-SD-NEXT:    mov x20, x2
806; CHECK-SD-NEXT:    bl __floatuntitf
807; CHECK-SD-NEXT:    mov x0, x20
808; CHECK-SD-NEXT:    mov x1, x19
809; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
810; CHECK-SD-NEXT:    bl __floatuntitf
811; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
812; CHECK-SD-NEXT:    mov v1.16b, v0.16b
813; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
814; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
815; CHECK-SD-NEXT:    add sp, sp, #48
816; CHECK-SD-NEXT:    ret
817;
818; CHECK-GI-LABEL: utofp_v2i128_v2f128:
819; CHECK-GI:       // %bb.0: // %entry
820; CHECK-GI-NEXT:    sub sp, sp, #48
821; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
822; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
823; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
824; CHECK-GI-NEXT:    .cfi_offset w19, -8
825; CHECK-GI-NEXT:    .cfi_offset w20, -16
826; CHECK-GI-NEXT:    .cfi_offset w30, -32
827; CHECK-GI-NEXT:    mov x19, x2
828; CHECK-GI-NEXT:    mov x20, x3
829; CHECK-GI-NEXT:    bl __floatuntitf
830; CHECK-GI-NEXT:    mov x0, x19
831; CHECK-GI-NEXT:    mov x1, x20
832; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
833; CHECK-GI-NEXT:    bl __floatuntitf
834; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
835; CHECK-GI-NEXT:    mov v1.16b, v0.16b
836; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
837; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
838; CHECK-GI-NEXT:    add sp, sp, #48
839; CHECK-GI-NEXT:    ret
840entry:
841  %c = uitofp <2 x i128> %a to <2 x fp128>
842  ret <2 x fp128> %c
843}
844
845define <3 x fp128> @stofp_v3i128_v3f128(<3 x i128> %a) {
846; CHECK-SD-LABEL: stofp_v3i128_v3f128:
847; CHECK-SD:       // %bb.0: // %entry
848; CHECK-SD-NEXT:    sub sp, sp, #80
849; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
850; CHECK-SD-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
851; CHECK-SD-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
852; CHECK-SD-NEXT:    .cfi_def_cfa_offset 80
853; CHECK-SD-NEXT:    .cfi_offset w19, -8
854; CHECK-SD-NEXT:    .cfi_offset w20, -16
855; CHECK-SD-NEXT:    .cfi_offset w21, -24
856; CHECK-SD-NEXT:    .cfi_offset w22, -32
857; CHECK-SD-NEXT:    .cfi_offset w30, -48
858; CHECK-SD-NEXT:    mov x19, x5
859; CHECK-SD-NEXT:    mov x20, x4
860; CHECK-SD-NEXT:    mov x21, x3
861; CHECK-SD-NEXT:    mov x22, x2
862; CHECK-SD-NEXT:    bl __floattitf
863; CHECK-SD-NEXT:    mov x0, x22
864; CHECK-SD-NEXT:    mov x1, x21
865; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
866; CHECK-SD-NEXT:    bl __floattitf
867; CHECK-SD-NEXT:    mov x0, x20
868; CHECK-SD-NEXT:    mov x1, x19
869; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
870; CHECK-SD-NEXT:    bl __floattitf
871; CHECK-SD-NEXT:    mov v2.16b, v0.16b
872; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
873; CHECK-SD-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
874; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
875; CHECK-SD-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
876; CHECK-SD-NEXT:    add sp, sp, #80
877; CHECK-SD-NEXT:    ret
878;
879; CHECK-GI-LABEL: stofp_v3i128_v3f128:
880; CHECK-GI:       // %bb.0: // %entry
881; CHECK-GI-NEXT:    sub sp, sp, #80
882; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
883; CHECK-GI-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
884; CHECK-GI-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
885; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
886; CHECK-GI-NEXT:    .cfi_offset w19, -8
887; CHECK-GI-NEXT:    .cfi_offset w20, -16
888; CHECK-GI-NEXT:    .cfi_offset w21, -24
889; CHECK-GI-NEXT:    .cfi_offset w22, -32
890; CHECK-GI-NEXT:    .cfi_offset w30, -48
891; CHECK-GI-NEXT:    mov x19, x2
892; CHECK-GI-NEXT:    mov x20, x3
893; CHECK-GI-NEXT:    mov x21, x4
894; CHECK-GI-NEXT:    mov x22, x5
895; CHECK-GI-NEXT:    bl __floattitf
896; CHECK-GI-NEXT:    mov x0, x19
897; CHECK-GI-NEXT:    mov x1, x20
898; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
899; CHECK-GI-NEXT:    bl __floattitf
900; CHECK-GI-NEXT:    mov x0, x21
901; CHECK-GI-NEXT:    mov x1, x22
902; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
903; CHECK-GI-NEXT:    bl __floattitf
904; CHECK-GI-NEXT:    mov v2.16b, v0.16b
905; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
906; CHECK-GI-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
907; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
908; CHECK-GI-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
909; CHECK-GI-NEXT:    add sp, sp, #80
910; CHECK-GI-NEXT:    ret
911entry:
912  %c = sitofp <3 x i128> %a to <3 x fp128>
913  ret <3 x fp128> %c
914}
915
916define <3 x fp128> @utofp_v3i128_v3f128(<3 x i128> %a) {
917; CHECK-SD-LABEL: utofp_v3i128_v3f128:
918; CHECK-SD:       // %bb.0: // %entry
919; CHECK-SD-NEXT:    sub sp, sp, #80
920; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
921; CHECK-SD-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
922; CHECK-SD-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
923; CHECK-SD-NEXT:    .cfi_def_cfa_offset 80
924; CHECK-SD-NEXT:    .cfi_offset w19, -8
925; CHECK-SD-NEXT:    .cfi_offset w20, -16
926; CHECK-SD-NEXT:    .cfi_offset w21, -24
927; CHECK-SD-NEXT:    .cfi_offset w22, -32
928; CHECK-SD-NEXT:    .cfi_offset w30, -48
929; CHECK-SD-NEXT:    mov x19, x5
930; CHECK-SD-NEXT:    mov x20, x4
931; CHECK-SD-NEXT:    mov x21, x3
932; CHECK-SD-NEXT:    mov x22, x2
933; CHECK-SD-NEXT:    bl __floatuntitf
934; CHECK-SD-NEXT:    mov x0, x22
935; CHECK-SD-NEXT:    mov x1, x21
936; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
937; CHECK-SD-NEXT:    bl __floatuntitf
938; CHECK-SD-NEXT:    mov x0, x20
939; CHECK-SD-NEXT:    mov x1, x19
940; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
941; CHECK-SD-NEXT:    bl __floatuntitf
942; CHECK-SD-NEXT:    mov v2.16b, v0.16b
943; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
944; CHECK-SD-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
945; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
946; CHECK-SD-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
947; CHECK-SD-NEXT:    add sp, sp, #80
948; CHECK-SD-NEXT:    ret
949;
950; CHECK-GI-LABEL: utofp_v3i128_v3f128:
951; CHECK-GI:       // %bb.0: // %entry
952; CHECK-GI-NEXT:    sub sp, sp, #80
953; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
954; CHECK-GI-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
955; CHECK-GI-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
956; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
957; CHECK-GI-NEXT:    .cfi_offset w19, -8
958; CHECK-GI-NEXT:    .cfi_offset w20, -16
959; CHECK-GI-NEXT:    .cfi_offset w21, -24
960; CHECK-GI-NEXT:    .cfi_offset w22, -32
961; CHECK-GI-NEXT:    .cfi_offset w30, -48
962; CHECK-GI-NEXT:    mov x19, x2
963; CHECK-GI-NEXT:    mov x20, x3
964; CHECK-GI-NEXT:    mov x21, x4
965; CHECK-GI-NEXT:    mov x22, x5
966; CHECK-GI-NEXT:    bl __floatuntitf
967; CHECK-GI-NEXT:    mov x0, x19
968; CHECK-GI-NEXT:    mov x1, x20
969; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
970; CHECK-GI-NEXT:    bl __floatuntitf
971; CHECK-GI-NEXT:    mov x0, x21
972; CHECK-GI-NEXT:    mov x1, x22
973; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
974; CHECK-GI-NEXT:    bl __floatuntitf
975; CHECK-GI-NEXT:    mov v2.16b, v0.16b
976; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
977; CHECK-GI-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
978; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
979; CHECK-GI-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
980; CHECK-GI-NEXT:    add sp, sp, #80
981; CHECK-GI-NEXT:    ret
982entry:
983  %c = uitofp <3 x i128> %a to <3 x fp128>
984  ret <3 x fp128> %c
985}
986
987define <2 x fp128> @stofp_v2i64_v2f128(<2 x i64> %a) {
988; CHECK-SD-LABEL: stofp_v2i64_v2f128:
989; CHECK-SD:       // %bb.0: // %entry
990; CHECK-SD-NEXT:    sub sp, sp, #48
991; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
992; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
993; CHECK-SD-NEXT:    .cfi_offset w30, -16
994; CHECK-SD-NEXT:    fmov x0, d0
995; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
996; CHECK-SD-NEXT:    bl __floatditf
997; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
998; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
999; CHECK-SD-NEXT:    mov x0, v0.d[1]
1000; CHECK-SD-NEXT:    bl __floatditf
1001; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1002; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1003; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
1004; CHECK-SD-NEXT:    add sp, sp, #48
1005; CHECK-SD-NEXT:    ret
1006;
1007; CHECK-GI-LABEL: stofp_v2i64_v2f128:
1008; CHECK-GI:       // %bb.0: // %entry
1009; CHECK-GI-NEXT:    sub sp, sp, #32
1010; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
1011; CHECK-GI-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
1012; CHECK-GI-NEXT:    .cfi_def_cfa_offset 32
1013; CHECK-GI-NEXT:    .cfi_offset w30, -8
1014; CHECK-GI-NEXT:    .cfi_offset b8, -16
1015; CHECK-GI-NEXT:    fmov x0, d0
1016; CHECK-GI-NEXT:    mov d8, v0.d[1]
1017; CHECK-GI-NEXT:    bl __floatditf
1018; CHECK-GI-NEXT:    fmov x0, d8
1019; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1020; CHECK-GI-NEXT:    bl __floatditf
1021; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1022; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1023; CHECK-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
1024; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
1025; CHECK-GI-NEXT:    add sp, sp, #32
1026; CHECK-GI-NEXT:    ret
1027entry:
1028  %c = sitofp <2 x i64> %a to <2 x fp128>
1029  ret <2 x fp128> %c
1030}
1031
1032define <2 x fp128> @utofp_v2i64_v2f128(<2 x i64> %a) {
1033; CHECK-SD-LABEL: utofp_v2i64_v2f128:
1034; CHECK-SD:       // %bb.0: // %entry
1035; CHECK-SD-NEXT:    sub sp, sp, #48
1036; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
1037; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
1038; CHECK-SD-NEXT:    .cfi_offset w30, -16
1039; CHECK-SD-NEXT:    fmov x0, d0
1040; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1041; CHECK-SD-NEXT:    bl __floatunditf
1042; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1043; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1044; CHECK-SD-NEXT:    mov x0, v0.d[1]
1045; CHECK-SD-NEXT:    bl __floatunditf
1046; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1047; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
1048; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
1049; CHECK-SD-NEXT:    add sp, sp, #48
1050; CHECK-SD-NEXT:    ret
1051;
1052; CHECK-GI-LABEL: utofp_v2i64_v2f128:
1053; CHECK-GI:       // %bb.0: // %entry
1054; CHECK-GI-NEXT:    sub sp, sp, #32
1055; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
1056; CHECK-GI-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
1057; CHECK-GI-NEXT:    .cfi_def_cfa_offset 32
1058; CHECK-GI-NEXT:    .cfi_offset w30, -8
1059; CHECK-GI-NEXT:    .cfi_offset b8, -16
1060; CHECK-GI-NEXT:    fmov x0, d0
1061; CHECK-GI-NEXT:    mov d8, v0.d[1]
1062; CHECK-GI-NEXT:    bl __floatunditf
1063; CHECK-GI-NEXT:    fmov x0, d8
1064; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1065; CHECK-GI-NEXT:    bl __floatunditf
1066; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1067; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1068; CHECK-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
1069; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
1070; CHECK-GI-NEXT:    add sp, sp, #32
1071; CHECK-GI-NEXT:    ret
1072entry:
1073  %c = uitofp <2 x i64> %a to <2 x fp128>
1074  ret <2 x fp128> %c
1075}
1076
1077define <3 x fp128> @stofp_v3i64_v3f128(<3 x i64> %a) {
1078; CHECK-SD-LABEL: stofp_v3i64_v3f128:
1079; CHECK-SD:       // %bb.0: // %entry
1080; CHECK-SD-NEXT:    sub sp, sp, #64
1081; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1082; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1083; CHECK-SD-NEXT:    .cfi_offset w30, -16
1084; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1085; CHECK-SD-NEXT:    fmov x0, d0
1086; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1087; CHECK-SD-NEXT:    str q2, [sp, #32] // 16-byte Folded Spill
1088; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1089; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
1090; CHECK-SD-NEXT:    bl __floatditf
1091; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1092; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1093; CHECK-SD-NEXT:    fmov x0, d0
1094; CHECK-SD-NEXT:    bl __floatditf
1095; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1096; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1097; CHECK-SD-NEXT:    fmov x0, d0
1098; CHECK-SD-NEXT:    bl __floatditf
1099; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1100; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1101; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1102; CHECK-SD-NEXT:    add sp, sp, #64
1103; CHECK-SD-NEXT:    ret
1104;
1105; CHECK-GI-LABEL: stofp_v3i64_v3f128:
1106; CHECK-GI:       // %bb.0: // %entry
1107; CHECK-GI-NEXT:    sub sp, sp, #64
1108; CHECK-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
1109; CHECK-GI-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1110; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1111; CHECK-GI-NEXT:    .cfi_offset w30, -16
1112; CHECK-GI-NEXT:    .cfi_offset b8, -24
1113; CHECK-GI-NEXT:    .cfi_offset b9, -32
1114; CHECK-GI-NEXT:    fmov x0, d0
1115; CHECK-GI-NEXT:    fmov d8, d1
1116; CHECK-GI-NEXT:    fmov d9, d2
1117; CHECK-GI-NEXT:    bl __floatditf
1118; CHECK-GI-NEXT:    fmov x0, d8
1119; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1120; CHECK-GI-NEXT:    bl __floatditf
1121; CHECK-GI-NEXT:    fmov x0, d9
1122; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1123; CHECK-GI-NEXT:    bl __floatditf
1124; CHECK-GI-NEXT:    mov v2.16b, v0.16b
1125; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1126; CHECK-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
1127; CHECK-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1128; CHECK-GI-NEXT:    add sp, sp, #64
1129; CHECK-GI-NEXT:    ret
1130entry:
1131  %c = sitofp <3 x i64> %a to <3 x fp128>
1132  ret <3 x fp128> %c
1133}
1134
1135define <3 x fp128> @utofp_v3i64_v2f128(<3 x i64> %a) {
1136; CHECK-SD-LABEL: utofp_v3i64_v2f128:
1137; CHECK-SD:       // %bb.0: // %entry
1138; CHECK-SD-NEXT:    sub sp, sp, #64
1139; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1140; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1141; CHECK-SD-NEXT:    .cfi_offset w30, -16
1142; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1143; CHECK-SD-NEXT:    fmov x0, d0
1144; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1145; CHECK-SD-NEXT:    str q2, [sp, #32] // 16-byte Folded Spill
1146; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1147; CHECK-SD-NEXT:    str q1, [sp] // 16-byte Folded Spill
1148; CHECK-SD-NEXT:    bl __floatunditf
1149; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1150; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1151; CHECK-SD-NEXT:    fmov x0, d0
1152; CHECK-SD-NEXT:    bl __floatunditf
1153; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1154; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1155; CHECK-SD-NEXT:    fmov x0, d0
1156; CHECK-SD-NEXT:    bl __floatunditf
1157; CHECK-SD-NEXT:    mov v2.16b, v0.16b
1158; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1159; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1160; CHECK-SD-NEXT:    add sp, sp, #64
1161; CHECK-SD-NEXT:    ret
1162;
1163; CHECK-GI-LABEL: utofp_v3i64_v2f128:
1164; CHECK-GI:       // %bb.0: // %entry
1165; CHECK-GI-NEXT:    sub sp, sp, #64
1166; CHECK-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
1167; CHECK-GI-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1168; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1169; CHECK-GI-NEXT:    .cfi_offset w30, -16
1170; CHECK-GI-NEXT:    .cfi_offset b8, -24
1171; CHECK-GI-NEXT:    .cfi_offset b9, -32
1172; CHECK-GI-NEXT:    fmov x0, d0
1173; CHECK-GI-NEXT:    fmov d8, d1
1174; CHECK-GI-NEXT:    fmov d9, d2
1175; CHECK-GI-NEXT:    bl __floatunditf
1176; CHECK-GI-NEXT:    fmov x0, d8
1177; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1178; CHECK-GI-NEXT:    bl __floatunditf
1179; CHECK-GI-NEXT:    fmov x0, d9
1180; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1181; CHECK-GI-NEXT:    bl __floatunditf
1182; CHECK-GI-NEXT:    mov v2.16b, v0.16b
1183; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1184; CHECK-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
1185; CHECK-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1186; CHECK-GI-NEXT:    add sp, sp, #64
1187; CHECK-GI-NEXT:    ret
1188entry:
1189  %c = uitofp <3 x i64> %a to <3 x fp128>
1190  ret <3 x fp128> %c
1191}
1192
1193define <2 x double> @stofp_v2i128_v2f64(<2 x i128> %a) {
1194; CHECK-SD-LABEL: stofp_v2i128_v2f64:
1195; CHECK-SD:       // %bb.0: // %entry
1196; CHECK-SD-NEXT:    sub sp, sp, #48
1197; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1198; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
1199; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
1200; CHECK-SD-NEXT:    .cfi_offset w19, -8
1201; CHECK-SD-NEXT:    .cfi_offset w20, -16
1202; CHECK-SD-NEXT:    .cfi_offset w30, -32
1203; CHECK-SD-NEXT:    mov x19, x1
1204; CHECK-SD-NEXT:    mov x20, x0
1205; CHECK-SD-NEXT:    mov x0, x2
1206; CHECK-SD-NEXT:    mov x1, x3
1207; CHECK-SD-NEXT:    bl __floattidf
1208; CHECK-SD-NEXT:    mov x0, x20
1209; CHECK-SD-NEXT:    mov x1, x19
1210; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1211; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1212; CHECK-SD-NEXT:    bl __floattidf
1213; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1214; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1215; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1216; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1217; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1218; CHECK-SD-NEXT:    add sp, sp, #48
1219; CHECK-SD-NEXT:    ret
1220;
1221; CHECK-GI-LABEL: stofp_v2i128_v2f64:
1222; CHECK-GI:       // %bb.0: // %entry
1223; CHECK-GI-NEXT:    sub sp, sp, #48
1224; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1225; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
1226; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
1227; CHECK-GI-NEXT:    .cfi_offset w19, -8
1228; CHECK-GI-NEXT:    .cfi_offset w20, -16
1229; CHECK-GI-NEXT:    .cfi_offset w30, -32
1230; CHECK-GI-NEXT:    mov x19, x2
1231; CHECK-GI-NEXT:    mov x20, x3
1232; CHECK-GI-NEXT:    bl __floattidf
1233; CHECK-GI-NEXT:    mov x0, x19
1234; CHECK-GI-NEXT:    mov x1, x20
1235; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1236; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1237; CHECK-GI-NEXT:    bl __floattidf
1238; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1239; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1240; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1241; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1242; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
1243; CHECK-GI-NEXT:    mov v0.16b, v1.16b
1244; CHECK-GI-NEXT:    add sp, sp, #48
1245; CHECK-GI-NEXT:    ret
1246entry:
1247  %c = sitofp <2 x i128> %a to <2 x double>
1248  ret <2 x double> %c
1249}
1250
1251define <2 x double> @utofp_v2i128_v2f64(<2 x i128> %a) {
1252; CHECK-SD-LABEL: utofp_v2i128_v2f64:
1253; CHECK-SD:       // %bb.0: // %entry
1254; CHECK-SD-NEXT:    sub sp, sp, #48
1255; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1256; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
1257; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
1258; CHECK-SD-NEXT:    .cfi_offset w19, -8
1259; CHECK-SD-NEXT:    .cfi_offset w20, -16
1260; CHECK-SD-NEXT:    .cfi_offset w30, -32
1261; CHECK-SD-NEXT:    mov x19, x1
1262; CHECK-SD-NEXT:    mov x20, x0
1263; CHECK-SD-NEXT:    mov x0, x2
1264; CHECK-SD-NEXT:    mov x1, x3
1265; CHECK-SD-NEXT:    bl __floatuntidf
1266; CHECK-SD-NEXT:    mov x0, x20
1267; CHECK-SD-NEXT:    mov x1, x19
1268; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1269; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1270; CHECK-SD-NEXT:    bl __floatuntidf
1271; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1272; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1273; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1274; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1275; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1276; CHECK-SD-NEXT:    add sp, sp, #48
1277; CHECK-SD-NEXT:    ret
1278;
1279; CHECK-GI-LABEL: utofp_v2i128_v2f64:
1280; CHECK-GI:       // %bb.0: // %entry
1281; CHECK-GI-NEXT:    sub sp, sp, #48
1282; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1283; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
1284; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
1285; CHECK-GI-NEXT:    .cfi_offset w19, -8
1286; CHECK-GI-NEXT:    .cfi_offset w20, -16
1287; CHECK-GI-NEXT:    .cfi_offset w30, -32
1288; CHECK-GI-NEXT:    mov x19, x2
1289; CHECK-GI-NEXT:    mov x20, x3
1290; CHECK-GI-NEXT:    bl __floatuntidf
1291; CHECK-GI-NEXT:    mov x0, x19
1292; CHECK-GI-NEXT:    mov x1, x20
1293; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1294; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1295; CHECK-GI-NEXT:    bl __floatuntidf
1296; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1297; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1298; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
1299; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1300; CHECK-GI-NEXT:    mov v1.d[1], v0.d[0]
1301; CHECK-GI-NEXT:    mov v0.16b, v1.16b
1302; CHECK-GI-NEXT:    add sp, sp, #48
1303; CHECK-GI-NEXT:    ret
1304entry:
1305  %c = uitofp <2 x i128> %a to <2 x double>
1306  ret <2 x double> %c
1307}
1308
1309define <3 x double> @stofp_v3i128_v3f64(<3 x i128> %a) {
1310; CHECK-SD-LABEL: stofp_v3i128_v3f64:
1311; CHECK-SD:       // %bb.0: // %entry
1312; CHECK-SD-NEXT:    stp d9, d8, [sp, #-64]! // 16-byte Folded Spill
1313; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1314; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
1315; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
1316; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1317; CHECK-SD-NEXT:    .cfi_offset w19, -8
1318; CHECK-SD-NEXT:    .cfi_offset w20, -16
1319; CHECK-SD-NEXT:    .cfi_offset w21, -24
1320; CHECK-SD-NEXT:    .cfi_offset w22, -32
1321; CHECK-SD-NEXT:    .cfi_offset w30, -48
1322; CHECK-SD-NEXT:    .cfi_offset b8, -56
1323; CHECK-SD-NEXT:    .cfi_offset b9, -64
1324; CHECK-SD-NEXT:    mov x19, x5
1325; CHECK-SD-NEXT:    mov x20, x4
1326; CHECK-SD-NEXT:    mov x21, x3
1327; CHECK-SD-NEXT:    mov x22, x2
1328; CHECK-SD-NEXT:    bl __floattidf
1329; CHECK-SD-NEXT:    mov x0, x22
1330; CHECK-SD-NEXT:    mov x1, x21
1331; CHECK-SD-NEXT:    fmov d8, d0
1332; CHECK-SD-NEXT:    bl __floattidf
1333; CHECK-SD-NEXT:    mov x0, x20
1334; CHECK-SD-NEXT:    mov x1, x19
1335; CHECK-SD-NEXT:    fmov d9, d0
1336; CHECK-SD-NEXT:    bl __floattidf
1337; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
1338; CHECK-SD-NEXT:    fmov d2, d0
1339; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
1340; CHECK-SD-NEXT:    fmov d0, d8
1341; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1342; CHECK-SD-NEXT:    fmov d1, d9
1343; CHECK-SD-NEXT:    ldp d9, d8, [sp], #64 // 16-byte Folded Reload
1344; CHECK-SD-NEXT:    ret
1345;
1346; CHECK-GI-LABEL: stofp_v3i128_v3f64:
1347; CHECK-GI:       // %bb.0: // %entry
1348; CHECK-GI-NEXT:    stp d9, d8, [sp, #-64]! // 16-byte Folded Spill
1349; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1350; CHECK-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
1351; CHECK-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
1352; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1353; CHECK-GI-NEXT:    .cfi_offset w19, -8
1354; CHECK-GI-NEXT:    .cfi_offset w20, -16
1355; CHECK-GI-NEXT:    .cfi_offset w21, -24
1356; CHECK-GI-NEXT:    .cfi_offset w22, -32
1357; CHECK-GI-NEXT:    .cfi_offset w30, -48
1358; CHECK-GI-NEXT:    .cfi_offset b8, -56
1359; CHECK-GI-NEXT:    .cfi_offset b9, -64
1360; CHECK-GI-NEXT:    mov x19, x2
1361; CHECK-GI-NEXT:    mov x20, x3
1362; CHECK-GI-NEXT:    mov x21, x4
1363; CHECK-GI-NEXT:    mov x22, x5
1364; CHECK-GI-NEXT:    bl __floattidf
1365; CHECK-GI-NEXT:    mov x0, x19
1366; CHECK-GI-NEXT:    mov x1, x20
1367; CHECK-GI-NEXT:    fmov d8, d0
1368; CHECK-GI-NEXT:    bl __floattidf
1369; CHECK-GI-NEXT:    mov x0, x21
1370; CHECK-GI-NEXT:    mov x1, x22
1371; CHECK-GI-NEXT:    fmov d9, d0
1372; CHECK-GI-NEXT:    bl __floattidf
1373; CHECK-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
1374; CHECK-GI-NEXT:    fmov d2, d0
1375; CHECK-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
1376; CHECK-GI-NEXT:    fmov d0, d8
1377; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1378; CHECK-GI-NEXT:    fmov d1, d9
1379; CHECK-GI-NEXT:    ldp d9, d8, [sp], #64 // 16-byte Folded Reload
1380; CHECK-GI-NEXT:    ret
1381entry:
1382  %c = sitofp <3 x i128> %a to <3 x double>
1383  ret <3 x double> %c
1384}
1385
1386define <3 x double> @utofp_v3i128_v3f64(<3 x i128> %a) {
1387; CHECK-SD-LABEL: utofp_v3i128_v3f64:
1388; CHECK-SD:       // %bb.0: // %entry
1389; CHECK-SD-NEXT:    stp d9, d8, [sp, #-64]! // 16-byte Folded Spill
1390; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1391; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
1392; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
1393; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1394; CHECK-SD-NEXT:    .cfi_offset w19, -8
1395; CHECK-SD-NEXT:    .cfi_offset w20, -16
1396; CHECK-SD-NEXT:    .cfi_offset w21, -24
1397; CHECK-SD-NEXT:    .cfi_offset w22, -32
1398; CHECK-SD-NEXT:    .cfi_offset w30, -48
1399; CHECK-SD-NEXT:    .cfi_offset b8, -56
1400; CHECK-SD-NEXT:    .cfi_offset b9, -64
1401; CHECK-SD-NEXT:    mov x19, x5
1402; CHECK-SD-NEXT:    mov x20, x4
1403; CHECK-SD-NEXT:    mov x21, x3
1404; CHECK-SD-NEXT:    mov x22, x2
1405; CHECK-SD-NEXT:    bl __floatuntidf
1406; CHECK-SD-NEXT:    mov x0, x22
1407; CHECK-SD-NEXT:    mov x1, x21
1408; CHECK-SD-NEXT:    fmov d8, d0
1409; CHECK-SD-NEXT:    bl __floatuntidf
1410; CHECK-SD-NEXT:    mov x0, x20
1411; CHECK-SD-NEXT:    mov x1, x19
1412; CHECK-SD-NEXT:    fmov d9, d0
1413; CHECK-SD-NEXT:    bl __floatuntidf
1414; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
1415; CHECK-SD-NEXT:    fmov d2, d0
1416; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
1417; CHECK-SD-NEXT:    fmov d0, d8
1418; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1419; CHECK-SD-NEXT:    fmov d1, d9
1420; CHECK-SD-NEXT:    ldp d9, d8, [sp], #64 // 16-byte Folded Reload
1421; CHECK-SD-NEXT:    ret
1422;
1423; CHECK-GI-LABEL: utofp_v3i128_v3f64:
1424; CHECK-GI:       // %bb.0: // %entry
1425; CHECK-GI-NEXT:    stp d9, d8, [sp, #-64]! // 16-byte Folded Spill
1426; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1427; CHECK-GI-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
1428; CHECK-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
1429; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1430; CHECK-GI-NEXT:    .cfi_offset w19, -8
1431; CHECK-GI-NEXT:    .cfi_offset w20, -16
1432; CHECK-GI-NEXT:    .cfi_offset w21, -24
1433; CHECK-GI-NEXT:    .cfi_offset w22, -32
1434; CHECK-GI-NEXT:    .cfi_offset w30, -48
1435; CHECK-GI-NEXT:    .cfi_offset b8, -56
1436; CHECK-GI-NEXT:    .cfi_offset b9, -64
1437; CHECK-GI-NEXT:    mov x19, x2
1438; CHECK-GI-NEXT:    mov x20, x3
1439; CHECK-GI-NEXT:    mov x21, x4
1440; CHECK-GI-NEXT:    mov x22, x5
1441; CHECK-GI-NEXT:    bl __floatuntidf
1442; CHECK-GI-NEXT:    mov x0, x19
1443; CHECK-GI-NEXT:    mov x1, x20
1444; CHECK-GI-NEXT:    fmov d8, d0
1445; CHECK-GI-NEXT:    bl __floatuntidf
1446; CHECK-GI-NEXT:    mov x0, x21
1447; CHECK-GI-NEXT:    mov x1, x22
1448; CHECK-GI-NEXT:    fmov d9, d0
1449; CHECK-GI-NEXT:    bl __floatuntidf
1450; CHECK-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
1451; CHECK-GI-NEXT:    fmov d2, d0
1452; CHECK-GI-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
1453; CHECK-GI-NEXT:    fmov d0, d8
1454; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1455; CHECK-GI-NEXT:    fmov d1, d9
1456; CHECK-GI-NEXT:    ldp d9, d8, [sp], #64 // 16-byte Folded Reload
1457; CHECK-GI-NEXT:    ret
1458entry:
1459  %c = uitofp <3 x i128> %a to <3 x double>
1460  ret <3 x double> %c
1461}
1462
1463define <2 x double> @stofp_v2i64_v2f64(<2 x i64> %a) {
1464; CHECK-LABEL: stofp_v2i64_v2f64:
1465; CHECK:       // %bb.0: // %entry
1466; CHECK-NEXT:    scvtf v0.2d, v0.2d
1467; CHECK-NEXT:    ret
1468entry:
1469  %c = sitofp <2 x i64> %a to <2 x double>
1470  ret <2 x double> %c
1471}
1472
1473define <2 x double> @utofp_v2i64_v2f64(<2 x i64> %a) {
1474; CHECK-LABEL: utofp_v2i64_v2f64:
1475; CHECK:       // %bb.0: // %entry
1476; CHECK-NEXT:    ucvtf v0.2d, v0.2d
1477; CHECK-NEXT:    ret
1478entry:
1479  %c = uitofp <2 x i64> %a to <2 x double>
1480  ret <2 x double> %c
1481}
1482
1483define <3 x double> @stofp_v3i64_v3f64(<3 x i64> %a) {
1484; CHECK-SD-LABEL: stofp_v3i64_v3f64:
1485; CHECK-SD:       // %bb.0: // %entry
1486; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1487; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1488; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1489; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1490; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
1491; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1492; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
1493; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1494; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1495; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1496; CHECK-SD-NEXT:    ret
1497;
1498; CHECK-GI-LABEL: stofp_v3i64_v3f64:
1499; CHECK-GI:       // %bb.0: // %entry
1500; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1501; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1502; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
1503; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1504; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
1505; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
1506; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
1507; CHECK-GI-NEXT:    mov d1, v0.d[1]
1508; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1509; CHECK-GI-NEXT:    ret
1510entry:
1511  %c = sitofp <3 x i64> %a to <3 x double>
1512  ret <3 x double> %c
1513}
1514
1515define <3 x double> @utofp_v3i64_v3f64(<3 x i64> %a) {
1516; CHECK-SD-LABEL: utofp_v3i64_v3f64:
1517; CHECK-SD:       // %bb.0: // %entry
1518; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1519; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1520; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1521; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1522; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
1523; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
1524; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
1525; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1526; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1527; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1528; CHECK-SD-NEXT:    ret
1529;
1530; CHECK-GI-LABEL: utofp_v3i64_v3f64:
1531; CHECK-GI:       // %bb.0: // %entry
1532; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1533; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1534; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
1535; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1536; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
1537; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
1538; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
1539; CHECK-GI-NEXT:    mov d1, v0.d[1]
1540; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1541; CHECK-GI-NEXT:    ret
1542entry:
1543  %c = uitofp <3 x i64> %a to <3 x double>
1544  ret <3 x double> %c
1545}
1546
1547define <4 x double> @stofp_v4i64_v4f64(<4 x i64> %a) {
1548; CHECK-LABEL: stofp_v4i64_v4f64:
1549; CHECK:       // %bb.0: // %entry
1550; CHECK-NEXT:    scvtf v0.2d, v0.2d
1551; CHECK-NEXT:    scvtf v1.2d, v1.2d
1552; CHECK-NEXT:    ret
1553entry:
1554  %c = sitofp <4 x i64> %a to <4 x double>
1555  ret <4 x double> %c
1556}
1557
1558define <4 x double> @utofp_v4i64_v4f64(<4 x i64> %a) {
1559; CHECK-LABEL: utofp_v4i64_v4f64:
1560; CHECK:       // %bb.0: // %entry
1561; CHECK-NEXT:    ucvtf v0.2d, v0.2d
1562; CHECK-NEXT:    ucvtf v1.2d, v1.2d
1563; CHECK-NEXT:    ret
1564entry:
1565  %c = uitofp <4 x i64> %a to <4 x double>
1566  ret <4 x double> %c
1567}
1568
1569define <8 x double> @stofp_v8i64_v8f64(<8 x i64> %a) {
1570; CHECK-LABEL: stofp_v8i64_v8f64:
1571; CHECK:       // %bb.0: // %entry
1572; CHECK-NEXT:    scvtf v0.2d, v0.2d
1573; CHECK-NEXT:    scvtf v1.2d, v1.2d
1574; CHECK-NEXT:    scvtf v2.2d, v2.2d
1575; CHECK-NEXT:    scvtf v3.2d, v3.2d
1576; CHECK-NEXT:    ret
1577entry:
1578  %c = sitofp <8 x i64> %a to <8 x double>
1579  ret <8 x double> %c
1580}
1581
1582define <8 x double> @utofp_v8i64_v8f64(<8 x i64> %a) {
1583; CHECK-LABEL: utofp_v8i64_v8f64:
1584; CHECK:       // %bb.0: // %entry
1585; CHECK-NEXT:    ucvtf v0.2d, v0.2d
1586; CHECK-NEXT:    ucvtf v1.2d, v1.2d
1587; CHECK-NEXT:    ucvtf v2.2d, v2.2d
1588; CHECK-NEXT:    ucvtf v3.2d, v3.2d
1589; CHECK-NEXT:    ret
1590entry:
1591  %c = uitofp <8 x i64> %a to <8 x double>
1592  ret <8 x double> %c
1593}
1594
1595define <16 x double> @stofp_v16i64_v16f64(<16 x i64> %a) {
1596; CHECK-LABEL: stofp_v16i64_v16f64:
1597; CHECK:       // %bb.0: // %entry
1598; CHECK-NEXT:    scvtf v0.2d, v0.2d
1599; CHECK-NEXT:    scvtf v1.2d, v1.2d
1600; CHECK-NEXT:    scvtf v2.2d, v2.2d
1601; CHECK-NEXT:    scvtf v3.2d, v3.2d
1602; CHECK-NEXT:    scvtf v4.2d, v4.2d
1603; CHECK-NEXT:    scvtf v5.2d, v5.2d
1604; CHECK-NEXT:    scvtf v6.2d, v6.2d
1605; CHECK-NEXT:    scvtf v7.2d, v7.2d
1606; CHECK-NEXT:    ret
1607entry:
1608  %c = sitofp <16 x i64> %a to <16 x double>
1609  ret <16 x double> %c
1610}
1611
1612define <16 x double> @utofp_v16i64_v16f64(<16 x i64> %a) {
1613; CHECK-LABEL: utofp_v16i64_v16f64:
1614; CHECK:       // %bb.0: // %entry
1615; CHECK-NEXT:    ucvtf v0.2d, v0.2d
1616; CHECK-NEXT:    ucvtf v1.2d, v1.2d
1617; CHECK-NEXT:    ucvtf v2.2d, v2.2d
1618; CHECK-NEXT:    ucvtf v3.2d, v3.2d
1619; CHECK-NEXT:    ucvtf v4.2d, v4.2d
1620; CHECK-NEXT:    ucvtf v5.2d, v5.2d
1621; CHECK-NEXT:    ucvtf v6.2d, v6.2d
1622; CHECK-NEXT:    ucvtf v7.2d, v7.2d
1623; CHECK-NEXT:    ret
1624entry:
1625  %c = uitofp <16 x i64> %a to <16 x double>
1626  ret <16 x double> %c
1627}
1628
1629define <32 x double> @stofp_v32i64_v32f64(<32 x i64> %a) {
1630; CHECK-SD-LABEL: stofp_v32i64_v32f64:
1631; CHECK-SD:       // %bb.0: // %entry
1632; CHECK-SD-NEXT:    ldp q17, q16, [sp, #96]
1633; CHECK-SD-NEXT:    scvtf v7.2d, v7.2d
1634; CHECK-SD-NEXT:    ldp q19, q18, [sp, #64]
1635; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
1636; CHECK-SD-NEXT:    ldp q21, q20, [sp, #32]
1637; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
1638; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
1639; CHECK-SD-NEXT:    scvtf v17.2d, v17.2d
1640; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
1641; CHECK-SD-NEXT:    scvtf v18.2d, v18.2d
1642; CHECK-SD-NEXT:    scvtf v19.2d, v19.2d
1643; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
1644; CHECK-SD-NEXT:    scvtf v20.2d, v20.2d
1645; CHECK-SD-NEXT:    scvtf v21.2d, v21.2d
1646; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
1647; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
1648; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
1649; CHECK-SD-NEXT:    stp q5, q6, [x8, #80]
1650; CHECK-SD-NEXT:    str q16, [x8, #240]
1651; CHECK-SD-NEXT:    ldp q22, q16, [sp]
1652; CHECK-SD-NEXT:    stp q3, q4, [x8, #48]
1653; CHECK-SD-NEXT:    stp q20, q19, [x8, #176]
1654; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
1655; CHECK-SD-NEXT:    stp q1, q2, [x8, #16]
1656; CHECK-SD-NEXT:    stp q18, q17, [x8, #208]
1657; CHECK-SD-NEXT:    scvtf v17.2d, v22.2d
1658; CHECK-SD-NEXT:    str q0, [x8]
1659; CHECK-SD-NEXT:    stp q16, q21, [x8, #144]
1660; CHECK-SD-NEXT:    stp q7, q17, [x8, #112]
1661; CHECK-SD-NEXT:    ret
1662;
1663; CHECK-GI-LABEL: stofp_v32i64_v32f64:
1664; CHECK-GI:       // %bb.0: // %entry
1665; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
1666; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
1667; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
1668; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
1669; CHECK-GI-NEXT:    scvtf v4.2d, v4.2d
1670; CHECK-GI-NEXT:    stp q0, q1, [x8]
1671; CHECK-GI-NEXT:    scvtf v0.2d, v5.2d
1672; CHECK-GI-NEXT:    scvtf v1.2d, v6.2d
1673; CHECK-GI-NEXT:    str q2, [x8, #32]
1674; CHECK-GI-NEXT:    ldp q2, q5, [sp]
1675; CHECK-GI-NEXT:    scvtf v6.2d, v7.2d
1676; CHECK-GI-NEXT:    stp q3, q4, [x8, #48]
1677; CHECK-GI-NEXT:    ldp q3, q4, [sp, #32]
1678; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
1679; CHECK-GI-NEXT:    scvtf v5.2d, v5.2d
1680; CHECK-GI-NEXT:    stp q0, q1, [x8, #80]
1681; CHECK-GI-NEXT:    scvtf v0.2d, v3.2d
1682; CHECK-GI-NEXT:    ldp q1, q3, [sp, #64]
1683; CHECK-GI-NEXT:    scvtf v4.2d, v4.2d
1684; CHECK-GI-NEXT:    stp q6, q2, [x8, #112]
1685; CHECK-GI-NEXT:    ldp q2, q6, [sp, #96]
1686; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
1687; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
1688; CHECK-GI-NEXT:    stp q5, q0, [x8, #144]
1689; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
1690; CHECK-GI-NEXT:    scvtf v0.2d, v6.2d
1691; CHECK-GI-NEXT:    stp q4, q1, [x8, #176]
1692; CHECK-GI-NEXT:    stp q3, q2, [x8, #208]
1693; CHECK-GI-NEXT:    str q0, [x8, #240]
1694; CHECK-GI-NEXT:    ret
1695entry:
1696  %c = sitofp <32 x i64> %a to <32 x double>
1697  ret <32 x double> %c
1698}
1699
1700define <32 x double> @utofp_v32i64_v32f64(<32 x i64> %a) {
1701; CHECK-SD-LABEL: utofp_v32i64_v32f64:
1702; CHECK-SD:       // %bb.0: // %entry
1703; CHECK-SD-NEXT:    ldp q17, q16, [sp, #96]
1704; CHECK-SD-NEXT:    ucvtf v7.2d, v7.2d
1705; CHECK-SD-NEXT:    ldp q19, q18, [sp, #64]
1706; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
1707; CHECK-SD-NEXT:    ldp q21, q20, [sp, #32]
1708; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
1709; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
1710; CHECK-SD-NEXT:    ucvtf v17.2d, v17.2d
1711; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
1712; CHECK-SD-NEXT:    ucvtf v18.2d, v18.2d
1713; CHECK-SD-NEXT:    ucvtf v19.2d, v19.2d
1714; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
1715; CHECK-SD-NEXT:    ucvtf v20.2d, v20.2d
1716; CHECK-SD-NEXT:    ucvtf v21.2d, v21.2d
1717; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
1718; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
1719; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
1720; CHECK-SD-NEXT:    stp q5, q6, [x8, #80]
1721; CHECK-SD-NEXT:    str q16, [x8, #240]
1722; CHECK-SD-NEXT:    ldp q22, q16, [sp]
1723; CHECK-SD-NEXT:    stp q3, q4, [x8, #48]
1724; CHECK-SD-NEXT:    stp q20, q19, [x8, #176]
1725; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
1726; CHECK-SD-NEXT:    stp q1, q2, [x8, #16]
1727; CHECK-SD-NEXT:    stp q18, q17, [x8, #208]
1728; CHECK-SD-NEXT:    ucvtf v17.2d, v22.2d
1729; CHECK-SD-NEXT:    str q0, [x8]
1730; CHECK-SD-NEXT:    stp q16, q21, [x8, #144]
1731; CHECK-SD-NEXT:    stp q7, q17, [x8, #112]
1732; CHECK-SD-NEXT:    ret
1733;
1734; CHECK-GI-LABEL: utofp_v32i64_v32f64:
1735; CHECK-GI:       // %bb.0: // %entry
1736; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
1737; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
1738; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
1739; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
1740; CHECK-GI-NEXT:    ucvtf v4.2d, v4.2d
1741; CHECK-GI-NEXT:    stp q0, q1, [x8]
1742; CHECK-GI-NEXT:    ucvtf v0.2d, v5.2d
1743; CHECK-GI-NEXT:    ucvtf v1.2d, v6.2d
1744; CHECK-GI-NEXT:    str q2, [x8, #32]
1745; CHECK-GI-NEXT:    ldp q2, q5, [sp]
1746; CHECK-GI-NEXT:    ucvtf v6.2d, v7.2d
1747; CHECK-GI-NEXT:    stp q3, q4, [x8, #48]
1748; CHECK-GI-NEXT:    ldp q3, q4, [sp, #32]
1749; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
1750; CHECK-GI-NEXT:    ucvtf v5.2d, v5.2d
1751; CHECK-GI-NEXT:    stp q0, q1, [x8, #80]
1752; CHECK-GI-NEXT:    ucvtf v0.2d, v3.2d
1753; CHECK-GI-NEXT:    ldp q1, q3, [sp, #64]
1754; CHECK-GI-NEXT:    ucvtf v4.2d, v4.2d
1755; CHECK-GI-NEXT:    stp q6, q2, [x8, #112]
1756; CHECK-GI-NEXT:    ldp q2, q6, [sp, #96]
1757; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
1758; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
1759; CHECK-GI-NEXT:    stp q5, q0, [x8, #144]
1760; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
1761; CHECK-GI-NEXT:    ucvtf v0.2d, v6.2d
1762; CHECK-GI-NEXT:    stp q4, q1, [x8, #176]
1763; CHECK-GI-NEXT:    stp q3, q2, [x8, #208]
1764; CHECK-GI-NEXT:    str q0, [x8, #240]
1765; CHECK-GI-NEXT:    ret
1766entry:
1767  %c = uitofp <32 x i64> %a to <32 x double>
1768  ret <32 x double> %c
1769}
1770
1771define <2 x fp128> @stofp_v2i32_v2f128(<2 x i32> %a) {
1772; CHECK-SD-LABEL: stofp_v2i32_v2f128:
1773; CHECK-SD:       // %bb.0: // %entry
1774; CHECK-SD-NEXT:    sub sp, sp, #32
1775; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1776; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1777; CHECK-SD-NEXT:    .cfi_offset w30, -16
1778; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1779; CHECK-SD-NEXT:    fmov w0, s0
1780; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1781; CHECK-SD-NEXT:    bl __floatsitf
1782; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1783; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1784; CHECK-SD-NEXT:    mov w0, v1.s[1]
1785; CHECK-SD-NEXT:    bl __floatsitf
1786; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1787; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1788; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1789; CHECK-SD-NEXT:    add sp, sp, #32
1790; CHECK-SD-NEXT:    ret
1791;
1792; CHECK-GI-LABEL: stofp_v2i32_v2f128:
1793; CHECK-GI:       // %bb.0: // %entry
1794; CHECK-GI-NEXT:    sub sp, sp, #32
1795; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
1796; CHECK-GI-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
1797; CHECK-GI-NEXT:    .cfi_def_cfa_offset 32
1798; CHECK-GI-NEXT:    .cfi_offset w30, -8
1799; CHECK-GI-NEXT:    .cfi_offset b8, -16
1800; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1801; CHECK-GI-NEXT:    fmov w0, s0
1802; CHECK-GI-NEXT:    mov s8, v0.s[1]
1803; CHECK-GI-NEXT:    bl __floatsitf
1804; CHECK-GI-NEXT:    fmov w0, s8
1805; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1806; CHECK-GI-NEXT:    bl __floatsitf
1807; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1808; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1809; CHECK-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
1810; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
1811; CHECK-GI-NEXT:    add sp, sp, #32
1812; CHECK-GI-NEXT:    ret
1813entry:
1814  %c = sitofp <2 x i32> %a to <2 x fp128>
1815  ret <2 x fp128> %c
1816}
1817
1818define <2 x fp128> @utofp_v2i32_v2f128(<2 x i32> %a) {
1819; CHECK-SD-LABEL: utofp_v2i32_v2f128:
1820; CHECK-SD:       // %bb.0: // %entry
1821; CHECK-SD-NEXT:    sub sp, sp, #32
1822; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
1823; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1824; CHECK-SD-NEXT:    .cfi_offset w30, -16
1825; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1826; CHECK-SD-NEXT:    fmov w0, s0
1827; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1828; CHECK-SD-NEXT:    bl __floatunsitf
1829; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
1830; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1831; CHECK-SD-NEXT:    mov w0, v1.s[1]
1832; CHECK-SD-NEXT:    bl __floatunsitf
1833; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1834; CHECK-SD-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1835; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
1836; CHECK-SD-NEXT:    add sp, sp, #32
1837; CHECK-SD-NEXT:    ret
1838;
1839; CHECK-GI-LABEL: utofp_v2i32_v2f128:
1840; CHECK-GI:       // %bb.0: // %entry
1841; CHECK-GI-NEXT:    sub sp, sp, #32
1842; CHECK-GI-NEXT:    str d8, [sp, #16] // 8-byte Folded Spill
1843; CHECK-GI-NEXT:    str x30, [sp, #24] // 8-byte Folded Spill
1844; CHECK-GI-NEXT:    .cfi_def_cfa_offset 32
1845; CHECK-GI-NEXT:    .cfi_offset w30, -8
1846; CHECK-GI-NEXT:    .cfi_offset b8, -16
1847; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1848; CHECK-GI-NEXT:    fmov w0, s0
1849; CHECK-GI-NEXT:    mov s8, v0.s[1]
1850; CHECK-GI-NEXT:    bl __floatunsitf
1851; CHECK-GI-NEXT:    fmov w0, s8
1852; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1853; CHECK-GI-NEXT:    bl __floatunsitf
1854; CHECK-GI-NEXT:    mov v1.16b, v0.16b
1855; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
1856; CHECK-GI-NEXT:    ldr x30, [sp, #24] // 8-byte Folded Reload
1857; CHECK-GI-NEXT:    ldr d8, [sp, #16] // 8-byte Folded Reload
1858; CHECK-GI-NEXT:    add sp, sp, #32
1859; CHECK-GI-NEXT:    ret
1860entry:
1861  %c = uitofp <2 x i32> %a to <2 x fp128>
1862  ret <2 x fp128> %c
1863}
1864
1865define <3 x fp128> @stofp_v3i32_v3f128(<3 x i32> %a) {
1866; CHECK-SD-LABEL: stofp_v3i32_v3f128:
1867; CHECK-SD:       // %bb.0: // %entry
1868; CHECK-SD-NEXT:    sub sp, sp, #64
1869; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1870; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1871; CHECK-SD-NEXT:    .cfi_offset w30, -16
1872; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1873; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1874; CHECK-SD-NEXT:    fmov w0, s1
1875; CHECK-SD-NEXT:    bl __floatsitf
1876; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1877; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1878; CHECK-SD-NEXT:    fmov w0, s0
1879; CHECK-SD-NEXT:    bl __floatsitf
1880; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1881; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1882; CHECK-SD-NEXT:    mov w0, v0.s[1]
1883; CHECK-SD-NEXT:    bl __floatsitf
1884; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1885; CHECK-SD-NEXT:    ldp q0, q2, [sp] // 32-byte Folded Reload
1886; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1887; CHECK-SD-NEXT:    add sp, sp, #64
1888; CHECK-SD-NEXT:    ret
1889;
1890; CHECK-GI-LABEL: stofp_v3i32_v3f128:
1891; CHECK-GI:       // %bb.0: // %entry
1892; CHECK-GI-NEXT:    sub sp, sp, #64
1893; CHECK-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
1894; CHECK-GI-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1895; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1896; CHECK-GI-NEXT:    .cfi_offset w30, -16
1897; CHECK-GI-NEXT:    .cfi_offset b8, -24
1898; CHECK-GI-NEXT:    .cfi_offset b9, -32
1899; CHECK-GI-NEXT:    fmov w0, s0
1900; CHECK-GI-NEXT:    mov s8, v0.s[1]
1901; CHECK-GI-NEXT:    mov s9, v0.s[2]
1902; CHECK-GI-NEXT:    bl __floatsitf
1903; CHECK-GI-NEXT:    fmov w0, s8
1904; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1905; CHECK-GI-NEXT:    bl __floatsitf
1906; CHECK-GI-NEXT:    fmov w0, s9
1907; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1908; CHECK-GI-NEXT:    bl __floatsitf
1909; CHECK-GI-NEXT:    mov v2.16b, v0.16b
1910; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1911; CHECK-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
1912; CHECK-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1913; CHECK-GI-NEXT:    add sp, sp, #64
1914; CHECK-GI-NEXT:    ret
1915entry:
1916  %c = sitofp <3 x i32> %a to <3 x fp128>
1917  ret <3 x fp128> %c
1918}
1919
1920define <3 x fp128> @utofp_v3i32_v3f128(<3 x i32> %a) {
1921; CHECK-SD-LABEL: utofp_v3i32_v3f128:
1922; CHECK-SD:       // %bb.0: // %entry
1923; CHECK-SD-NEXT:    sub sp, sp, #64
1924; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1925; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
1926; CHECK-SD-NEXT:    .cfi_offset w30, -16
1927; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1928; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
1929; CHECK-SD-NEXT:    fmov w0, s1
1930; CHECK-SD-NEXT:    bl __floatunsitf
1931; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1932; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1933; CHECK-SD-NEXT:    fmov w0, s0
1934; CHECK-SD-NEXT:    bl __floatunsitf
1935; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
1936; CHECK-SD-NEXT:    ldr q0, [sp, #32] // 16-byte Folded Reload
1937; CHECK-SD-NEXT:    mov w0, v0.s[1]
1938; CHECK-SD-NEXT:    bl __floatunsitf
1939; CHECK-SD-NEXT:    mov v1.16b, v0.16b
1940; CHECK-SD-NEXT:    ldp q0, q2, [sp] // 32-byte Folded Reload
1941; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1942; CHECK-SD-NEXT:    add sp, sp, #64
1943; CHECK-SD-NEXT:    ret
1944;
1945; CHECK-GI-LABEL: utofp_v3i32_v3f128:
1946; CHECK-GI:       // %bb.0: // %entry
1947; CHECK-GI-NEXT:    sub sp, sp, #64
1948; CHECK-GI-NEXT:    stp d9, d8, [sp, #32] // 16-byte Folded Spill
1949; CHECK-GI-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
1950; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
1951; CHECK-GI-NEXT:    .cfi_offset w30, -16
1952; CHECK-GI-NEXT:    .cfi_offset b8, -24
1953; CHECK-GI-NEXT:    .cfi_offset b9, -32
1954; CHECK-GI-NEXT:    fmov w0, s0
1955; CHECK-GI-NEXT:    mov s8, v0.s[1]
1956; CHECK-GI-NEXT:    mov s9, v0.s[2]
1957; CHECK-GI-NEXT:    bl __floatunsitf
1958; CHECK-GI-NEXT:    fmov w0, s8
1959; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
1960; CHECK-GI-NEXT:    bl __floatunsitf
1961; CHECK-GI-NEXT:    fmov w0, s9
1962; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
1963; CHECK-GI-NEXT:    bl __floatunsitf
1964; CHECK-GI-NEXT:    mov v2.16b, v0.16b
1965; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
1966; CHECK-GI-NEXT:    ldp d9, d8, [sp, #32] // 16-byte Folded Reload
1967; CHECK-GI-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
1968; CHECK-GI-NEXT:    add sp, sp, #64
1969; CHECK-GI-NEXT:    ret
1970entry:
1971  %c = uitofp <3 x i32> %a to <3 x fp128>
1972  ret <3 x fp128> %c
1973}
1974
1975define <2 x double> @stofp_v2i32_v2f64(<2 x i32> %a) {
1976; CHECK-LABEL: stofp_v2i32_v2f64:
1977; CHECK:       // %bb.0: // %entry
1978; CHECK-NEXT:    sshll v0.2d, v0.2s, #0
1979; CHECK-NEXT:    scvtf v0.2d, v0.2d
1980; CHECK-NEXT:    ret
1981entry:
1982  %c = sitofp <2 x i32> %a to <2 x double>
1983  ret <2 x double> %c
1984}
1985
1986define <2 x double> @utofp_v2i32_v2f64(<2 x i32> %a) {
1987; CHECK-LABEL: utofp_v2i32_v2f64:
1988; CHECK:       // %bb.0: // %entry
1989; CHECK-NEXT:    ushll v0.2d, v0.2s, #0
1990; CHECK-NEXT:    ucvtf v0.2d, v0.2d
1991; CHECK-NEXT:    ret
1992entry:
1993  %c = uitofp <2 x i32> %a to <2 x double>
1994  ret <2 x double> %c
1995}
1996
1997define <3 x double> @stofp_v3i32_v3f64(<3 x i32> %a) {
1998; CHECK-SD-LABEL: stofp_v3i32_v3f64:
1999; CHECK-SD:       // %bb.0: // %entry
2000; CHECK-SD-NEXT:    sshll v1.2d, v0.2s, #0
2001; CHECK-SD-NEXT:    sshll2 v0.2d, v0.4s, #0
2002; CHECK-SD-NEXT:    scvtf v3.2d, v1.2d
2003; CHECK-SD-NEXT:    scvtf v2.2d, v0.2d
2004; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2005; CHECK-SD-NEXT:    fmov d0, d3
2006; CHECK-SD-NEXT:    ext v1.16b, v3.16b, v3.16b, #8
2007; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2008; CHECK-SD-NEXT:    ret
2009;
2010; CHECK-GI-LABEL: stofp_v3i32_v3f64:
2011; CHECK-GI:       // %bb.0: // %entry
2012; CHECK-GI-NEXT:    sshll v1.2d, v0.2s, #0
2013; CHECK-GI-NEXT:    sshll2 v0.2d, v0.4s, #0
2014; CHECK-GI-NEXT:    scvtf v3.2d, v1.2d
2015; CHECK-GI-NEXT:    scvtf v2.2d, v0.2d
2016; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
2017; CHECK-GI-NEXT:    mov d1, v3.d[1]
2018; CHECK-GI-NEXT:    fmov d0, d3
2019; CHECK-GI-NEXT:    ret
2020entry:
2021  %c = sitofp <3 x i32> %a to <3 x double>
2022  ret <3 x double> %c
2023}
2024
2025define <3 x double> @utofp_v3i32_v3f64(<3 x i32> %a) {
2026; CHECK-SD-LABEL: utofp_v3i32_v3f64:
2027; CHECK-SD:       // %bb.0: // %entry
2028; CHECK-SD-NEXT:    ushll v1.2d, v0.2s, #0
2029; CHECK-SD-NEXT:    ushll2 v0.2d, v0.4s, #0
2030; CHECK-SD-NEXT:    ucvtf v3.2d, v1.2d
2031; CHECK-SD-NEXT:    ucvtf v2.2d, v0.2d
2032; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2033; CHECK-SD-NEXT:    fmov d0, d3
2034; CHECK-SD-NEXT:    ext v1.16b, v3.16b, v3.16b, #8
2035; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2036; CHECK-SD-NEXT:    ret
2037;
2038; CHECK-GI-LABEL: utofp_v3i32_v3f64:
2039; CHECK-GI:       // %bb.0: // %entry
2040; CHECK-GI-NEXT:    ushll v1.2d, v0.2s, #0
2041; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
2042; CHECK-GI-NEXT:    ucvtf v3.2d, v1.2d
2043; CHECK-GI-NEXT:    ucvtf v2.2d, v0.2d
2044; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
2045; CHECK-GI-NEXT:    mov d1, v3.d[1]
2046; CHECK-GI-NEXT:    fmov d0, d3
2047; CHECK-GI-NEXT:    ret
2048entry:
2049  %c = uitofp <3 x i32> %a to <3 x double>
2050  ret <3 x double> %c
2051}
2052
2053define <4 x double> @stofp_v4i32_v4f64(<4 x i32> %a) {
2054; CHECK-SD-LABEL: stofp_v4i32_v4f64:
2055; CHECK-SD:       // %bb.0: // %entry
2056; CHECK-SD-NEXT:    sshll2 v1.2d, v0.4s, #0
2057; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2058; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
2059; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2060; CHECK-SD-NEXT:    ret
2061;
2062; CHECK-GI-LABEL: stofp_v4i32_v4f64:
2063; CHECK-GI:       // %bb.0: // %entry
2064; CHECK-GI-NEXT:    sshll v1.2d, v0.2s, #0
2065; CHECK-GI-NEXT:    sshll2 v2.2d, v0.4s, #0
2066; CHECK-GI-NEXT:    scvtf v0.2d, v1.2d
2067; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
2068; CHECK-GI-NEXT:    ret
2069entry:
2070  %c = sitofp <4 x i32> %a to <4 x double>
2071  ret <4 x double> %c
2072}
2073
2074define <4 x double> @utofp_v4i32_v4f64(<4 x i32> %a) {
2075; CHECK-SD-LABEL: utofp_v4i32_v4f64:
2076; CHECK-SD:       // %bb.0: // %entry
2077; CHECK-SD-NEXT:    ushll2 v1.2d, v0.4s, #0
2078; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
2079; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
2080; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2081; CHECK-SD-NEXT:    ret
2082;
2083; CHECK-GI-LABEL: utofp_v4i32_v4f64:
2084; CHECK-GI:       // %bb.0: // %entry
2085; CHECK-GI-NEXT:    ushll v1.2d, v0.2s, #0
2086; CHECK-GI-NEXT:    ushll2 v2.2d, v0.4s, #0
2087; CHECK-GI-NEXT:    ucvtf v0.2d, v1.2d
2088; CHECK-GI-NEXT:    ucvtf v1.2d, v2.2d
2089; CHECK-GI-NEXT:    ret
2090entry:
2091  %c = uitofp <4 x i32> %a to <4 x double>
2092  ret <4 x double> %c
2093}
2094
2095define <8 x double> @stofp_v8i32_v8f64(<8 x i32> %a) {
2096; CHECK-SD-LABEL: stofp_v8i32_v8f64:
2097; CHECK-SD:       // %bb.0: // %entry
2098; CHECK-SD-NEXT:    sshll v2.2d, v0.2s, #0
2099; CHECK-SD-NEXT:    sshll2 v3.2d, v0.4s, #0
2100; CHECK-SD-NEXT:    sshll2 v4.2d, v1.4s, #0
2101; CHECK-SD-NEXT:    sshll v5.2d, v1.2s, #0
2102; CHECK-SD-NEXT:    scvtf v0.2d, v2.2d
2103; CHECK-SD-NEXT:    scvtf v1.2d, v3.2d
2104; CHECK-SD-NEXT:    scvtf v3.2d, v4.2d
2105; CHECK-SD-NEXT:    scvtf v2.2d, v5.2d
2106; CHECK-SD-NEXT:    ret
2107;
2108; CHECK-GI-LABEL: stofp_v8i32_v8f64:
2109; CHECK-GI:       // %bb.0: // %entry
2110; CHECK-GI-NEXT:    sshll v2.2d, v0.2s, #0
2111; CHECK-GI-NEXT:    sshll2 v3.2d, v0.4s, #0
2112; CHECK-GI-NEXT:    sshll v4.2d, v1.2s, #0
2113; CHECK-GI-NEXT:    sshll2 v5.2d, v1.4s, #0
2114; CHECK-GI-NEXT:    scvtf v0.2d, v2.2d
2115; CHECK-GI-NEXT:    scvtf v1.2d, v3.2d
2116; CHECK-GI-NEXT:    scvtf v2.2d, v4.2d
2117; CHECK-GI-NEXT:    scvtf v3.2d, v5.2d
2118; CHECK-GI-NEXT:    ret
2119entry:
2120  %c = sitofp <8 x i32> %a to <8 x double>
2121  ret <8 x double> %c
2122}
2123
2124define <8 x double> @utofp_v8i32_v8f64(<8 x i32> %a) {
2125; CHECK-SD-LABEL: utofp_v8i32_v8f64:
2126; CHECK-SD:       // %bb.0: // %entry
2127; CHECK-SD-NEXT:    ushll v2.2d, v0.2s, #0
2128; CHECK-SD-NEXT:    ushll2 v3.2d, v0.4s, #0
2129; CHECK-SD-NEXT:    ushll2 v4.2d, v1.4s, #0
2130; CHECK-SD-NEXT:    ushll v5.2d, v1.2s, #0
2131; CHECK-SD-NEXT:    ucvtf v0.2d, v2.2d
2132; CHECK-SD-NEXT:    ucvtf v1.2d, v3.2d
2133; CHECK-SD-NEXT:    ucvtf v3.2d, v4.2d
2134; CHECK-SD-NEXT:    ucvtf v2.2d, v5.2d
2135; CHECK-SD-NEXT:    ret
2136;
2137; CHECK-GI-LABEL: utofp_v8i32_v8f64:
2138; CHECK-GI:       // %bb.0: // %entry
2139; CHECK-GI-NEXT:    ushll v2.2d, v0.2s, #0
2140; CHECK-GI-NEXT:    ushll2 v3.2d, v0.4s, #0
2141; CHECK-GI-NEXT:    ushll v4.2d, v1.2s, #0
2142; CHECK-GI-NEXT:    ushll2 v5.2d, v1.4s, #0
2143; CHECK-GI-NEXT:    ucvtf v0.2d, v2.2d
2144; CHECK-GI-NEXT:    ucvtf v1.2d, v3.2d
2145; CHECK-GI-NEXT:    ucvtf v2.2d, v4.2d
2146; CHECK-GI-NEXT:    ucvtf v3.2d, v5.2d
2147; CHECK-GI-NEXT:    ret
2148entry:
2149  %c = uitofp <8 x i32> %a to <8 x double>
2150  ret <8 x double> %c
2151}
2152
2153define <16 x double> @stofp_v16i32_v16f64(<16 x i32> %a) {
2154; CHECK-SD-LABEL: stofp_v16i32_v16f64:
2155; CHECK-SD:       // %bb.0: // %entry
2156; CHECK-SD-NEXT:    sshll2 v4.2d, v0.4s, #0
2157; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2158; CHECK-SD-NEXT:    sshll2 v5.2d, v1.4s, #0
2159; CHECK-SD-NEXT:    sshll v6.2d, v1.2s, #0
2160; CHECK-SD-NEXT:    sshll v7.2d, v2.2s, #0
2161; CHECK-SD-NEXT:    sshll2 v16.2d, v2.4s, #0
2162; CHECK-SD-NEXT:    sshll2 v17.2d, v3.4s, #0
2163; CHECK-SD-NEXT:    sshll v18.2d, v3.2s, #0
2164; CHECK-SD-NEXT:    scvtf v1.2d, v4.2d
2165; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2166; CHECK-SD-NEXT:    scvtf v3.2d, v5.2d
2167; CHECK-SD-NEXT:    scvtf v2.2d, v6.2d
2168; CHECK-SD-NEXT:    scvtf v4.2d, v7.2d
2169; CHECK-SD-NEXT:    scvtf v5.2d, v16.2d
2170; CHECK-SD-NEXT:    scvtf v7.2d, v17.2d
2171; CHECK-SD-NEXT:    scvtf v6.2d, v18.2d
2172; CHECK-SD-NEXT:    ret
2173;
2174; CHECK-GI-LABEL: stofp_v16i32_v16f64:
2175; CHECK-GI:       // %bb.0: // %entry
2176; CHECK-GI-NEXT:    sshll v4.2d, v0.2s, #0
2177; CHECK-GI-NEXT:    sshll2 v5.2d, v0.4s, #0
2178; CHECK-GI-NEXT:    sshll v6.2d, v1.2s, #0
2179; CHECK-GI-NEXT:    sshll2 v7.2d, v1.4s, #0
2180; CHECK-GI-NEXT:    sshll v16.2d, v2.2s, #0
2181; CHECK-GI-NEXT:    sshll2 v17.2d, v2.4s, #0
2182; CHECK-GI-NEXT:    sshll v18.2d, v3.2s, #0
2183; CHECK-GI-NEXT:    sshll2 v19.2d, v3.4s, #0
2184; CHECK-GI-NEXT:    scvtf v0.2d, v4.2d
2185; CHECK-GI-NEXT:    scvtf v1.2d, v5.2d
2186; CHECK-GI-NEXT:    scvtf v2.2d, v6.2d
2187; CHECK-GI-NEXT:    scvtf v3.2d, v7.2d
2188; CHECK-GI-NEXT:    scvtf v4.2d, v16.2d
2189; CHECK-GI-NEXT:    scvtf v5.2d, v17.2d
2190; CHECK-GI-NEXT:    scvtf v6.2d, v18.2d
2191; CHECK-GI-NEXT:    scvtf v7.2d, v19.2d
2192; CHECK-GI-NEXT:    ret
2193entry:
2194  %c = sitofp <16 x i32> %a to <16 x double>
2195  ret <16 x double> %c
2196}
2197
2198define <16 x double> @utofp_v16i32_v16f64(<16 x i32> %a) {
2199; CHECK-SD-LABEL: utofp_v16i32_v16f64:
2200; CHECK-SD:       // %bb.0: // %entry
2201; CHECK-SD-NEXT:    ushll2 v4.2d, v0.4s, #0
2202; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
2203; CHECK-SD-NEXT:    ushll2 v5.2d, v1.4s, #0
2204; CHECK-SD-NEXT:    ushll v6.2d, v1.2s, #0
2205; CHECK-SD-NEXT:    ushll v7.2d, v2.2s, #0
2206; CHECK-SD-NEXT:    ushll2 v16.2d, v2.4s, #0
2207; CHECK-SD-NEXT:    ushll2 v17.2d, v3.4s, #0
2208; CHECK-SD-NEXT:    ushll v18.2d, v3.2s, #0
2209; CHECK-SD-NEXT:    ucvtf v1.2d, v4.2d
2210; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2211; CHECK-SD-NEXT:    ucvtf v3.2d, v5.2d
2212; CHECK-SD-NEXT:    ucvtf v2.2d, v6.2d
2213; CHECK-SD-NEXT:    ucvtf v4.2d, v7.2d
2214; CHECK-SD-NEXT:    ucvtf v5.2d, v16.2d
2215; CHECK-SD-NEXT:    ucvtf v7.2d, v17.2d
2216; CHECK-SD-NEXT:    ucvtf v6.2d, v18.2d
2217; CHECK-SD-NEXT:    ret
2218;
2219; CHECK-GI-LABEL: utofp_v16i32_v16f64:
2220; CHECK-GI:       // %bb.0: // %entry
2221; CHECK-GI-NEXT:    ushll v4.2d, v0.2s, #0
2222; CHECK-GI-NEXT:    ushll2 v5.2d, v0.4s, #0
2223; CHECK-GI-NEXT:    ushll v6.2d, v1.2s, #0
2224; CHECK-GI-NEXT:    ushll2 v7.2d, v1.4s, #0
2225; CHECK-GI-NEXT:    ushll v16.2d, v2.2s, #0
2226; CHECK-GI-NEXT:    ushll2 v17.2d, v2.4s, #0
2227; CHECK-GI-NEXT:    ushll v18.2d, v3.2s, #0
2228; CHECK-GI-NEXT:    ushll2 v19.2d, v3.4s, #0
2229; CHECK-GI-NEXT:    ucvtf v0.2d, v4.2d
2230; CHECK-GI-NEXT:    ucvtf v1.2d, v5.2d
2231; CHECK-GI-NEXT:    ucvtf v2.2d, v6.2d
2232; CHECK-GI-NEXT:    ucvtf v3.2d, v7.2d
2233; CHECK-GI-NEXT:    ucvtf v4.2d, v16.2d
2234; CHECK-GI-NEXT:    ucvtf v5.2d, v17.2d
2235; CHECK-GI-NEXT:    ucvtf v6.2d, v18.2d
2236; CHECK-GI-NEXT:    ucvtf v7.2d, v19.2d
2237; CHECK-GI-NEXT:    ret
2238entry:
2239  %c = uitofp <16 x i32> %a to <16 x double>
2240  ret <16 x double> %c
2241}
2242
2243define <32 x double> @stofp_v32i32_v32f64(<32 x i32> %a) {
2244; CHECK-SD-LABEL: stofp_v32i32_v32f64:
2245; CHECK-SD:       // %bb.0: // %entry
2246; CHECK-SD-NEXT:    sshll2 v16.2d, v7.4s, #0
2247; CHECK-SD-NEXT:    sshll v7.2d, v7.2s, #0
2248; CHECK-SD-NEXT:    sshll2 v17.2d, v6.4s, #0
2249; CHECK-SD-NEXT:    sshll v6.2d, v6.2s, #0
2250; CHECK-SD-NEXT:    sshll2 v19.2d, v4.4s, #0
2251; CHECK-SD-NEXT:    sshll v4.2d, v4.2s, #0
2252; CHECK-SD-NEXT:    sshll2 v18.2d, v5.4s, #0
2253; CHECK-SD-NEXT:    sshll v5.2d, v5.2s, #0
2254; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
2255; CHECK-SD-NEXT:    scvtf v7.2d, v7.2d
2256; CHECK-SD-NEXT:    scvtf v17.2d, v17.2d
2257; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
2258; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
2259; CHECK-SD-NEXT:    scvtf v18.2d, v18.2d
2260; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
2261; CHECK-SD-NEXT:    stp q7, q16, [x8, #224]
2262; CHECK-SD-NEXT:    sshll2 v16.2d, v3.4s, #0
2263; CHECK-SD-NEXT:    sshll v3.2d, v3.2s, #0
2264; CHECK-SD-NEXT:    scvtf v7.2d, v19.2d
2265; CHECK-SD-NEXT:    stp q6, q17, [x8, #192]
2266; CHECK-SD-NEXT:    sshll2 v17.2d, v2.4s, #0
2267; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
2268; CHECK-SD-NEXT:    stp q5, q18, [x8, #160]
2269; CHECK-SD-NEXT:    scvtf v6.2d, v16.2d
2270; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
2271; CHECK-SD-NEXT:    sshll2 v16.2d, v1.4s, #0
2272; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
2273; CHECK-SD-NEXT:    scvtf v5.2d, v17.2d
2274; CHECK-SD-NEXT:    stp q4, q7, [x8, #128]
2275; CHECK-SD-NEXT:    sshll2 v7.2d, v0.4s, #0
2276; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2277; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
2278; CHECK-SD-NEXT:    scvtf v4.2d, v16.2d
2279; CHECK-SD-NEXT:    stp q3, q6, [x8, #96]
2280; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
2281; CHECK-SD-NEXT:    scvtf v3.2d, v7.2d
2282; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2283; CHECK-SD-NEXT:    stp q2, q5, [x8, #64]
2284; CHECK-SD-NEXT:    stp q1, q4, [x8, #32]
2285; CHECK-SD-NEXT:    stp q0, q3, [x8]
2286; CHECK-SD-NEXT:    ret
2287;
2288; CHECK-GI-LABEL: stofp_v32i32_v32f64:
2289; CHECK-GI:       // %bb.0: // %entry
2290; CHECK-GI-NEXT:    sshll v16.2d, v0.2s, #0
2291; CHECK-GI-NEXT:    sshll2 v0.2d, v0.4s, #0
2292; CHECK-GI-NEXT:    sshll v17.2d, v1.2s, #0
2293; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
2294; CHECK-GI-NEXT:    sshll v18.2d, v2.2s, #0
2295; CHECK-GI-NEXT:    sshll2 v2.2d, v2.4s, #0
2296; CHECK-GI-NEXT:    sshll v19.2d, v3.2s, #0
2297; CHECK-GI-NEXT:    sshll2 v3.2d, v3.4s, #0
2298; CHECK-GI-NEXT:    scvtf v16.2d, v16.2d
2299; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2300; CHECK-GI-NEXT:    scvtf v17.2d, v17.2d
2301; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
2302; CHECK-GI-NEXT:    scvtf v18.2d, v18.2d
2303; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
2304; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
2305; CHECK-GI-NEXT:    stp q16, q0, [x8]
2306; CHECK-GI-NEXT:    sshll v16.2d, v4.2s, #0
2307; CHECK-GI-NEXT:    sshll2 v0.2d, v4.4s, #0
2308; CHECK-GI-NEXT:    scvtf v4.2d, v19.2d
2309; CHECK-GI-NEXT:    stp q17, q1, [x8, #32]
2310; CHECK-GI-NEXT:    sshll v17.2d, v5.2s, #0
2311; CHECK-GI-NEXT:    sshll2 v1.2d, v5.4s, #0
2312; CHECK-GI-NEXT:    stp q18, q2, [x8, #64]
2313; CHECK-GI-NEXT:    sshll2 v2.2d, v6.4s, #0
2314; CHECK-GI-NEXT:    scvtf v5.2d, v16.2d
2315; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2316; CHECK-GI-NEXT:    sshll v16.2d, v6.2s, #0
2317; CHECK-GI-NEXT:    scvtf v6.2d, v17.2d
2318; CHECK-GI-NEXT:    stp q4, q3, [x8, #96]
2319; CHECK-GI-NEXT:    sshll v4.2d, v7.2s, #0
2320; CHECK-GI-NEXT:    sshll2 v3.2d, v7.4s, #0
2321; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
2322; CHECK-GI-NEXT:    scvtf v7.2d, v16.2d
2323; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
2324; CHECK-GI-NEXT:    stp q5, q0, [x8, #128]
2325; CHECK-GI-NEXT:    scvtf v0.2d, v4.2d
2326; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
2327; CHECK-GI-NEXT:    stp q6, q1, [x8, #160]
2328; CHECK-GI-NEXT:    stp q7, q2, [x8, #192]
2329; CHECK-GI-NEXT:    stp q0, q3, [x8, #224]
2330; CHECK-GI-NEXT:    ret
2331entry:
2332  %c = sitofp <32 x i32> %a to <32 x double>
2333  ret <32 x double> %c
2334}
2335
2336define <32 x double> @utofp_v32i32_v32f64(<32 x i32> %a) {
2337; CHECK-SD-LABEL: utofp_v32i32_v32f64:
2338; CHECK-SD:       // %bb.0: // %entry
2339; CHECK-SD-NEXT:    ushll2 v16.2d, v7.4s, #0
2340; CHECK-SD-NEXT:    ushll v7.2d, v7.2s, #0
2341; CHECK-SD-NEXT:    ushll2 v17.2d, v6.4s, #0
2342; CHECK-SD-NEXT:    ushll v6.2d, v6.2s, #0
2343; CHECK-SD-NEXT:    ushll2 v19.2d, v4.4s, #0
2344; CHECK-SD-NEXT:    ushll v4.2d, v4.2s, #0
2345; CHECK-SD-NEXT:    ushll2 v18.2d, v5.4s, #0
2346; CHECK-SD-NEXT:    ushll v5.2d, v5.2s, #0
2347; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
2348; CHECK-SD-NEXT:    ucvtf v7.2d, v7.2d
2349; CHECK-SD-NEXT:    ucvtf v17.2d, v17.2d
2350; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
2351; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
2352; CHECK-SD-NEXT:    ucvtf v18.2d, v18.2d
2353; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
2354; CHECK-SD-NEXT:    stp q7, q16, [x8, #224]
2355; CHECK-SD-NEXT:    ushll2 v16.2d, v3.4s, #0
2356; CHECK-SD-NEXT:    ushll v3.2d, v3.2s, #0
2357; CHECK-SD-NEXT:    ucvtf v7.2d, v19.2d
2358; CHECK-SD-NEXT:    stp q6, q17, [x8, #192]
2359; CHECK-SD-NEXT:    ushll2 v17.2d, v2.4s, #0
2360; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
2361; CHECK-SD-NEXT:    stp q5, q18, [x8, #160]
2362; CHECK-SD-NEXT:    ucvtf v6.2d, v16.2d
2363; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
2364; CHECK-SD-NEXT:    ushll2 v16.2d, v1.4s, #0
2365; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
2366; CHECK-SD-NEXT:    ucvtf v5.2d, v17.2d
2367; CHECK-SD-NEXT:    stp q4, q7, [x8, #128]
2368; CHECK-SD-NEXT:    ushll2 v7.2d, v0.4s, #0
2369; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
2370; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
2371; CHECK-SD-NEXT:    ucvtf v4.2d, v16.2d
2372; CHECK-SD-NEXT:    stp q3, q6, [x8, #96]
2373; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
2374; CHECK-SD-NEXT:    ucvtf v3.2d, v7.2d
2375; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2376; CHECK-SD-NEXT:    stp q2, q5, [x8, #64]
2377; CHECK-SD-NEXT:    stp q1, q4, [x8, #32]
2378; CHECK-SD-NEXT:    stp q0, q3, [x8]
2379; CHECK-SD-NEXT:    ret
2380;
2381; CHECK-GI-LABEL: utofp_v32i32_v32f64:
2382; CHECK-GI:       // %bb.0: // %entry
2383; CHECK-GI-NEXT:    ushll v16.2d, v0.2s, #0
2384; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
2385; CHECK-GI-NEXT:    ushll v17.2d, v1.2s, #0
2386; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
2387; CHECK-GI-NEXT:    ushll v18.2d, v2.2s, #0
2388; CHECK-GI-NEXT:    ushll2 v2.2d, v2.4s, #0
2389; CHECK-GI-NEXT:    ushll v19.2d, v3.2s, #0
2390; CHECK-GI-NEXT:    ushll2 v3.2d, v3.4s, #0
2391; CHECK-GI-NEXT:    ucvtf v16.2d, v16.2d
2392; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
2393; CHECK-GI-NEXT:    ucvtf v17.2d, v17.2d
2394; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
2395; CHECK-GI-NEXT:    ucvtf v18.2d, v18.2d
2396; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
2397; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
2398; CHECK-GI-NEXT:    stp q16, q0, [x8]
2399; CHECK-GI-NEXT:    ushll v16.2d, v4.2s, #0
2400; CHECK-GI-NEXT:    ushll2 v0.2d, v4.4s, #0
2401; CHECK-GI-NEXT:    ucvtf v4.2d, v19.2d
2402; CHECK-GI-NEXT:    stp q17, q1, [x8, #32]
2403; CHECK-GI-NEXT:    ushll v17.2d, v5.2s, #0
2404; CHECK-GI-NEXT:    ushll2 v1.2d, v5.4s, #0
2405; CHECK-GI-NEXT:    stp q18, q2, [x8, #64]
2406; CHECK-GI-NEXT:    ushll2 v2.2d, v6.4s, #0
2407; CHECK-GI-NEXT:    ucvtf v5.2d, v16.2d
2408; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
2409; CHECK-GI-NEXT:    ushll v16.2d, v6.2s, #0
2410; CHECK-GI-NEXT:    ucvtf v6.2d, v17.2d
2411; CHECK-GI-NEXT:    stp q4, q3, [x8, #96]
2412; CHECK-GI-NEXT:    ushll v4.2d, v7.2s, #0
2413; CHECK-GI-NEXT:    ushll2 v3.2d, v7.4s, #0
2414; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
2415; CHECK-GI-NEXT:    ucvtf v7.2d, v16.2d
2416; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
2417; CHECK-GI-NEXT:    stp q5, q0, [x8, #128]
2418; CHECK-GI-NEXT:    ucvtf v0.2d, v4.2d
2419; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
2420; CHECK-GI-NEXT:    stp q6, q1, [x8, #160]
2421; CHECK-GI-NEXT:    stp q7, q2, [x8, #192]
2422; CHECK-GI-NEXT:    stp q0, q3, [x8, #224]
2423; CHECK-GI-NEXT:    ret
2424entry:
2425  %c = uitofp <32 x i32> %a to <32 x double>
2426  ret <32 x double> %c
2427}
2428
2429define <2 x fp128> @stofp_v2i16_v2f128(<2 x i16> %a) {
2430; CHECK-LABEL: stofp_v2i16_v2f128:
2431; CHECK:       // %bb.0: // %entry
2432; CHECK-NEXT:    sub sp, sp, #32
2433; CHECK-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
2434; CHECK-NEXT:    .cfi_def_cfa_offset 32
2435; CHECK-NEXT:    .cfi_offset w30, -16
2436; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2437; CHECK-NEXT:    fmov w8, s0
2438; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2439; CHECK-NEXT:    sxth w0, w8
2440; CHECK-NEXT:    bl __floatsitf
2441; CHECK-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
2442; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2443; CHECK-NEXT:    mov w8, v1.s[1]
2444; CHECK-NEXT:    sxth w0, w8
2445; CHECK-NEXT:    bl __floatsitf
2446; CHECK-NEXT:    mov v1.16b, v0.16b
2447; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
2448; CHECK-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
2449; CHECK-NEXT:    add sp, sp, #32
2450; CHECK-NEXT:    ret
2451entry:
2452  %c = sitofp <2 x i16> %a to <2 x fp128>
2453  ret <2 x fp128> %c
2454}
2455
2456define <2 x fp128> @utofp_v2i16_v2f128(<2 x i16> %a) {
2457; CHECK-LABEL: utofp_v2i16_v2f128:
2458; CHECK:       // %bb.0: // %entry
2459; CHECK-NEXT:    sub sp, sp, #32
2460; CHECK-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
2461; CHECK-NEXT:    .cfi_def_cfa_offset 32
2462; CHECK-NEXT:    .cfi_offset w30, -16
2463; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2464; CHECK-NEXT:    fmov w8, s0
2465; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2466; CHECK-NEXT:    and w0, w8, #0xffff
2467; CHECK-NEXT:    bl __floatunsitf
2468; CHECK-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
2469; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2470; CHECK-NEXT:    mov w8, v1.s[1]
2471; CHECK-NEXT:    and w0, w8, #0xffff
2472; CHECK-NEXT:    bl __floatunsitf
2473; CHECK-NEXT:    mov v1.16b, v0.16b
2474; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
2475; CHECK-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
2476; CHECK-NEXT:    add sp, sp, #32
2477; CHECK-NEXT:    ret
2478entry:
2479  %c = uitofp <2 x i16> %a to <2 x fp128>
2480  ret <2 x fp128> %c
2481}
2482
2483define <3 x fp128> @stofp_v3i16_v3f128(<3 x i16> %a) {
2484; CHECK-LABEL: stofp_v3i16_v3f128:
2485; CHECK:       // %bb.0: // %entry
2486; CHECK-NEXT:    sub sp, sp, #48
2487; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
2488; CHECK-NEXT:    .cfi_def_cfa_offset 48
2489; CHECK-NEXT:    .cfi_offset w30, -16
2490; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2491; CHECK-NEXT:    smov w0, v0.h[0]
2492; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
2493; CHECK-NEXT:    bl __floatsitf
2494; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
2495; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2496; CHECK-NEXT:    smov w0, v1.h[1]
2497; CHECK-NEXT:    bl __floatsitf
2498; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
2499; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
2500; CHECK-NEXT:    smov w0, v1.h[2]
2501; CHECK-NEXT:    bl __floatsitf
2502; CHECK-NEXT:    mov v2.16b, v0.16b
2503; CHECK-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
2504; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
2505; CHECK-NEXT:    add sp, sp, #48
2506; CHECK-NEXT:    ret
2507entry:
2508  %c = sitofp <3 x i16> %a to <3 x fp128>
2509  ret <3 x fp128> %c
2510}
2511
2512define <3 x fp128> @utofp_v3i16_v3f128(<3 x i16> %a) {
2513; CHECK-LABEL: utofp_v3i16_v3f128:
2514; CHECK:       // %bb.0: // %entry
2515; CHECK-NEXT:    sub sp, sp, #48
2516; CHECK-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
2517; CHECK-NEXT:    .cfi_def_cfa_offset 48
2518; CHECK-NEXT:    .cfi_offset w30, -16
2519; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2520; CHECK-NEXT:    umov w0, v0.h[0]
2521; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
2522; CHECK-NEXT:    bl __floatunsitf
2523; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
2524; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
2525; CHECK-NEXT:    umov w0, v1.h[1]
2526; CHECK-NEXT:    bl __floatunsitf
2527; CHECK-NEXT:    ldr q1, [sp, #16] // 16-byte Folded Reload
2528; CHECK-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
2529; CHECK-NEXT:    umov w0, v1.h[2]
2530; CHECK-NEXT:    bl __floatunsitf
2531; CHECK-NEXT:    mov v2.16b, v0.16b
2532; CHECK-NEXT:    ldp q0, q1, [sp] // 32-byte Folded Reload
2533; CHECK-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
2534; CHECK-NEXT:    add sp, sp, #48
2535; CHECK-NEXT:    ret
2536entry:
2537  %c = uitofp <3 x i16> %a to <3 x fp128>
2538  ret <3 x fp128> %c
2539}
2540
2541define <2 x double> @stofp_v2i16_v2f64(<2 x i16> %a) {
2542; CHECK-SD-LABEL: stofp_v2i16_v2f64:
2543; CHECK-SD:       // %bb.0: // %entry
2544; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #16
2545; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #16
2546; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2547; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2548; CHECK-SD-NEXT:    ret
2549;
2550; CHECK-GI-LABEL: stofp_v2i16_v2f64:
2551; CHECK-GI:       // %bb.0: // %entry
2552; CHECK-GI-NEXT:    ushll v0.2d, v0.2s, #0
2553; CHECK-GI-NEXT:    shl v0.2d, v0.2d, #48
2554; CHECK-GI-NEXT:    sshr v0.2d, v0.2d, #48
2555; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2556; CHECK-GI-NEXT:    ret
2557entry:
2558  %c = sitofp <2 x i16> %a to <2 x double>
2559  ret <2 x double> %c
2560}
2561
2562define <2 x double> @utofp_v2i16_v2f64(<2 x i16> %a) {
2563; CHECK-SD-LABEL: utofp_v2i16_v2f64:
2564; CHECK-SD:       // %bb.0: // %entry
2565; CHECK-SD-NEXT:    movi d1, #0x00ffff0000ffff
2566; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
2567; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
2568; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2569; CHECK-SD-NEXT:    ret
2570;
2571; CHECK-GI-LABEL: utofp_v2i16_v2f64:
2572; CHECK-GI:       // %bb.0: // %entry
2573; CHECK-GI-NEXT:    movi v1.2d, #0x0000000000ffff
2574; CHECK-GI-NEXT:    ushll v0.2d, v0.2s, #0
2575; CHECK-GI-NEXT:    and v0.16b, v0.16b, v1.16b
2576; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
2577; CHECK-GI-NEXT:    ret
2578entry:
2579  %c = uitofp <2 x i16> %a to <2 x double>
2580  ret <2 x double> %c
2581}
2582
2583define <3 x double> @stofp_v3i16_v3f64(<3 x i16> %a) {
2584; CHECK-SD-LABEL: stofp_v3i16_v3f64:
2585; CHECK-SD:       // %bb.0: // %entry
2586; CHECK-SD-NEXT:    sshll v1.4s, v0.4h, #0
2587; CHECK-SD-NEXT:    sshll v0.2d, v1.2s, #0
2588; CHECK-SD-NEXT:    sshll2 v1.2d, v1.4s, #0
2589; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2590; CHECK-SD-NEXT:    scvtf v2.2d, v1.2d
2591; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2592; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
2593; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
2594; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2595; CHECK-SD-NEXT:    ret
2596;
2597; CHECK-GI-LABEL: stofp_v3i16_v3f64:
2598; CHECK-GI:       // %bb.0: // %entry
2599; CHECK-GI-NEXT:    sshll v1.4s, v0.4h, #0
2600; CHECK-GI-NEXT:    sshll v0.2d, v1.2s, #0
2601; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
2602; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2603; CHECK-GI-NEXT:    scvtf v2.2d, v1.2d
2604; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
2605; CHECK-GI-NEXT:    mov d1, v0.d[1]
2606; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
2607; CHECK-GI-NEXT:    ret
2608entry:
2609  %c = sitofp <3 x i16> %a to <3 x double>
2610  ret <3 x double> %c
2611}
2612
2613define <3 x double> @utofp_v3i16_v3f64(<3 x i16> %a) {
2614; CHECK-SD-LABEL: utofp_v3i16_v3f64:
2615; CHECK-SD:       // %bb.0: // %entry
2616; CHECK-SD-NEXT:    ushll v1.4s, v0.4h, #0
2617; CHECK-SD-NEXT:    ushll v0.2d, v1.2s, #0
2618; CHECK-SD-NEXT:    ushll2 v1.2d, v1.4s, #0
2619; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2620; CHECK-SD-NEXT:    ucvtf v2.2d, v1.2d
2621; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
2622; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
2623; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
2624; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
2625; CHECK-SD-NEXT:    ret
2626;
2627; CHECK-GI-LABEL: utofp_v3i16_v3f64:
2628; CHECK-GI:       // %bb.0: // %entry
2629; CHECK-GI-NEXT:    ushll v1.4s, v0.4h, #0
2630; CHECK-GI-NEXT:    ushll v0.2d, v1.2s, #0
2631; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
2632; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
2633; CHECK-GI-NEXT:    ucvtf v2.2d, v1.2d
2634; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
2635; CHECK-GI-NEXT:    mov d1, v0.d[1]
2636; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
2637; CHECK-GI-NEXT:    ret
2638entry:
2639  %c = uitofp <3 x i16> %a to <3 x double>
2640  ret <3 x double> %c
2641}
2642
2643define <4 x double> @stofp_v4i16_v4f64(<4 x i16> %a) {
2644; CHECK-SD-LABEL: stofp_v4i16_v4f64:
2645; CHECK-SD:       // %bb.0: // %entry
2646; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
2647; CHECK-SD-NEXT:    sshll2 v1.2d, v0.4s, #0
2648; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2649; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
2650; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2651; CHECK-SD-NEXT:    ret
2652;
2653; CHECK-GI-LABEL: stofp_v4i16_v4f64:
2654; CHECK-GI:       // %bb.0: // %entry
2655; CHECK-GI-NEXT:    sshll v0.4s, v0.4h, #0
2656; CHECK-GI-NEXT:    sshll v1.2d, v0.2s, #0
2657; CHECK-GI-NEXT:    sshll2 v2.2d, v0.4s, #0
2658; CHECK-GI-NEXT:    scvtf v0.2d, v1.2d
2659; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
2660; CHECK-GI-NEXT:    ret
2661entry:
2662  %c = sitofp <4 x i16> %a to <4 x double>
2663  ret <4 x double> %c
2664}
2665
2666define <4 x double> @utofp_v4i16_v4f64(<4 x i16> %a) {
2667; CHECK-SD-LABEL: utofp_v4i16_v4f64:
2668; CHECK-SD:       // %bb.0: // %entry
2669; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
2670; CHECK-SD-NEXT:    ushll2 v1.2d, v0.4s, #0
2671; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
2672; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
2673; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
2674; CHECK-SD-NEXT:    ret
2675;
2676; CHECK-GI-LABEL: utofp_v4i16_v4f64:
2677; CHECK-GI:       // %bb.0: // %entry
2678; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
2679; CHECK-GI-NEXT:    ushll v1.2d, v0.2s, #0
2680; CHECK-GI-NEXT:    ushll2 v2.2d, v0.4s, #0
2681; CHECK-GI-NEXT:    ucvtf v0.2d, v1.2d
2682; CHECK-GI-NEXT:    ucvtf v1.2d, v2.2d
2683; CHECK-GI-NEXT:    ret
2684entry:
2685  %c = uitofp <4 x i16> %a to <4 x double>
2686  ret <4 x double> %c
2687}
2688
2689define <8 x double> @stofp_v8i16_v8f64(<8 x i16> %a) {
2690; CHECK-SD-LABEL: stofp_v8i16_v8f64:
2691; CHECK-SD:       // %bb.0: // %entry
2692; CHECK-SD-NEXT:    sshll v1.4s, v0.4h, #0
2693; CHECK-SD-NEXT:    sshll2 v0.4s, v0.8h, #0
2694; CHECK-SD-NEXT:    sshll v2.2d, v1.2s, #0
2695; CHECK-SD-NEXT:    sshll2 v3.2d, v0.4s, #0
2696; CHECK-SD-NEXT:    sshll2 v1.2d, v1.4s, #0
2697; CHECK-SD-NEXT:    sshll v4.2d, v0.2s, #0
2698; CHECK-SD-NEXT:    scvtf v0.2d, v2.2d
2699; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
2700; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
2701; CHECK-SD-NEXT:    scvtf v2.2d, v4.2d
2702; CHECK-SD-NEXT:    ret
2703;
2704; CHECK-GI-LABEL: stofp_v8i16_v8f64:
2705; CHECK-GI:       // %bb.0: // %entry
2706; CHECK-GI-NEXT:    sshll v1.4s, v0.4h, #0
2707; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
2708; CHECK-GI-NEXT:    sshll v2.2d, v1.2s, #0
2709; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
2710; CHECK-GI-NEXT:    sshll v3.2d, v0.2s, #0
2711; CHECK-GI-NEXT:    sshll2 v4.2d, v0.4s, #0
2712; CHECK-GI-NEXT:    scvtf v0.2d, v2.2d
2713; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
2714; CHECK-GI-NEXT:    scvtf v2.2d, v3.2d
2715; CHECK-GI-NEXT:    scvtf v3.2d, v4.2d
2716; CHECK-GI-NEXT:    ret
2717entry:
2718  %c = sitofp <8 x i16> %a to <8 x double>
2719  ret <8 x double> %c
2720}
2721
2722define <8 x double> @utofp_v8i16_v8f64(<8 x i16> %a) {
2723; CHECK-SD-LABEL: utofp_v8i16_v8f64:
2724; CHECK-SD:       // %bb.0: // %entry
2725; CHECK-SD-NEXT:    ushll v1.4s, v0.4h, #0
2726; CHECK-SD-NEXT:    ushll2 v0.4s, v0.8h, #0
2727; CHECK-SD-NEXT:    ushll v2.2d, v1.2s, #0
2728; CHECK-SD-NEXT:    ushll2 v3.2d, v0.4s, #0
2729; CHECK-SD-NEXT:    ushll2 v1.2d, v1.4s, #0
2730; CHECK-SD-NEXT:    ushll v4.2d, v0.2s, #0
2731; CHECK-SD-NEXT:    ucvtf v0.2d, v2.2d
2732; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
2733; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
2734; CHECK-SD-NEXT:    ucvtf v2.2d, v4.2d
2735; CHECK-SD-NEXT:    ret
2736;
2737; CHECK-GI-LABEL: utofp_v8i16_v8f64:
2738; CHECK-GI:       // %bb.0: // %entry
2739; CHECK-GI-NEXT:    ushll v1.4s, v0.4h, #0
2740; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
2741; CHECK-GI-NEXT:    ushll v2.2d, v1.2s, #0
2742; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
2743; CHECK-GI-NEXT:    ushll v3.2d, v0.2s, #0
2744; CHECK-GI-NEXT:    ushll2 v4.2d, v0.4s, #0
2745; CHECK-GI-NEXT:    ucvtf v0.2d, v2.2d
2746; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
2747; CHECK-GI-NEXT:    ucvtf v2.2d, v3.2d
2748; CHECK-GI-NEXT:    ucvtf v3.2d, v4.2d
2749; CHECK-GI-NEXT:    ret
2750entry:
2751  %c = uitofp <8 x i16> %a to <8 x double>
2752  ret <8 x double> %c
2753}
2754
2755define <16 x double> @stofp_v16i16_v16f64(<16 x i16> %a) {
2756; CHECK-SD-LABEL: stofp_v16i16_v16f64:
2757; CHECK-SD:       // %bb.0: // %entry
2758; CHECK-SD-NEXT:    sshll v2.4s, v0.4h, #0
2759; CHECK-SD-NEXT:    sshll2 v0.4s, v0.8h, #0
2760; CHECK-SD-NEXT:    sshll v3.4s, v1.4h, #0
2761; CHECK-SD-NEXT:    sshll2 v1.4s, v1.8h, #0
2762; CHECK-SD-NEXT:    sshll2 v4.2d, v2.4s, #0
2763; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
2764; CHECK-SD-NEXT:    sshll2 v5.2d, v0.4s, #0
2765; CHECK-SD-NEXT:    sshll v6.2d, v0.2s, #0
2766; CHECK-SD-NEXT:    sshll v7.2d, v3.2s, #0
2767; CHECK-SD-NEXT:    sshll2 v16.2d, v1.4s, #0
2768; CHECK-SD-NEXT:    sshll2 v17.2d, v3.4s, #0
2769; CHECK-SD-NEXT:    sshll v18.2d, v1.2s, #0
2770; CHECK-SD-NEXT:    scvtf v1.2d, v4.2d
2771; CHECK-SD-NEXT:    scvtf v0.2d, v2.2d
2772; CHECK-SD-NEXT:    scvtf v3.2d, v5.2d
2773; CHECK-SD-NEXT:    scvtf v2.2d, v6.2d
2774; CHECK-SD-NEXT:    scvtf v4.2d, v7.2d
2775; CHECK-SD-NEXT:    scvtf v7.2d, v16.2d
2776; CHECK-SD-NEXT:    scvtf v5.2d, v17.2d
2777; CHECK-SD-NEXT:    scvtf v6.2d, v18.2d
2778; CHECK-SD-NEXT:    ret
2779;
2780; CHECK-GI-LABEL: stofp_v16i16_v16f64:
2781; CHECK-GI:       // %bb.0: // %entry
2782; CHECK-GI-NEXT:    sshll v2.4s, v0.4h, #0
2783; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
2784; CHECK-GI-NEXT:    sshll v3.4s, v1.4h, #0
2785; CHECK-GI-NEXT:    sshll2 v1.4s, v1.8h, #0
2786; CHECK-GI-NEXT:    sshll v4.2d, v2.2s, #0
2787; CHECK-GI-NEXT:    sshll2 v2.2d, v2.4s, #0
2788; CHECK-GI-NEXT:    sshll v5.2d, v0.2s, #0
2789; CHECK-GI-NEXT:    sshll2 v6.2d, v0.4s, #0
2790; CHECK-GI-NEXT:    sshll v7.2d, v3.2s, #0
2791; CHECK-GI-NEXT:    sshll2 v16.2d, v3.4s, #0
2792; CHECK-GI-NEXT:    sshll v17.2d, v1.2s, #0
2793; CHECK-GI-NEXT:    sshll2 v18.2d, v1.4s, #0
2794; CHECK-GI-NEXT:    scvtf v0.2d, v4.2d
2795; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
2796; CHECK-GI-NEXT:    scvtf v2.2d, v5.2d
2797; CHECK-GI-NEXT:    scvtf v3.2d, v6.2d
2798; CHECK-GI-NEXT:    scvtf v4.2d, v7.2d
2799; CHECK-GI-NEXT:    scvtf v5.2d, v16.2d
2800; CHECK-GI-NEXT:    scvtf v6.2d, v17.2d
2801; CHECK-GI-NEXT:    scvtf v7.2d, v18.2d
2802; CHECK-GI-NEXT:    ret
2803entry:
2804  %c = sitofp <16 x i16> %a to <16 x double>
2805  ret <16 x double> %c
2806}
2807
2808define <16 x double> @utofp_v16i16_v16f64(<16 x i16> %a) {
2809; CHECK-SD-LABEL: utofp_v16i16_v16f64:
2810; CHECK-SD:       // %bb.0: // %entry
2811; CHECK-SD-NEXT:    ushll v2.4s, v0.4h, #0
2812; CHECK-SD-NEXT:    ushll2 v0.4s, v0.8h, #0
2813; CHECK-SD-NEXT:    ushll v3.4s, v1.4h, #0
2814; CHECK-SD-NEXT:    ushll2 v1.4s, v1.8h, #0
2815; CHECK-SD-NEXT:    ushll2 v4.2d, v2.4s, #0
2816; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
2817; CHECK-SD-NEXT:    ushll2 v5.2d, v0.4s, #0
2818; CHECK-SD-NEXT:    ushll v6.2d, v0.2s, #0
2819; CHECK-SD-NEXT:    ushll v7.2d, v3.2s, #0
2820; CHECK-SD-NEXT:    ushll2 v16.2d, v1.4s, #0
2821; CHECK-SD-NEXT:    ushll2 v17.2d, v3.4s, #0
2822; CHECK-SD-NEXT:    ushll v18.2d, v1.2s, #0
2823; CHECK-SD-NEXT:    ucvtf v1.2d, v4.2d
2824; CHECK-SD-NEXT:    ucvtf v0.2d, v2.2d
2825; CHECK-SD-NEXT:    ucvtf v3.2d, v5.2d
2826; CHECK-SD-NEXT:    ucvtf v2.2d, v6.2d
2827; CHECK-SD-NEXT:    ucvtf v4.2d, v7.2d
2828; CHECK-SD-NEXT:    ucvtf v7.2d, v16.2d
2829; CHECK-SD-NEXT:    ucvtf v5.2d, v17.2d
2830; CHECK-SD-NEXT:    ucvtf v6.2d, v18.2d
2831; CHECK-SD-NEXT:    ret
2832;
2833; CHECK-GI-LABEL: utofp_v16i16_v16f64:
2834; CHECK-GI:       // %bb.0: // %entry
2835; CHECK-GI-NEXT:    ushll v2.4s, v0.4h, #0
2836; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
2837; CHECK-GI-NEXT:    ushll v3.4s, v1.4h, #0
2838; CHECK-GI-NEXT:    ushll2 v1.4s, v1.8h, #0
2839; CHECK-GI-NEXT:    ushll v4.2d, v2.2s, #0
2840; CHECK-GI-NEXT:    ushll2 v2.2d, v2.4s, #0
2841; CHECK-GI-NEXT:    ushll v5.2d, v0.2s, #0
2842; CHECK-GI-NEXT:    ushll2 v6.2d, v0.4s, #0
2843; CHECK-GI-NEXT:    ushll v7.2d, v3.2s, #0
2844; CHECK-GI-NEXT:    ushll2 v16.2d, v3.4s, #0
2845; CHECK-GI-NEXT:    ushll v17.2d, v1.2s, #0
2846; CHECK-GI-NEXT:    ushll2 v18.2d, v1.4s, #0
2847; CHECK-GI-NEXT:    ucvtf v0.2d, v4.2d
2848; CHECK-GI-NEXT:    ucvtf v1.2d, v2.2d
2849; CHECK-GI-NEXT:    ucvtf v2.2d, v5.2d
2850; CHECK-GI-NEXT:    ucvtf v3.2d, v6.2d
2851; CHECK-GI-NEXT:    ucvtf v4.2d, v7.2d
2852; CHECK-GI-NEXT:    ucvtf v5.2d, v16.2d
2853; CHECK-GI-NEXT:    ucvtf v6.2d, v17.2d
2854; CHECK-GI-NEXT:    ucvtf v7.2d, v18.2d
2855; CHECK-GI-NEXT:    ret
2856entry:
2857  %c = uitofp <16 x i16> %a to <16 x double>
2858  ret <16 x double> %c
2859}
2860
2861define <32 x double> @stofp_v32i16_v32f64(<32 x i16> %a) {
2862; CHECK-SD-LABEL: stofp_v32i16_v32f64:
2863; CHECK-SD:       // %bb.0: // %entry
2864; CHECK-SD-NEXT:    sshll2 v4.4s, v3.8h, #0
2865; CHECK-SD-NEXT:    sshll2 v5.4s, v2.8h, #0
2866; CHECK-SD-NEXT:    sshll2 v7.4s, v1.8h, #0
2867; CHECK-SD-NEXT:    sshll2 v17.4s, v0.8h, #0
2868; CHECK-SD-NEXT:    sshll v3.4s, v3.4h, #0
2869; CHECK-SD-NEXT:    sshll v1.4s, v1.4h, #0
2870; CHECK-SD-NEXT:    sshll v2.4s, v2.4h, #0
2871; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
2872; CHECK-SD-NEXT:    sshll2 v6.2d, v4.4s, #0
2873; CHECK-SD-NEXT:    sshll v4.2d, v4.2s, #0
2874; CHECK-SD-NEXT:    sshll2 v16.2d, v5.4s, #0
2875; CHECK-SD-NEXT:    sshll v5.2d, v5.2s, #0
2876; CHECK-SD-NEXT:    sshll2 v18.2d, v7.4s, #0
2877; CHECK-SD-NEXT:    sshll v7.2d, v7.2s, #0
2878; CHECK-SD-NEXT:    sshll2 v19.2d, v17.4s, #0
2879; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
2880; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
2881; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
2882; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
2883; CHECK-SD-NEXT:    scvtf v7.2d, v7.2d
2884; CHECK-SD-NEXT:    stp q4, q6, [x8, #224]
2885; CHECK-SD-NEXT:    sshll v6.2d, v17.2s, #0
2886; CHECK-SD-NEXT:    scvtf v17.2d, v18.2d
2887; CHECK-SD-NEXT:    sshll2 v4.2d, v3.4s, #0
2888; CHECK-SD-NEXT:    stp q5, q16, [x8, #160]
2889; CHECK-SD-NEXT:    sshll v3.2d, v3.2s, #0
2890; CHECK-SD-NEXT:    scvtf v16.2d, v19.2d
2891; CHECK-SD-NEXT:    scvtf v5.2d, v6.2d
2892; CHECK-SD-NEXT:    sshll2 v6.2d, v2.4s, #0
2893; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
2894; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
2895; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
2896; CHECK-SD-NEXT:    stp q7, q17, [x8, #96]
2897; CHECK-SD-NEXT:    sshll2 v7.2d, v1.4s, #0
2898; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
2899; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
2900; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
2901; CHECK-SD-NEXT:    stp q5, q16, [x8, #32]
2902; CHECK-SD-NEXT:    sshll2 v5.2d, v0.4s, #0
2903; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
2904; CHECK-SD-NEXT:    scvtf v7.2d, v7.2d
2905; CHECK-SD-NEXT:    stp q3, q4, [x8, #192]
2906; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
2907; CHECK-SD-NEXT:    scvtf v3.2d, v5.2d
2908; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
2909; CHECK-SD-NEXT:    stp q2, q6, [x8, #128]
2910; CHECK-SD-NEXT:    stp q1, q7, [x8, #64]
2911; CHECK-SD-NEXT:    stp q0, q3, [x8]
2912; CHECK-SD-NEXT:    ret
2913;
2914; CHECK-GI-LABEL: stofp_v32i16_v32f64:
2915; CHECK-GI:       // %bb.0: // %entry
2916; CHECK-GI-NEXT:    sshll v4.4s, v0.4h, #0
2917; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
2918; CHECK-GI-NEXT:    sshll v6.4s, v1.4h, #0
2919; CHECK-GI-NEXT:    sshll2 v1.4s, v1.8h, #0
2920; CHECK-GI-NEXT:    sshll v16.4s, v2.4h, #0
2921; CHECK-GI-NEXT:    sshll2 v2.4s, v2.8h, #0
2922; CHECK-GI-NEXT:    sshll v18.4s, v3.4h, #0
2923; CHECK-GI-NEXT:    sshll2 v3.4s, v3.8h, #0
2924; CHECK-GI-NEXT:    sshll v5.2d, v4.2s, #0
2925; CHECK-GI-NEXT:    sshll2 v4.2d, v4.4s, #0
2926; CHECK-GI-NEXT:    sshll v7.2d, v0.2s, #0
2927; CHECK-GI-NEXT:    sshll2 v0.2d, v0.4s, #0
2928; CHECK-GI-NEXT:    sshll v17.2d, v6.2s, #0
2929; CHECK-GI-NEXT:    sshll2 v6.2d, v6.4s, #0
2930; CHECK-GI-NEXT:    sshll v19.2d, v1.2s, #0
2931; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
2932; CHECK-GI-NEXT:    scvtf v5.2d, v5.2d
2933; CHECK-GI-NEXT:    scvtf v4.2d, v4.2d
2934; CHECK-GI-NEXT:    scvtf v7.2d, v7.2d
2935; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2936; CHECK-GI-NEXT:    scvtf v6.2d, v6.2d
2937; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
2938; CHECK-GI-NEXT:    stp q5, q4, [x8]
2939; CHECK-GI-NEXT:    scvtf v5.2d, v17.2d
2940; CHECK-GI-NEXT:    sshll v4.2d, v16.2s, #0
2941; CHECK-GI-NEXT:    stp q7, q0, [x8, #32]
2942; CHECK-GI-NEXT:    sshll2 v7.2d, v16.4s, #0
2943; CHECK-GI-NEXT:    scvtf v16.2d, v19.2d
2944; CHECK-GI-NEXT:    sshll v0.2d, v2.2s, #0
2945; CHECK-GI-NEXT:    sshll2 v2.2d, v2.4s, #0
2946; CHECK-GI-NEXT:    scvtf v4.2d, v4.2d
2947; CHECK-GI-NEXT:    stp q5, q6, [x8, #64]
2948; CHECK-GI-NEXT:    scvtf v6.2d, v7.2d
2949; CHECK-GI-NEXT:    sshll v5.2d, v18.2s, #0
2950; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
2951; CHECK-GI-NEXT:    stp q16, q1, [x8, #96]
2952; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
2953; CHECK-GI-NEXT:    sshll2 v7.2d, v18.4s, #0
2954; CHECK-GI-NEXT:    sshll v1.2d, v3.2s, #0
2955; CHECK-GI-NEXT:    sshll2 v3.2d, v3.4s, #0
2956; CHECK-GI-NEXT:    scvtf v5.2d, v5.2d
2957; CHECK-GI-NEXT:    stp q4, q6, [x8, #128]
2958; CHECK-GI-NEXT:    scvtf v4.2d, v7.2d
2959; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
2960; CHECK-GI-NEXT:    stp q0, q2, [x8, #160]
2961; CHECK-GI-NEXT:    scvtf v0.2d, v3.2d
2962; CHECK-GI-NEXT:    stp q5, q4, [x8, #192]
2963; CHECK-GI-NEXT:    stp q1, q0, [x8, #224]
2964; CHECK-GI-NEXT:    ret
2965entry:
2966  %c = sitofp <32 x i16> %a to <32 x double>
2967  ret <32 x double> %c
2968}
2969
2970define <32 x double> @utofp_v32i16_v32f64(<32 x i16> %a) {
2971; CHECK-SD-LABEL: utofp_v32i16_v32f64:
2972; CHECK-SD:       // %bb.0: // %entry
2973; CHECK-SD-NEXT:    ushll2 v4.4s, v3.8h, #0
2974; CHECK-SD-NEXT:    ushll2 v5.4s, v2.8h, #0
2975; CHECK-SD-NEXT:    ushll2 v7.4s, v1.8h, #0
2976; CHECK-SD-NEXT:    ushll2 v17.4s, v0.8h, #0
2977; CHECK-SD-NEXT:    ushll v3.4s, v3.4h, #0
2978; CHECK-SD-NEXT:    ushll v1.4s, v1.4h, #0
2979; CHECK-SD-NEXT:    ushll v2.4s, v2.4h, #0
2980; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
2981; CHECK-SD-NEXT:    ushll2 v6.2d, v4.4s, #0
2982; CHECK-SD-NEXT:    ushll v4.2d, v4.2s, #0
2983; CHECK-SD-NEXT:    ushll2 v16.2d, v5.4s, #0
2984; CHECK-SD-NEXT:    ushll v5.2d, v5.2s, #0
2985; CHECK-SD-NEXT:    ushll2 v18.2d, v7.4s, #0
2986; CHECK-SD-NEXT:    ushll v7.2d, v7.2s, #0
2987; CHECK-SD-NEXT:    ushll2 v19.2d, v17.4s, #0
2988; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
2989; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
2990; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
2991; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
2992; CHECK-SD-NEXT:    ucvtf v7.2d, v7.2d
2993; CHECK-SD-NEXT:    stp q4, q6, [x8, #224]
2994; CHECK-SD-NEXT:    ushll v6.2d, v17.2s, #0
2995; CHECK-SD-NEXT:    ucvtf v17.2d, v18.2d
2996; CHECK-SD-NEXT:    ushll2 v4.2d, v3.4s, #0
2997; CHECK-SD-NEXT:    stp q5, q16, [x8, #160]
2998; CHECK-SD-NEXT:    ushll v3.2d, v3.2s, #0
2999; CHECK-SD-NEXT:    ucvtf v16.2d, v19.2d
3000; CHECK-SD-NEXT:    ucvtf v5.2d, v6.2d
3001; CHECK-SD-NEXT:    ushll2 v6.2d, v2.4s, #0
3002; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
3003; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
3004; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
3005; CHECK-SD-NEXT:    stp q7, q17, [x8, #96]
3006; CHECK-SD-NEXT:    ushll2 v7.2d, v1.4s, #0
3007; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
3008; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
3009; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
3010; CHECK-SD-NEXT:    stp q5, q16, [x8, #32]
3011; CHECK-SD-NEXT:    ushll2 v5.2d, v0.4s, #0
3012; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
3013; CHECK-SD-NEXT:    ucvtf v7.2d, v7.2d
3014; CHECK-SD-NEXT:    stp q3, q4, [x8, #192]
3015; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
3016; CHECK-SD-NEXT:    ucvtf v3.2d, v5.2d
3017; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
3018; CHECK-SD-NEXT:    stp q2, q6, [x8, #128]
3019; CHECK-SD-NEXT:    stp q1, q7, [x8, #64]
3020; CHECK-SD-NEXT:    stp q0, q3, [x8]
3021; CHECK-SD-NEXT:    ret
3022;
3023; CHECK-GI-LABEL: utofp_v32i16_v32f64:
3024; CHECK-GI:       // %bb.0: // %entry
3025; CHECK-GI-NEXT:    ushll v4.4s, v0.4h, #0
3026; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
3027; CHECK-GI-NEXT:    ushll v6.4s, v1.4h, #0
3028; CHECK-GI-NEXT:    ushll2 v1.4s, v1.8h, #0
3029; CHECK-GI-NEXT:    ushll v16.4s, v2.4h, #0
3030; CHECK-GI-NEXT:    ushll2 v2.4s, v2.8h, #0
3031; CHECK-GI-NEXT:    ushll v18.4s, v3.4h, #0
3032; CHECK-GI-NEXT:    ushll2 v3.4s, v3.8h, #0
3033; CHECK-GI-NEXT:    ushll v5.2d, v4.2s, #0
3034; CHECK-GI-NEXT:    ushll2 v4.2d, v4.4s, #0
3035; CHECK-GI-NEXT:    ushll v7.2d, v0.2s, #0
3036; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
3037; CHECK-GI-NEXT:    ushll v17.2d, v6.2s, #0
3038; CHECK-GI-NEXT:    ushll2 v6.2d, v6.4s, #0
3039; CHECK-GI-NEXT:    ushll v19.2d, v1.2s, #0
3040; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
3041; CHECK-GI-NEXT:    ucvtf v5.2d, v5.2d
3042; CHECK-GI-NEXT:    ucvtf v4.2d, v4.2d
3043; CHECK-GI-NEXT:    ucvtf v7.2d, v7.2d
3044; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
3045; CHECK-GI-NEXT:    ucvtf v6.2d, v6.2d
3046; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
3047; CHECK-GI-NEXT:    stp q5, q4, [x8]
3048; CHECK-GI-NEXT:    ucvtf v5.2d, v17.2d
3049; CHECK-GI-NEXT:    ushll v4.2d, v16.2s, #0
3050; CHECK-GI-NEXT:    stp q7, q0, [x8, #32]
3051; CHECK-GI-NEXT:    ushll2 v7.2d, v16.4s, #0
3052; CHECK-GI-NEXT:    ucvtf v16.2d, v19.2d
3053; CHECK-GI-NEXT:    ushll v0.2d, v2.2s, #0
3054; CHECK-GI-NEXT:    ushll2 v2.2d, v2.4s, #0
3055; CHECK-GI-NEXT:    ucvtf v4.2d, v4.2d
3056; CHECK-GI-NEXT:    stp q5, q6, [x8, #64]
3057; CHECK-GI-NEXT:    ucvtf v6.2d, v7.2d
3058; CHECK-GI-NEXT:    ushll v5.2d, v18.2s, #0
3059; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
3060; CHECK-GI-NEXT:    stp q16, q1, [x8, #96]
3061; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
3062; CHECK-GI-NEXT:    ushll2 v7.2d, v18.4s, #0
3063; CHECK-GI-NEXT:    ushll v1.2d, v3.2s, #0
3064; CHECK-GI-NEXT:    ushll2 v3.2d, v3.4s, #0
3065; CHECK-GI-NEXT:    ucvtf v5.2d, v5.2d
3066; CHECK-GI-NEXT:    stp q4, q6, [x8, #128]
3067; CHECK-GI-NEXT:    ucvtf v4.2d, v7.2d
3068; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
3069; CHECK-GI-NEXT:    stp q0, q2, [x8, #160]
3070; CHECK-GI-NEXT:    ucvtf v0.2d, v3.2d
3071; CHECK-GI-NEXT:    stp q5, q4, [x8, #192]
3072; CHECK-GI-NEXT:    stp q1, q0, [x8, #224]
3073; CHECK-GI-NEXT:    ret
3074entry:
3075  %c = uitofp <32 x i16> %a to <32 x double>
3076  ret <32 x double> %c
3077}
3078
3079define <2 x fp128> @stofp_v2i8_v2f128(<2 x i8> %a) {
3080; CHECK-LABEL: stofp_v2i8_v2f128:
3081; CHECK:       // %bb.0: // %entry
3082; CHECK-NEXT:    sub sp, sp, #32
3083; CHECK-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
3084; CHECK-NEXT:    .cfi_def_cfa_offset 32
3085; CHECK-NEXT:    .cfi_offset w30, -16
3086; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
3087; CHECK-NEXT:    fmov w8, s0
3088; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
3089; CHECK-NEXT:    sxtb w0, w8
3090; CHECK-NEXT:    bl __floatsitf
3091; CHECK-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
3092; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
3093; CHECK-NEXT:    mov w8, v1.s[1]
3094; CHECK-NEXT:    sxtb w0, w8
3095; CHECK-NEXT:    bl __floatsitf
3096; CHECK-NEXT:    mov v1.16b, v0.16b
3097; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
3098; CHECK-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
3099; CHECK-NEXT:    add sp, sp, #32
3100; CHECK-NEXT:    ret
3101entry:
3102  %c = sitofp <2 x i8> %a to <2 x fp128>
3103  ret <2 x fp128> %c
3104}
3105
3106define <2 x fp128> @utofp_v2i8_v2f128(<2 x i8> %a) {
3107; CHECK-LABEL: utofp_v2i8_v2f128:
3108; CHECK:       // %bb.0: // %entry
3109; CHECK-NEXT:    sub sp, sp, #32
3110; CHECK-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
3111; CHECK-NEXT:    .cfi_def_cfa_offset 32
3112; CHECK-NEXT:    .cfi_offset w30, -16
3113; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
3114; CHECK-NEXT:    fmov w8, s0
3115; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
3116; CHECK-NEXT:    and w0, w8, #0xff
3117; CHECK-NEXT:    bl __floatunsitf
3118; CHECK-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
3119; CHECK-NEXT:    str q0, [sp] // 16-byte Folded Spill
3120; CHECK-NEXT:    mov w8, v1.s[1]
3121; CHECK-NEXT:    and w0, w8, #0xff
3122; CHECK-NEXT:    bl __floatunsitf
3123; CHECK-NEXT:    mov v1.16b, v0.16b
3124; CHECK-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
3125; CHECK-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
3126; CHECK-NEXT:    add sp, sp, #32
3127; CHECK-NEXT:    ret
3128entry:
3129  %c = uitofp <2 x i8> %a to <2 x fp128>
3130  ret <2 x fp128> %c
3131}
3132
3133define <3 x fp128> @stofp_v2i8_v3f128(<3 x i8> %a) {
3134; CHECK-SD-LABEL: stofp_v2i8_v3f128:
3135; CHECK-SD:       // %bb.0: // %entry
3136; CHECK-SD-NEXT:    sub sp, sp, #64
3137; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
3138; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
3139; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
3140; CHECK-SD-NEXT:    .cfi_offset w19, -8
3141; CHECK-SD-NEXT:    .cfi_offset w20, -16
3142; CHECK-SD-NEXT:    .cfi_offset w30, -32
3143; CHECK-SD-NEXT:    sxtb w0, w0
3144; CHECK-SD-NEXT:    mov w19, w2
3145; CHECK-SD-NEXT:    mov w20, w1
3146; CHECK-SD-NEXT:    bl __floatsitf
3147; CHECK-SD-NEXT:    sxtb w0, w20
3148; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
3149; CHECK-SD-NEXT:    bl __floatsitf
3150; CHECK-SD-NEXT:    sxtb w0, w19
3151; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
3152; CHECK-SD-NEXT:    bl __floatsitf
3153; CHECK-SD-NEXT:    mov v2.16b, v0.16b
3154; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
3155; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
3156; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
3157; CHECK-SD-NEXT:    add sp, sp, #64
3158; CHECK-SD-NEXT:    ret
3159;
3160; CHECK-GI-LABEL: stofp_v2i8_v3f128:
3161; CHECK-GI:       // %bb.0: // %entry
3162; CHECK-GI-NEXT:    sub sp, sp, #64
3163; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
3164; CHECK-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
3165; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
3166; CHECK-GI-NEXT:    .cfi_offset w19, -8
3167; CHECK-GI-NEXT:    .cfi_offset w20, -16
3168; CHECK-GI-NEXT:    .cfi_offset w30, -32
3169; CHECK-GI-NEXT:    sxtb w0, w0
3170; CHECK-GI-NEXT:    mov w19, w1
3171; CHECK-GI-NEXT:    mov w20, w2
3172; CHECK-GI-NEXT:    bl __floatsitf
3173; CHECK-GI-NEXT:    sxtb w0, w19
3174; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
3175; CHECK-GI-NEXT:    bl __floatsitf
3176; CHECK-GI-NEXT:    sxtb w0, w20
3177; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
3178; CHECK-GI-NEXT:    bl __floatsitf
3179; CHECK-GI-NEXT:    mov v2.16b, v0.16b
3180; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
3181; CHECK-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
3182; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
3183; CHECK-GI-NEXT:    add sp, sp, #64
3184; CHECK-GI-NEXT:    ret
3185entry:
3186  %c = sitofp <3 x i8> %a to <3 x fp128>
3187  ret <3 x fp128> %c
3188}
3189
3190define <3 x fp128> @utofp_v2i8_v3f128(<3 x i8> %a) {
3191; CHECK-SD-LABEL: utofp_v2i8_v3f128:
3192; CHECK-SD:       // %bb.0: // %entry
3193; CHECK-SD-NEXT:    sub sp, sp, #64
3194; CHECK-SD-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
3195; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
3196; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
3197; CHECK-SD-NEXT:    .cfi_offset w19, -8
3198; CHECK-SD-NEXT:    .cfi_offset w20, -16
3199; CHECK-SD-NEXT:    .cfi_offset w30, -32
3200; CHECK-SD-NEXT:    and w0, w0, #0xff
3201; CHECK-SD-NEXT:    mov w19, w2
3202; CHECK-SD-NEXT:    mov w20, w1
3203; CHECK-SD-NEXT:    bl __floatunsitf
3204; CHECK-SD-NEXT:    and w0, w20, #0xff
3205; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
3206; CHECK-SD-NEXT:    bl __floatunsitf
3207; CHECK-SD-NEXT:    and w0, w19, #0xff
3208; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
3209; CHECK-SD-NEXT:    bl __floatunsitf
3210; CHECK-SD-NEXT:    mov v2.16b, v0.16b
3211; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
3212; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
3213; CHECK-SD-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
3214; CHECK-SD-NEXT:    add sp, sp, #64
3215; CHECK-SD-NEXT:    ret
3216;
3217; CHECK-GI-LABEL: utofp_v2i8_v3f128:
3218; CHECK-GI:       // %bb.0: // %entry
3219; CHECK-GI-NEXT:    sub sp, sp, #64
3220; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
3221; CHECK-GI-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
3222; CHECK-GI-NEXT:    .cfi_def_cfa_offset 64
3223; CHECK-GI-NEXT:    .cfi_offset w19, -8
3224; CHECK-GI-NEXT:    .cfi_offset w20, -16
3225; CHECK-GI-NEXT:    .cfi_offset w30, -32
3226; CHECK-GI-NEXT:    and w0, w0, #0xff
3227; CHECK-GI-NEXT:    mov w19, w1
3228; CHECK-GI-NEXT:    mov w20, w2
3229; CHECK-GI-NEXT:    bl __floatunsitf
3230; CHECK-GI-NEXT:    and w0, w19, #0xff
3231; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
3232; CHECK-GI-NEXT:    bl __floatunsitf
3233; CHECK-GI-NEXT:    and w0, w20, #0xff
3234; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
3235; CHECK-GI-NEXT:    bl __floatunsitf
3236; CHECK-GI-NEXT:    mov v2.16b, v0.16b
3237; CHECK-GI-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
3238; CHECK-GI-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
3239; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
3240; CHECK-GI-NEXT:    add sp, sp, #64
3241; CHECK-GI-NEXT:    ret
3242entry:
3243  %c = uitofp <3 x i8> %a to <3 x fp128>
3244  ret <3 x fp128> %c
3245}
3246
3247define <2 x double> @stofp_v2i8_v2f64(<2 x i8> %a) {
3248; CHECK-SD-LABEL: stofp_v2i8_v2f64:
3249; CHECK-SD:       // %bb.0: // %entry
3250; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3251; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3252; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3253; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3254; CHECK-SD-NEXT:    ret
3255;
3256; CHECK-GI-LABEL: stofp_v2i8_v2f64:
3257; CHECK-GI:       // %bb.0: // %entry
3258; CHECK-GI-NEXT:    ushll v0.2d, v0.2s, #0
3259; CHECK-GI-NEXT:    shl v0.2d, v0.2d, #56
3260; CHECK-GI-NEXT:    sshr v0.2d, v0.2d, #56
3261; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
3262; CHECK-GI-NEXT:    ret
3263entry:
3264  %c = sitofp <2 x i8> %a to <2 x double>
3265  ret <2 x double> %c
3266}
3267
3268define <2 x double> @utofp_v2i8_v2f64(<2 x i8> %a) {
3269; CHECK-SD-LABEL: utofp_v2i8_v2f64:
3270; CHECK-SD:       // %bb.0: // %entry
3271; CHECK-SD-NEXT:    movi d1, #0x0000ff000000ff
3272; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
3273; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
3274; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
3275; CHECK-SD-NEXT:    ret
3276;
3277; CHECK-GI-LABEL: utofp_v2i8_v2f64:
3278; CHECK-GI:       // %bb.0: // %entry
3279; CHECK-GI-NEXT:    movi v1.2d, #0x000000000000ff
3280; CHECK-GI-NEXT:    ushll v0.2d, v0.2s, #0
3281; CHECK-GI-NEXT:    and v0.16b, v0.16b, v1.16b
3282; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
3283; CHECK-GI-NEXT:    ret
3284entry:
3285  %c = uitofp <2 x i8> %a to <2 x double>
3286  ret <2 x double> %c
3287}
3288
3289define <3 x double> @stofp_v3i8_v3f64(<3 x i8> %a) {
3290; CHECK-SD-LABEL: stofp_v3i8_v3f64:
3291; CHECK-SD:       // %bb.0: // %entry
3292; CHECK-SD-NEXT:    fmov s0, w0
3293; CHECK-SD-NEXT:    fmov s1, w2
3294; CHECK-SD-NEXT:    mov v0.s[1], w1
3295; CHECK-SD-NEXT:    shl v1.2s, v1.2s, #24
3296; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3297; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3298; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
3299; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3300; CHECK-SD-NEXT:    scvtf v2.2d, v1.2d
3301; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3302; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
3303; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3304; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
3305; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
3306; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
3307; CHECK-SD-NEXT:    ret
3308;
3309; CHECK-GI-LABEL: stofp_v3i8_v3f64:
3310; CHECK-GI:       // %bb.0: // %entry
3311; CHECK-GI-NEXT:    fmov s0, w0
3312; CHECK-GI-NEXT:    mov v0.h[1], w1
3313; CHECK-GI-NEXT:    mov v0.h[2], w2
3314; CHECK-GI-NEXT:    shl v0.4h, v0.4h, #8
3315; CHECK-GI-NEXT:    sshr v0.4h, v0.4h, #8
3316; CHECK-GI-NEXT:    smov x8, v0.h[0]
3317; CHECK-GI-NEXT:    smov x9, v0.h[1]
3318; CHECK-GI-NEXT:    mov v1.d[0], x8
3319; CHECK-GI-NEXT:    smov x8, v0.h[2]
3320; CHECK-GI-NEXT:    mov v1.d[1], x9
3321; CHECK-GI-NEXT:    smov x9, v0.h[3]
3322; CHECK-GI-NEXT:    mov v2.d[0], x8
3323; CHECK-GI-NEXT:    scvtf v0.2d, v1.2d
3324; CHECK-GI-NEXT:    mov v2.d[1], x9
3325; CHECK-GI-NEXT:    mov d1, v0.d[1]
3326; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
3327; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
3328; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
3329; CHECK-GI-NEXT:    ret
3330entry:
3331  %c = sitofp <3 x i8> %a to <3 x double>
3332  ret <3 x double> %c
3333}
3334
3335define <3 x double> @utofp_v3i8_v3f64(<3 x i8> %a) {
3336; CHECK-SD-LABEL: utofp_v3i8_v3f64:
3337; CHECK-SD:       // %bb.0: // %entry
3338; CHECK-SD-NEXT:    fmov s0, w0
3339; CHECK-SD-NEXT:    movi d1, #0x0000ff000000ff
3340; CHECK-SD-NEXT:    fmov s2, w2
3341; CHECK-SD-NEXT:    mov v0.s[1], w1
3342; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
3343; CHECK-SD-NEXT:    and v1.8b, v2.8b, v1.8b
3344; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
3345; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
3346; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
3347; CHECK-SD-NEXT:    ucvtf v2.2d, v1.2d
3348; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
3349; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
3350; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
3351; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
3352; CHECK-SD-NEXT:    ret
3353;
3354; CHECK-GI-LABEL: utofp_v3i8_v3f64:
3355; CHECK-GI:       // %bb.0: // %entry
3356; CHECK-GI-NEXT:    fmov s0, w0
3357; CHECK-GI-NEXT:    movi d1, #0xff00ff00ff00ff
3358; CHECK-GI-NEXT:    mov v0.h[1], w1
3359; CHECK-GI-NEXT:    mov v0.h[2], w2
3360; CHECK-GI-NEXT:    and v0.8b, v0.8b, v1.8b
3361; CHECK-GI-NEXT:    umov w8, v0.h[0]
3362; CHECK-GI-NEXT:    umov w9, v0.h[1]
3363; CHECK-GI-NEXT:    mov v1.d[0], x8
3364; CHECK-GI-NEXT:    umov w8, v0.h[2]
3365; CHECK-GI-NEXT:    mov v1.d[1], x9
3366; CHECK-GI-NEXT:    umov w9, v0.h[3]
3367; CHECK-GI-NEXT:    mov v2.d[0], x8
3368; CHECK-GI-NEXT:    ucvtf v0.2d, v1.2d
3369; CHECK-GI-NEXT:    mov v2.d[1], x9
3370; CHECK-GI-NEXT:    mov d1, v0.d[1]
3371; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
3372; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
3373; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
3374; CHECK-GI-NEXT:    ret
3375entry:
3376  %c = uitofp <3 x i8> %a to <3 x double>
3377  ret <3 x double> %c
3378}
3379
3380define <4 x double> @stofp_v4i8_v4f64(<4 x i8> %a) {
3381; CHECK-SD-LABEL: stofp_v4i8_v4f64:
3382; CHECK-SD:       // %bb.0: // %entry
3383; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
3384; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
3385; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3386; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3387; CHECK-SD-NEXT:    shl v1.2s, v1.2s, #24
3388; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3389; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3390; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3391; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
3392; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
3393; CHECK-SD-NEXT:    ret
3394;
3395; CHECK-GI-LABEL: stofp_v4i8_v4f64:
3396; CHECK-GI:       // %bb.0: // %entry
3397; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
3398; CHECK-GI-NEXT:    ushll v1.2d, v0.2s, #0
3399; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
3400; CHECK-GI-NEXT:    shl v1.2d, v1.2d, #56
3401; CHECK-GI-NEXT:    shl v0.2d, v0.2d, #56
3402; CHECK-GI-NEXT:    sshr v1.2d, v1.2d, #56
3403; CHECK-GI-NEXT:    sshr v2.2d, v0.2d, #56
3404; CHECK-GI-NEXT:    scvtf v0.2d, v1.2d
3405; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
3406; CHECK-GI-NEXT:    ret
3407entry:
3408  %c = sitofp <4 x i8> %a to <4 x double>
3409  ret <4 x double> %c
3410}
3411
3412define <4 x double> @utofp_v4i8_v4f64(<4 x i8> %a) {
3413; CHECK-SD-LABEL: utofp_v4i8_v4f64:
3414; CHECK-SD:       // %bb.0: // %entry
3415; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
3416; CHECK-SD-NEXT:    movi d1, #0x0000ff000000ff
3417; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
3418; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
3419; CHECK-SD-NEXT:    and v1.8b, v2.8b, v1.8b
3420; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
3421; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
3422; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
3423; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
3424; CHECK-SD-NEXT:    ret
3425;
3426; CHECK-GI-LABEL: utofp_v4i8_v4f64:
3427; CHECK-GI:       // %bb.0: // %entry
3428; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
3429; CHECK-GI-NEXT:    movi v1.2d, #0x000000000000ff
3430; CHECK-GI-NEXT:    ushll v2.2d, v0.2s, #0
3431; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
3432; CHECK-GI-NEXT:    and v2.16b, v2.16b, v1.16b
3433; CHECK-GI-NEXT:    and v1.16b, v0.16b, v1.16b
3434; CHECK-GI-NEXT:    ucvtf v0.2d, v2.2d
3435; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
3436; CHECK-GI-NEXT:    ret
3437entry:
3438  %c = uitofp <4 x i8> %a to <4 x double>
3439  ret <4 x double> %c
3440}
3441
3442define <8 x double> @stofp_v8i8_v8f64(<8 x i8> %a) {
3443; CHECK-SD-LABEL: stofp_v8i8_v8f64:
3444; CHECK-SD:       // %bb.0: // %entry
3445; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
3446; CHECK-SD-NEXT:    umov w8, v0.b[0]
3447; CHECK-SD-NEXT:    umov w9, v0.b[2]
3448; CHECK-SD-NEXT:    umov w11, v0.b[4]
3449; CHECK-SD-NEXT:    umov w12, v0.b[6]
3450; CHECK-SD-NEXT:    umov w10, v0.b[1]
3451; CHECK-SD-NEXT:    umov w13, v0.b[3]
3452; CHECK-SD-NEXT:    umov w14, v0.b[5]
3453; CHECK-SD-NEXT:    umov w15, v0.b[7]
3454; CHECK-SD-NEXT:    fmov s0, w8
3455; CHECK-SD-NEXT:    fmov s1, w9
3456; CHECK-SD-NEXT:    fmov s2, w11
3457; CHECK-SD-NEXT:    fmov s3, w12
3458; CHECK-SD-NEXT:    mov v0.s[1], w10
3459; CHECK-SD-NEXT:    mov v1.s[1], w13
3460; CHECK-SD-NEXT:    mov v2.s[1], w14
3461; CHECK-SD-NEXT:    mov v3.s[1], w15
3462; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3463; CHECK-SD-NEXT:    shl v1.2s, v1.2s, #24
3464; CHECK-SD-NEXT:    shl v2.2s, v2.2s, #24
3465; CHECK-SD-NEXT:    shl v3.2s, v3.2s, #24
3466; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3467; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3468; CHECK-SD-NEXT:    sshr v2.2s, v2.2s, #24
3469; CHECK-SD-NEXT:    sshr v3.2s, v3.2s, #24
3470; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3471; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
3472; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
3473; CHECK-SD-NEXT:    sshll v3.2d, v3.2s, #0
3474; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3475; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
3476; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
3477; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
3478; CHECK-SD-NEXT:    ret
3479;
3480; CHECK-GI-LABEL: stofp_v8i8_v8f64:
3481; CHECK-GI:       // %bb.0: // %entry
3482; CHECK-GI-NEXT:    sshll v0.8h, v0.8b, #0
3483; CHECK-GI-NEXT:    sshll v1.4s, v0.4h, #0
3484; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
3485; CHECK-GI-NEXT:    sshll v2.2d, v1.2s, #0
3486; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
3487; CHECK-GI-NEXT:    sshll v3.2d, v0.2s, #0
3488; CHECK-GI-NEXT:    sshll2 v4.2d, v0.4s, #0
3489; CHECK-GI-NEXT:    scvtf v0.2d, v2.2d
3490; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
3491; CHECK-GI-NEXT:    scvtf v2.2d, v3.2d
3492; CHECK-GI-NEXT:    scvtf v3.2d, v4.2d
3493; CHECK-GI-NEXT:    ret
3494entry:
3495  %c = sitofp <8 x i8> %a to <8 x double>
3496  ret <8 x double> %c
3497}
3498
3499define <8 x double> @utofp_v8i8_v8f64(<8 x i8> %a) {
3500; CHECK-SD-LABEL: utofp_v8i8_v8f64:
3501; CHECK-SD:       // %bb.0: // %entry
3502; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
3503; CHECK-SD-NEXT:    umov w8, v0.b[0]
3504; CHECK-SD-NEXT:    umov w9, v0.b[2]
3505; CHECK-SD-NEXT:    umov w11, v0.b[4]
3506; CHECK-SD-NEXT:    umov w12, v0.b[6]
3507; CHECK-SD-NEXT:    umov w10, v0.b[1]
3508; CHECK-SD-NEXT:    umov w13, v0.b[3]
3509; CHECK-SD-NEXT:    umov w14, v0.b[5]
3510; CHECK-SD-NEXT:    umov w15, v0.b[7]
3511; CHECK-SD-NEXT:    movi d1, #0x0000ff000000ff
3512; CHECK-SD-NEXT:    fmov s0, w8
3513; CHECK-SD-NEXT:    fmov s2, w9
3514; CHECK-SD-NEXT:    fmov s3, w11
3515; CHECK-SD-NEXT:    fmov s4, w12
3516; CHECK-SD-NEXT:    mov v0.s[1], w10
3517; CHECK-SD-NEXT:    mov v2.s[1], w13
3518; CHECK-SD-NEXT:    mov v3.s[1], w14
3519; CHECK-SD-NEXT:    mov v4.s[1], w15
3520; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
3521; CHECK-SD-NEXT:    and v2.8b, v2.8b, v1.8b
3522; CHECK-SD-NEXT:    and v3.8b, v3.8b, v1.8b
3523; CHECK-SD-NEXT:    and v1.8b, v4.8b, v1.8b
3524; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
3525; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
3526; CHECK-SD-NEXT:    ushll v3.2d, v3.2s, #0
3527; CHECK-SD-NEXT:    ushll v4.2d, v1.2s, #0
3528; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
3529; CHECK-SD-NEXT:    ucvtf v1.2d, v2.2d
3530; CHECK-SD-NEXT:    ucvtf v2.2d, v3.2d
3531; CHECK-SD-NEXT:    ucvtf v3.2d, v4.2d
3532; CHECK-SD-NEXT:    ret
3533;
3534; CHECK-GI-LABEL: utofp_v8i8_v8f64:
3535; CHECK-GI:       // %bb.0: // %entry
3536; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #0
3537; CHECK-GI-NEXT:    ushll v1.4s, v0.4h, #0
3538; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
3539; CHECK-GI-NEXT:    ushll v2.2d, v1.2s, #0
3540; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
3541; CHECK-GI-NEXT:    ushll v3.2d, v0.2s, #0
3542; CHECK-GI-NEXT:    ushll2 v4.2d, v0.4s, #0
3543; CHECK-GI-NEXT:    ucvtf v0.2d, v2.2d
3544; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
3545; CHECK-GI-NEXT:    ucvtf v2.2d, v3.2d
3546; CHECK-GI-NEXT:    ucvtf v3.2d, v4.2d
3547; CHECK-GI-NEXT:    ret
3548entry:
3549  %c = uitofp <8 x i8> %a to <8 x double>
3550  ret <8 x double> %c
3551}
3552
3553define <16 x double> @stofp_v16i8_v16f64(<16 x i8> %a) {
3554; CHECK-SD-LABEL: stofp_v16i8_v16f64:
3555; CHECK-SD:       // %bb.0: // %entry
3556; CHECK-SD-NEXT:    umov w8, v0.b[0]
3557; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
3558; CHECK-SD-NEXT:    umov w9, v0.b[1]
3559; CHECK-SD-NEXT:    umov w10, v0.b[2]
3560; CHECK-SD-NEXT:    umov w12, v0.b[4]
3561; CHECK-SD-NEXT:    umov w14, v0.b[6]
3562; CHECK-SD-NEXT:    umov w11, v0.b[3]
3563; CHECK-SD-NEXT:    umov w13, v0.b[5]
3564; CHECK-SD-NEXT:    fmov s2, w8
3565; CHECK-SD-NEXT:    umov w15, v1.b[0]
3566; CHECK-SD-NEXT:    umov w17, v1.b[2]
3567; CHECK-SD-NEXT:    umov w0, v1.b[4]
3568; CHECK-SD-NEXT:    umov w16, v1.b[1]
3569; CHECK-SD-NEXT:    umov w18, v1.b[3]
3570; CHECK-SD-NEXT:    umov w8, v0.b[7]
3571; CHECK-SD-NEXT:    fmov s0, w10
3572; CHECK-SD-NEXT:    umov w10, v1.b[5]
3573; CHECK-SD-NEXT:    mov v2.s[1], w9
3574; CHECK-SD-NEXT:    umov w9, v1.b[6]
3575; CHECK-SD-NEXT:    fmov s3, w12
3576; CHECK-SD-NEXT:    umov w12, v1.b[7]
3577; CHECK-SD-NEXT:    fmov s1, w14
3578; CHECK-SD-NEXT:    fmov s4, w15
3579; CHECK-SD-NEXT:    fmov s5, w17
3580; CHECK-SD-NEXT:    fmov s6, w0
3581; CHECK-SD-NEXT:    mov v0.s[1], w11
3582; CHECK-SD-NEXT:    mov v3.s[1], w13
3583; CHECK-SD-NEXT:    fmov s7, w9
3584; CHECK-SD-NEXT:    mov v1.s[1], w8
3585; CHECK-SD-NEXT:    mov v4.s[1], w16
3586; CHECK-SD-NEXT:    mov v5.s[1], w18
3587; CHECK-SD-NEXT:    mov v6.s[1], w10
3588; CHECK-SD-NEXT:    shl v2.2s, v2.2s, #24
3589; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3590; CHECK-SD-NEXT:    mov v7.s[1], w12
3591; CHECK-SD-NEXT:    shl v3.2s, v3.2s, #24
3592; CHECK-SD-NEXT:    shl v1.2s, v1.2s, #24
3593; CHECK-SD-NEXT:    shl v4.2s, v4.2s, #24
3594; CHECK-SD-NEXT:    sshr v2.2s, v2.2s, #24
3595; CHECK-SD-NEXT:    shl v5.2s, v5.2s, #24
3596; CHECK-SD-NEXT:    shl v6.2s, v6.2s, #24
3597; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3598; CHECK-SD-NEXT:    sshr v3.2s, v3.2s, #24
3599; CHECK-SD-NEXT:    shl v7.2s, v7.2s, #24
3600; CHECK-SD-NEXT:    sshr v4.2s, v4.2s, #24
3601; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3602; CHECK-SD-NEXT:    sshr v5.2s, v5.2s, #24
3603; CHECK-SD-NEXT:    sshr v6.2s, v6.2s, #24
3604; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
3605; CHECK-SD-NEXT:    sshll v16.2d, v0.2s, #0
3606; CHECK-SD-NEXT:    sshll v3.2d, v3.2s, #0
3607; CHECK-SD-NEXT:    sshr v7.2s, v7.2s, #24
3608; CHECK-SD-NEXT:    sshll v4.2d, v4.2s, #0
3609; CHECK-SD-NEXT:    sshll v17.2d, v1.2s, #0
3610; CHECK-SD-NEXT:    sshll v5.2d, v5.2s, #0
3611; CHECK-SD-NEXT:    sshll v6.2d, v6.2s, #0
3612; CHECK-SD-NEXT:    scvtf v0.2d, v2.2d
3613; CHECK-SD-NEXT:    scvtf v1.2d, v16.2d
3614; CHECK-SD-NEXT:    scvtf v2.2d, v3.2d
3615; CHECK-SD-NEXT:    sshll v7.2d, v7.2s, #0
3616; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
3617; CHECK-SD-NEXT:    scvtf v3.2d, v17.2d
3618; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
3619; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
3620; CHECK-SD-NEXT:    scvtf v7.2d, v7.2d
3621; CHECK-SD-NEXT:    ret
3622;
3623; CHECK-GI-LABEL: stofp_v16i8_v16f64:
3624; CHECK-GI:       // %bb.0: // %entry
3625; CHECK-GI-NEXT:    sshll v1.8h, v0.8b, #0
3626; CHECK-GI-NEXT:    sshll2 v0.8h, v0.16b, #0
3627; CHECK-GI-NEXT:    sshll v2.4s, v1.4h, #0
3628; CHECK-GI-NEXT:    sshll2 v1.4s, v1.8h, #0
3629; CHECK-GI-NEXT:    sshll v3.4s, v0.4h, #0
3630; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
3631; CHECK-GI-NEXT:    sshll v4.2d, v2.2s, #0
3632; CHECK-GI-NEXT:    sshll2 v2.2d, v2.4s, #0
3633; CHECK-GI-NEXT:    sshll v5.2d, v1.2s, #0
3634; CHECK-GI-NEXT:    sshll2 v6.2d, v1.4s, #0
3635; CHECK-GI-NEXT:    sshll v7.2d, v3.2s, #0
3636; CHECK-GI-NEXT:    sshll2 v16.2d, v3.4s, #0
3637; CHECK-GI-NEXT:    sshll v17.2d, v0.2s, #0
3638; CHECK-GI-NEXT:    sshll2 v18.2d, v0.4s, #0
3639; CHECK-GI-NEXT:    scvtf v0.2d, v4.2d
3640; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
3641; CHECK-GI-NEXT:    scvtf v2.2d, v5.2d
3642; CHECK-GI-NEXT:    scvtf v3.2d, v6.2d
3643; CHECK-GI-NEXT:    scvtf v4.2d, v7.2d
3644; CHECK-GI-NEXT:    scvtf v5.2d, v16.2d
3645; CHECK-GI-NEXT:    scvtf v6.2d, v17.2d
3646; CHECK-GI-NEXT:    scvtf v7.2d, v18.2d
3647; CHECK-GI-NEXT:    ret
3648entry:
3649  %c = sitofp <16 x i8> %a to <16 x double>
3650  ret <16 x double> %c
3651}
3652
3653define <16 x double> @utofp_v16i8_v16f64(<16 x i8> %a) {
3654; CHECK-SD-LABEL: utofp_v16i8_v16f64:
3655; CHECK-SD:       // %bb.0: // %entry
3656; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
3657; CHECK-SD-NEXT:    umov w8, v0.b[0]
3658; CHECK-SD-NEXT:    umov w10, v0.b[2]
3659; CHECK-SD-NEXT:    umov w9, v0.b[1]
3660; CHECK-SD-NEXT:    umov w12, v0.b[4]
3661; CHECK-SD-NEXT:    umov w11, v0.b[3]
3662; CHECK-SD-NEXT:    umov w13, v0.b[5]
3663; CHECK-SD-NEXT:    umov w18, v0.b[6]
3664; CHECK-SD-NEXT:    movi d1, #0x0000ff000000ff
3665; CHECK-SD-NEXT:    umov w14, v2.b[0]
3666; CHECK-SD-NEXT:    umov w16, v2.b[2]
3667; CHECK-SD-NEXT:    umov w0, v2.b[4]
3668; CHECK-SD-NEXT:    fmov s3, w8
3669; CHECK-SD-NEXT:    umov w8, v0.b[7]
3670; CHECK-SD-NEXT:    fmov s0, w10
3671; CHECK-SD-NEXT:    umov w10, v2.b[6]
3672; CHECK-SD-NEXT:    umov w15, v2.b[1]
3673; CHECK-SD-NEXT:    umov w17, v2.b[3]
3674; CHECK-SD-NEXT:    fmov s4, w12
3675; CHECK-SD-NEXT:    umov w12, v2.b[5]
3676; CHECK-SD-NEXT:    fmov s7, w18
3677; CHECK-SD-NEXT:    mov v3.s[1], w9
3678; CHECK-SD-NEXT:    umov w9, v2.b[7]
3679; CHECK-SD-NEXT:    fmov s2, w14
3680; CHECK-SD-NEXT:    fmov s5, w16
3681; CHECK-SD-NEXT:    fmov s6, w0
3682; CHECK-SD-NEXT:    mov v0.s[1], w11
3683; CHECK-SD-NEXT:    fmov s16, w10
3684; CHECK-SD-NEXT:    mov v4.s[1], w13
3685; CHECK-SD-NEXT:    mov v7.s[1], w8
3686; CHECK-SD-NEXT:    mov v2.s[1], w15
3687; CHECK-SD-NEXT:    mov v5.s[1], w17
3688; CHECK-SD-NEXT:    mov v6.s[1], w12
3689; CHECK-SD-NEXT:    and v3.8b, v3.8b, v1.8b
3690; CHECK-SD-NEXT:    mov v16.s[1], w9
3691; CHECK-SD-NEXT:    and v0.8b, v0.8b, v1.8b
3692; CHECK-SD-NEXT:    and v4.8b, v4.8b, v1.8b
3693; CHECK-SD-NEXT:    and v7.8b, v7.8b, v1.8b
3694; CHECK-SD-NEXT:    and v2.8b, v2.8b, v1.8b
3695; CHECK-SD-NEXT:    ushll v3.2d, v3.2s, #0
3696; CHECK-SD-NEXT:    and v5.8b, v5.8b, v1.8b
3697; CHECK-SD-NEXT:    and v6.8b, v6.8b, v1.8b
3698; CHECK-SD-NEXT:    and v1.8b, v16.8b, v1.8b
3699; CHECK-SD-NEXT:    ushll v16.2d, v0.2s, #0
3700; CHECK-SD-NEXT:    ushll v17.2d, v4.2s, #0
3701; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
3702; CHECK-SD-NEXT:    ushll v7.2d, v7.2s, #0
3703; CHECK-SD-NEXT:    ucvtf v0.2d, v3.2d
3704; CHECK-SD-NEXT:    ushll v5.2d, v5.2s, #0
3705; CHECK-SD-NEXT:    ushll v6.2d, v6.2s, #0
3706; CHECK-SD-NEXT:    ushll v18.2d, v1.2s, #0
3707; CHECK-SD-NEXT:    ucvtf v1.2d, v16.2d
3708; CHECK-SD-NEXT:    ucvtf v4.2d, v2.2d
3709; CHECK-SD-NEXT:    ucvtf v2.2d, v17.2d
3710; CHECK-SD-NEXT:    ucvtf v3.2d, v7.2d
3711; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
3712; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
3713; CHECK-SD-NEXT:    ucvtf v7.2d, v18.2d
3714; CHECK-SD-NEXT:    ret
3715;
3716; CHECK-GI-LABEL: utofp_v16i8_v16f64:
3717; CHECK-GI:       // %bb.0: // %entry
3718; CHECK-GI-NEXT:    ushll v1.8h, v0.8b, #0
3719; CHECK-GI-NEXT:    ushll2 v0.8h, v0.16b, #0
3720; CHECK-GI-NEXT:    ushll v2.4s, v1.4h, #0
3721; CHECK-GI-NEXT:    ushll2 v1.4s, v1.8h, #0
3722; CHECK-GI-NEXT:    ushll v3.4s, v0.4h, #0
3723; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
3724; CHECK-GI-NEXT:    ushll v4.2d, v2.2s, #0
3725; CHECK-GI-NEXT:    ushll2 v2.2d, v2.4s, #0
3726; CHECK-GI-NEXT:    ushll v5.2d, v1.2s, #0
3727; CHECK-GI-NEXT:    ushll2 v6.2d, v1.4s, #0
3728; CHECK-GI-NEXT:    ushll v7.2d, v3.2s, #0
3729; CHECK-GI-NEXT:    ushll2 v16.2d, v3.4s, #0
3730; CHECK-GI-NEXT:    ushll v17.2d, v0.2s, #0
3731; CHECK-GI-NEXT:    ushll2 v18.2d, v0.4s, #0
3732; CHECK-GI-NEXT:    ucvtf v0.2d, v4.2d
3733; CHECK-GI-NEXT:    ucvtf v1.2d, v2.2d
3734; CHECK-GI-NEXT:    ucvtf v2.2d, v5.2d
3735; CHECK-GI-NEXT:    ucvtf v3.2d, v6.2d
3736; CHECK-GI-NEXT:    ucvtf v4.2d, v7.2d
3737; CHECK-GI-NEXT:    ucvtf v5.2d, v16.2d
3738; CHECK-GI-NEXT:    ucvtf v6.2d, v17.2d
3739; CHECK-GI-NEXT:    ucvtf v7.2d, v18.2d
3740; CHECK-GI-NEXT:    ret
3741entry:
3742  %c = uitofp <16 x i8> %a to <16 x double>
3743  ret <16 x double> %c
3744}
3745
3746define <32 x double> @stofp_v32i8_v32f64(<32 x i8> %a) {
3747; CHECK-SD-LABEL: stofp_v32i8_v32f64:
3748; CHECK-SD:       // %bb.0: // %entry
3749; CHECK-SD-NEXT:    ext v3.16b, v0.16b, v0.16b, #8
3750; CHECK-SD-NEXT:    ext v2.16b, v1.16b, v1.16b, #8
3751; CHECK-SD-NEXT:    umov w9, v3.b[0]
3752; CHECK-SD-NEXT:    umov w11, v3.b[4]
3753; CHECK-SD-NEXT:    umov w13, v3.b[6]
3754; CHECK-SD-NEXT:    umov w18, v2.b[2]
3755; CHECK-SD-NEXT:    umov w10, v3.b[2]
3756; CHECK-SD-NEXT:    umov w12, v3.b[1]
3757; CHECK-SD-NEXT:    umov w16, v2.b[0]
3758; CHECK-SD-NEXT:    umov w14, v3.b[3]
3759; CHECK-SD-NEXT:    umov w15, v3.b[5]
3760; CHECK-SD-NEXT:    umov w17, v3.b[7]
3761; CHECK-SD-NEXT:    fmov s6, w9
3762; CHECK-SD-NEXT:    fmov s5, w11
3763; CHECK-SD-NEXT:    fmov s7, w13
3764; CHECK-SD-NEXT:    umov w13, v2.b[4]
3765; CHECK-SD-NEXT:    umov w11, v2.b[3]
3766; CHECK-SD-NEXT:    umov w9, v2.b[6]
3767; CHECK-SD-NEXT:    fmov s17, w18
3768; CHECK-SD-NEXT:    fmov s4, w10
3769; CHECK-SD-NEXT:    umov w10, v2.b[1]
3770; CHECK-SD-NEXT:    mov v6.s[1], w12
3771; CHECK-SD-NEXT:    fmov s3, w16
3772; CHECK-SD-NEXT:    umov w12, v2.b[5]
3773; CHECK-SD-NEXT:    mov v5.s[1], w15
3774; CHECK-SD-NEXT:    umov w15, v1.b[0]
3775; CHECK-SD-NEXT:    umov w16, v0.b[6]
3776; CHECK-SD-NEXT:    fmov s16, w13
3777; CHECK-SD-NEXT:    umov w13, v1.b[2]
3778; CHECK-SD-NEXT:    mov v17.s[1], w11
3779; CHECK-SD-NEXT:    umov w11, v1.b[6]
3780; CHECK-SD-NEXT:    fmov s18, w9
3781; CHECK-SD-NEXT:    umov w9, v1.b[4]
3782; CHECK-SD-NEXT:    mov v3.s[1], w10
3783; CHECK-SD-NEXT:    umov w10, v0.b[0]
3784; CHECK-SD-NEXT:    mov v4.s[1], w14
3785; CHECK-SD-NEXT:    mov v16.s[1], w12
3786; CHECK-SD-NEXT:    umov w12, v1.b[7]
3787; CHECK-SD-NEXT:    umov w14, v1.b[5]
3788; CHECK-SD-NEXT:    fmov s20, w13
3789; CHECK-SD-NEXT:    umov w13, v1.b[3]
3790; CHECK-SD-NEXT:    fmov s22, w15
3791; CHECK-SD-NEXT:    fmov s21, w11
3792; CHECK-SD-NEXT:    umov w11, v1.b[1]
3793; CHECK-SD-NEXT:    fmov s1, w9
3794; CHECK-SD-NEXT:    fmov s19, w10
3795; CHECK-SD-NEXT:    umov w10, v0.b[4]
3796; CHECK-SD-NEXT:    umov w9, v0.b[7]
3797; CHECK-SD-NEXT:    fmov s23, w16
3798; CHECK-SD-NEXT:    mov v7.s[1], w17
3799; CHECK-SD-NEXT:    shl v17.2s, v17.2s, #24
3800; CHECK-SD-NEXT:    mov v21.s[1], w12
3801; CHECK-SD-NEXT:    mov v1.s[1], w14
3802; CHECK-SD-NEXT:    umov w14, v0.b[5]
3803; CHECK-SD-NEXT:    umov w12, v0.b[1]
3804; CHECK-SD-NEXT:    mov v20.s[1], w13
3805; CHECK-SD-NEXT:    umov w13, v0.b[2]
3806; CHECK-SD-NEXT:    mov v22.s[1], w11
3807; CHECK-SD-NEXT:    umov w11, v0.b[3]
3808; CHECK-SD-NEXT:    fmov s0, w10
3809; CHECK-SD-NEXT:    mov v23.s[1], w9
3810; CHECK-SD-NEXT:    umov w9, v2.b[7]
3811; CHECK-SD-NEXT:    shl v16.2s, v16.2s, #24
3812; CHECK-SD-NEXT:    shl v21.2s, v21.2s, #24
3813; CHECK-SD-NEXT:    shl v1.2s, v1.2s, #24
3814; CHECK-SD-NEXT:    sshr v17.2s, v17.2s, #24
3815; CHECK-SD-NEXT:    mov v0.s[1], w14
3816; CHECK-SD-NEXT:    fmov s24, w13
3817; CHECK-SD-NEXT:    mov v19.s[1], w12
3818; CHECK-SD-NEXT:    sshr v16.2s, v16.2s, #24
3819; CHECK-SD-NEXT:    shl v6.2s, v6.2s, #24
3820; CHECK-SD-NEXT:    shl v20.2s, v20.2s, #24
3821; CHECK-SD-NEXT:    sshr v21.2s, v21.2s, #24
3822; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3823; CHECK-SD-NEXT:    shl v2.2s, v23.2s, #24
3824; CHECK-SD-NEXT:    mov v18.s[1], w9
3825; CHECK-SD-NEXT:    mov v24.s[1], w11
3826; CHECK-SD-NEXT:    shl v22.2s, v22.2s, #24
3827; CHECK-SD-NEXT:    shl v0.2s, v0.2s, #24
3828; CHECK-SD-NEXT:    shl v4.2s, v4.2s, #24
3829; CHECK-SD-NEXT:    shl v5.2s, v5.2s, #24
3830; CHECK-SD-NEXT:    sshll v21.2d, v21.2s, #0
3831; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
3832; CHECK-SD-NEXT:    sshr v2.2s, v2.2s, #24
3833; CHECK-SD-NEXT:    shl v7.2s, v7.2s, #24
3834; CHECK-SD-NEXT:    shl v19.2s, v19.2s, #24
3835; CHECK-SD-NEXT:    sshr v20.2s, v20.2s, #24
3836; CHECK-SD-NEXT:    sshr v0.2s, v0.2s, #24
3837; CHECK-SD-NEXT:    shl v18.2s, v18.2s, #24
3838; CHECK-SD-NEXT:    shl v23.2s, v24.2s, #24
3839; CHECK-SD-NEXT:    scvtf v21.2d, v21.2d
3840; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
3841; CHECK-SD-NEXT:    sshll v2.2d, v2.2s, #0
3842; CHECK-SD-NEXT:    sshr v22.2s, v22.2s, #24
3843; CHECK-SD-NEXT:    sshr v19.2s, v19.2s, #24
3844; CHECK-SD-NEXT:    sshr v5.2s, v5.2s, #24
3845; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3846; CHECK-SD-NEXT:    sshr v23.2s, v23.2s, #24
3847; CHECK-SD-NEXT:    sshr v4.2s, v4.2s, #24
3848; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
3849; CHECK-SD-NEXT:    sshr v6.2s, v6.2s, #24
3850; CHECK-SD-NEXT:    sshll v20.2d, v20.2s, #0
3851; CHECK-SD-NEXT:    stp q1, q21, [x8, #160]
3852; CHECK-SD-NEXT:    shl v1.2s, v3.2s, #24
3853; CHECK-SD-NEXT:    sshr v3.2s, v18.2s, #24
3854; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3855; CHECK-SD-NEXT:    sshll v22.2d, v22.2s, #0
3856; CHECK-SD-NEXT:    sshll v18.2d, v23.2s, #0
3857; CHECK-SD-NEXT:    sshll v19.2d, v19.2s, #0
3858; CHECK-SD-NEXT:    sshll v5.2d, v5.2s, #0
3859; CHECK-SD-NEXT:    sshll v4.2d, v4.2s, #0
3860; CHECK-SD-NEXT:    sshr v1.2s, v1.2s, #24
3861; CHECK-SD-NEXT:    sshll v6.2d, v6.2s, #0
3862; CHECK-SD-NEXT:    scvtf v20.2d, v20.2d
3863; CHECK-SD-NEXT:    scvtf v22.2d, v22.2d
3864; CHECK-SD-NEXT:    stp q0, q2, [x8, #32]
3865; CHECK-SD-NEXT:    sshll v2.2d, v3.2s, #0
3866; CHECK-SD-NEXT:    sshll v3.2d, v16.2s, #0
3867; CHECK-SD-NEXT:    sshll v16.2d, v17.2s, #0
3868; CHECK-SD-NEXT:    sshll v1.2d, v1.2s, #0
3869; CHECK-SD-NEXT:    sshr v0.2s, v7.2s, #24
3870; CHECK-SD-NEXT:    scvtf v7.2d, v18.2d
3871; CHECK-SD-NEXT:    scvtf v17.2d, v19.2d
3872; CHECK-SD-NEXT:    stp q22, q20, [x8, #128]
3873; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
3874; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
3875; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
3876; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
3877; CHECK-SD-NEXT:    sshll v0.2d, v0.2s, #0
3878; CHECK-SD-NEXT:    stp q17, q7, [x8]
3879; CHECK-SD-NEXT:    stp q3, q2, [x8, #224]
3880; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
3881; CHECK-SD-NEXT:    scvtf v2.2d, v5.2d
3882; CHECK-SD-NEXT:    stp q1, q16, [x8, #192]
3883; CHECK-SD-NEXT:    scvtf v3.2d, v4.2d
3884; CHECK-SD-NEXT:    scvtf v1.2d, v6.2d
3885; CHECK-SD-NEXT:    stp q2, q0, [x8, #96]
3886; CHECK-SD-NEXT:    stp q1, q3, [x8, #64]
3887; CHECK-SD-NEXT:    ret
3888;
3889; CHECK-GI-LABEL: stofp_v32i8_v32f64:
3890; CHECK-GI:       // %bb.0: // %entry
3891; CHECK-GI-NEXT:    sshll v2.8h, v0.8b, #0
3892; CHECK-GI-NEXT:    sshll2 v0.8h, v0.16b, #0
3893; CHECK-GI-NEXT:    sshll v4.8h, v1.8b, #0
3894; CHECK-GI-NEXT:    sshll2 v1.8h, v1.16b, #0
3895; CHECK-GI-NEXT:    sshll v3.4s, v2.4h, #0
3896; CHECK-GI-NEXT:    sshll2 v2.4s, v2.8h, #0
3897; CHECK-GI-NEXT:    sshll v6.4s, v0.4h, #0
3898; CHECK-GI-NEXT:    sshll2 v0.4s, v0.8h, #0
3899; CHECK-GI-NEXT:    sshll v16.4s, v4.4h, #0
3900; CHECK-GI-NEXT:    sshll2 v4.4s, v4.8h, #0
3901; CHECK-GI-NEXT:    sshll v18.4s, v1.4h, #0
3902; CHECK-GI-NEXT:    sshll2 v1.4s, v1.8h, #0
3903; CHECK-GI-NEXT:    sshll v5.2d, v3.2s, #0
3904; CHECK-GI-NEXT:    sshll2 v3.2d, v3.4s, #0
3905; CHECK-GI-NEXT:    sshll v7.2d, v2.2s, #0
3906; CHECK-GI-NEXT:    sshll2 v2.2d, v2.4s, #0
3907; CHECK-GI-NEXT:    sshll v17.2d, v6.2s, #0
3908; CHECK-GI-NEXT:    sshll2 v6.2d, v6.4s, #0
3909; CHECK-GI-NEXT:    sshll v19.2d, v0.2s, #0
3910; CHECK-GI-NEXT:    sshll2 v0.2d, v0.4s, #0
3911; CHECK-GI-NEXT:    sshll v20.2d, v16.2s, #0
3912; CHECK-GI-NEXT:    scvtf v5.2d, v5.2d
3913; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
3914; CHECK-GI-NEXT:    scvtf v7.2d, v7.2d
3915; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
3916; CHECK-GI-NEXT:    scvtf v17.2d, v17.2d
3917; CHECK-GI-NEXT:    scvtf v6.2d, v6.2d
3918; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
3919; CHECK-GI-NEXT:    stp q5, q3, [x8]
3920; CHECK-GI-NEXT:    sshll2 v5.2d, v16.4s, #0
3921; CHECK-GI-NEXT:    scvtf v16.2d, v19.2d
3922; CHECK-GI-NEXT:    stp q7, q2, [x8, #32]
3923; CHECK-GI-NEXT:    scvtf v2.2d, v20.2d
3924; CHECK-GI-NEXT:    sshll v3.2d, v4.2s, #0
3925; CHECK-GI-NEXT:    stp q17, q6, [x8, #64]
3926; CHECK-GI-NEXT:    sshll2 v4.2d, v4.4s, #0
3927; CHECK-GI-NEXT:    sshll v6.2d, v18.2s, #0
3928; CHECK-GI-NEXT:    scvtf v5.2d, v5.2d
3929; CHECK-GI-NEXT:    sshll2 v7.2d, v18.4s, #0
3930; CHECK-GI-NEXT:    stp q16, q0, [x8, #96]
3931; CHECK-GI-NEXT:    sshll v0.2d, v1.2s, #0
3932; CHECK-GI-NEXT:    sshll2 v1.2d, v1.4s, #0
3933; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
3934; CHECK-GI-NEXT:    scvtf v4.2d, v4.2d
3935; CHECK-GI-NEXT:    scvtf v6.2d, v6.2d
3936; CHECK-GI-NEXT:    stp q2, q5, [x8, #128]
3937; CHECK-GI-NEXT:    scvtf v2.2d, v7.2d
3938; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
3939; CHECK-GI-NEXT:    scvtf v1.2d, v1.2d
3940; CHECK-GI-NEXT:    stp q3, q4, [x8, #160]
3941; CHECK-GI-NEXT:    stp q6, q2, [x8, #192]
3942; CHECK-GI-NEXT:    stp q0, q1, [x8, #224]
3943; CHECK-GI-NEXT:    ret
3944entry:
3945  %c = sitofp <32 x i8> %a to <32 x double>
3946  ret <32 x double> %c
3947}
3948
3949define <32 x double> @utofp_v32i8_v32f64(<32 x i8> %a) {
3950; CHECK-SD-LABEL: utofp_v32i8_v32f64:
3951; CHECK-SD:       // %bb.0: // %entry
3952; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
3953; CHECK-SD-NEXT:    ext v16.16b, v1.16b, v1.16b, #8
3954; CHECK-SD-NEXT:    movi d3, #0x0000ff000000ff
3955; CHECK-SD-NEXT:    umov w11, v2.b[0]
3956; CHECK-SD-NEXT:    umov w14, v2.b[4]
3957; CHECK-SD-NEXT:    umov w12, v2.b[2]
3958; CHECK-SD-NEXT:    umov w15, v2.b[6]
3959; CHECK-SD-NEXT:    umov w16, v2.b[1]
3960; CHECK-SD-NEXT:    umov w13, v16.b[2]
3961; CHECK-SD-NEXT:    umov w17, v16.b[0]
3962; CHECK-SD-NEXT:    umov w9, v2.b[3]
3963; CHECK-SD-NEXT:    umov w10, v2.b[5]
3964; CHECK-SD-NEXT:    fmov s4, w11
3965; CHECK-SD-NEXT:    fmov s6, w14
3966; CHECK-SD-NEXT:    umov w14, v16.b[6]
3967; CHECK-SD-NEXT:    fmov s5, w12
3968; CHECK-SD-NEXT:    umov w12, v16.b[4]
3969; CHECK-SD-NEXT:    umov w11, v16.b[1]
3970; CHECK-SD-NEXT:    fmov s7, w15
3971; CHECK-SD-NEXT:    umov w15, v16.b[7]
3972; CHECK-SD-NEXT:    fmov s18, w13
3973; CHECK-SD-NEXT:    mov v4.s[1], w16
3974; CHECK-SD-NEXT:    umov w16, v1.b[4]
3975; CHECK-SD-NEXT:    umov w13, v1.b[6]
3976; CHECK-SD-NEXT:    fmov s17, w17
3977; CHECK-SD-NEXT:    fmov s20, w14
3978; CHECK-SD-NEXT:    mov v5.s[1], w9
3979; CHECK-SD-NEXT:    umov w9, v1.b[7]
3980; CHECK-SD-NEXT:    fmov s19, w12
3981; CHECK-SD-NEXT:    mov v6.s[1], w10
3982; CHECK-SD-NEXT:    umov w10, v1.b[2]
3983; CHECK-SD-NEXT:    umov w12, v0.b[6]
3984; CHECK-SD-NEXT:    umov w14, v1.b[0]
3985; CHECK-SD-NEXT:    mov v17.s[1], w11
3986; CHECK-SD-NEXT:    mov v20.s[1], w15
3987; CHECK-SD-NEXT:    umov w11, v1.b[5]
3988; CHECK-SD-NEXT:    umov w15, v1.b[3]
3989; CHECK-SD-NEXT:    fmov s21, w16
3990; CHECK-SD-NEXT:    umov w16, v1.b[1]
3991; CHECK-SD-NEXT:    fmov s1, w13
3992; CHECK-SD-NEXT:    umov w13, v0.b[4]
3993; CHECK-SD-NEXT:    and v6.8b, v6.8b, v3.8b
3994; CHECK-SD-NEXT:    fmov s22, w10
3995; CHECK-SD-NEXT:    fmov s23, w12
3996; CHECK-SD-NEXT:    fmov s24, w14
3997; CHECK-SD-NEXT:    mov v21.s[1], w11
3998; CHECK-SD-NEXT:    umov w10, v0.b[5]
3999; CHECK-SD-NEXT:    umov w12, v0.b[0]
4000; CHECK-SD-NEXT:    mov v1.s[1], w9
4001; CHECK-SD-NEXT:    umov w9, v0.b[7]
4002; CHECK-SD-NEXT:    umov w11, v16.b[3]
4003; CHECK-SD-NEXT:    mov v22.s[1], w15
4004; CHECK-SD-NEXT:    mov v24.s[1], w16
4005; CHECK-SD-NEXT:    fmov s25, w13
4006; CHECK-SD-NEXT:    umov w13, v0.b[3]
4007; CHECK-SD-NEXT:    and v20.8b, v20.8b, v3.8b
4008; CHECK-SD-NEXT:    and v5.8b, v5.8b, v3.8b
4009; CHECK-SD-NEXT:    and v21.8b, v21.8b, v3.8b
4010; CHECK-SD-NEXT:    mov v23.s[1], w9
4011; CHECK-SD-NEXT:    umov w9, v0.b[2]
4012; CHECK-SD-NEXT:    and v1.8b, v1.8b, v3.8b
4013; CHECK-SD-NEXT:    mov v25.s[1], w10
4014; CHECK-SD-NEXT:    umov w10, v0.b[1]
4015; CHECK-SD-NEXT:    and v0.8b, v22.8b, v3.8b
4016; CHECK-SD-NEXT:    fmov s22, w12
4017; CHECK-SD-NEXT:    and v24.8b, v24.8b, v3.8b
4018; CHECK-SD-NEXT:    umov w12, v16.b[5]
4019; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
4020; CHECK-SD-NEXT:    ushll v21.2d, v21.2s, #0
4021; CHECK-SD-NEXT:    mov v18.s[1], w11
4022; CHECK-SD-NEXT:    and v16.8b, v23.8b, v3.8b
4023; CHECK-SD-NEXT:    fmov s23, w9
4024; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
4025; CHECK-SD-NEXT:    and v25.8b, v25.8b, v3.8b
4026; CHECK-SD-NEXT:    ushll v24.2d, v24.2s, #0
4027; CHECK-SD-NEXT:    mov v22.s[1], w10
4028; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
4029; CHECK-SD-NEXT:    ucvtf v21.2d, v21.2d
4030; CHECK-SD-NEXT:    umov w9, v2.b[7]
4031; CHECK-SD-NEXT:    mov v23.s[1], w13
4032; CHECK-SD-NEXT:    ushll v16.2d, v16.2s, #0
4033; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
4034; CHECK-SD-NEXT:    ushll v2.2d, v25.2s, #0
4035; CHECK-SD-NEXT:    mov v19.s[1], w12
4036; CHECK-SD-NEXT:    ucvtf v24.2d, v24.2d
4037; CHECK-SD-NEXT:    and v18.8b, v18.8b, v3.8b
4038; CHECK-SD-NEXT:    stp q21, q1, [x8, #160]
4039; CHECK-SD-NEXT:    and v1.8b, v22.8b, v3.8b
4040; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
4041; CHECK-SD-NEXT:    and v23.8b, v23.8b, v3.8b
4042; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
4043; CHECK-SD-NEXT:    mov v7.s[1], w9
4044; CHECK-SD-NEXT:    stp q24, q0, [x8, #128]
4045; CHECK-SD-NEXT:    and v0.8b, v19.8b, v3.8b
4046; CHECK-SD-NEXT:    ushll v18.2d, v18.2s, #0
4047; CHECK-SD-NEXT:    ushll v1.2d, v1.2s, #0
4048; CHECK-SD-NEXT:    ushll v19.2d, v23.2s, #0
4049; CHECK-SD-NEXT:    stp q2, q16, [x8, #32]
4050; CHECK-SD-NEXT:    and v16.8b, v17.8b, v3.8b
4051; CHECK-SD-NEXT:    ushll v17.2d, v20.2s, #0
4052; CHECK-SD-NEXT:    and v2.8b, v7.8b, v3.8b
4053; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
4054; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
4055; CHECK-SD-NEXT:    ucvtf v7.2d, v19.2d
4056; CHECK-SD-NEXT:    and v3.8b, v4.8b, v3.8b
4057; CHECK-SD-NEXT:    ushll v4.2d, v6.2s, #0
4058; CHECK-SD-NEXT:    ucvtf v17.2d, v17.2d
4059; CHECK-SD-NEXT:    ushll v16.2d, v16.2s, #0
4060; CHECK-SD-NEXT:    ucvtf v6.2d, v18.2d
4061; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
4062; CHECK-SD-NEXT:    ushll v2.2d, v2.2s, #0
4063; CHECK-SD-NEXT:    ushll v3.2d, v3.2s, #0
4064; CHECK-SD-NEXT:    stp q1, q7, [x8]
4065; CHECK-SD-NEXT:    ushll v1.2d, v5.2s, #0
4066; CHECK-SD-NEXT:    ucvtf v5.2d, v16.2d
4067; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
4068; CHECK-SD-NEXT:    stp q0, q17, [x8, #224]
4069; CHECK-SD-NEXT:    ucvtf v0.2d, v4.2d
4070; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
4071; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
4072; CHECK-SD-NEXT:    stp q5, q6, [x8, #192]
4073; CHECK-SD-NEXT:    stp q0, q2, [x8, #96]
4074; CHECK-SD-NEXT:    stp q3, q1, [x8, #64]
4075; CHECK-SD-NEXT:    ret
4076;
4077; CHECK-GI-LABEL: utofp_v32i8_v32f64:
4078; CHECK-GI:       // %bb.0: // %entry
4079; CHECK-GI-NEXT:    ushll v2.8h, v0.8b, #0
4080; CHECK-GI-NEXT:    ushll2 v0.8h, v0.16b, #0
4081; CHECK-GI-NEXT:    ushll v4.8h, v1.8b, #0
4082; CHECK-GI-NEXT:    ushll2 v1.8h, v1.16b, #0
4083; CHECK-GI-NEXT:    ushll v3.4s, v2.4h, #0
4084; CHECK-GI-NEXT:    ushll2 v2.4s, v2.8h, #0
4085; CHECK-GI-NEXT:    ushll v6.4s, v0.4h, #0
4086; CHECK-GI-NEXT:    ushll2 v0.4s, v0.8h, #0
4087; CHECK-GI-NEXT:    ushll v16.4s, v4.4h, #0
4088; CHECK-GI-NEXT:    ushll2 v4.4s, v4.8h, #0
4089; CHECK-GI-NEXT:    ushll v18.4s, v1.4h, #0
4090; CHECK-GI-NEXT:    ushll2 v1.4s, v1.8h, #0
4091; CHECK-GI-NEXT:    ushll v5.2d, v3.2s, #0
4092; CHECK-GI-NEXT:    ushll2 v3.2d, v3.4s, #0
4093; CHECK-GI-NEXT:    ushll v7.2d, v2.2s, #0
4094; CHECK-GI-NEXT:    ushll2 v2.2d, v2.4s, #0
4095; CHECK-GI-NEXT:    ushll v17.2d, v6.2s, #0
4096; CHECK-GI-NEXT:    ushll2 v6.2d, v6.4s, #0
4097; CHECK-GI-NEXT:    ushll v19.2d, v0.2s, #0
4098; CHECK-GI-NEXT:    ushll2 v0.2d, v0.4s, #0
4099; CHECK-GI-NEXT:    ushll v20.2d, v16.2s, #0
4100; CHECK-GI-NEXT:    ucvtf v5.2d, v5.2d
4101; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
4102; CHECK-GI-NEXT:    ucvtf v7.2d, v7.2d
4103; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
4104; CHECK-GI-NEXT:    ucvtf v17.2d, v17.2d
4105; CHECK-GI-NEXT:    ucvtf v6.2d, v6.2d
4106; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
4107; CHECK-GI-NEXT:    stp q5, q3, [x8]
4108; CHECK-GI-NEXT:    ushll2 v5.2d, v16.4s, #0
4109; CHECK-GI-NEXT:    ucvtf v16.2d, v19.2d
4110; CHECK-GI-NEXT:    stp q7, q2, [x8, #32]
4111; CHECK-GI-NEXT:    ucvtf v2.2d, v20.2d
4112; CHECK-GI-NEXT:    ushll v3.2d, v4.2s, #0
4113; CHECK-GI-NEXT:    stp q17, q6, [x8, #64]
4114; CHECK-GI-NEXT:    ushll2 v4.2d, v4.4s, #0
4115; CHECK-GI-NEXT:    ushll v6.2d, v18.2s, #0
4116; CHECK-GI-NEXT:    ucvtf v5.2d, v5.2d
4117; CHECK-GI-NEXT:    ushll2 v7.2d, v18.4s, #0
4118; CHECK-GI-NEXT:    stp q16, q0, [x8, #96]
4119; CHECK-GI-NEXT:    ushll v0.2d, v1.2s, #0
4120; CHECK-GI-NEXT:    ushll2 v1.2d, v1.4s, #0
4121; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
4122; CHECK-GI-NEXT:    ucvtf v4.2d, v4.2d
4123; CHECK-GI-NEXT:    ucvtf v6.2d, v6.2d
4124; CHECK-GI-NEXT:    stp q2, q5, [x8, #128]
4125; CHECK-GI-NEXT:    ucvtf v2.2d, v7.2d
4126; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
4127; CHECK-GI-NEXT:    ucvtf v1.2d, v1.2d
4128; CHECK-GI-NEXT:    stp q3, q4, [x8, #160]
4129; CHECK-GI-NEXT:    stp q6, q2, [x8, #192]
4130; CHECK-GI-NEXT:    stp q0, q1, [x8, #224]
4131; CHECK-GI-NEXT:    ret
4132entry:
4133  %c = uitofp <32 x i8> %a to <32 x double>
4134  ret <32 x double> %c
4135}
4136
4137define <2 x float> @stofp_v2i128_v2f32(<2 x i128> %a) {
4138; CHECK-SD-LABEL: stofp_v2i128_v2f32:
4139; CHECK-SD:       // %bb.0: // %entry
4140; CHECK-SD-NEXT:    sub sp, sp, #48
4141; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4142; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
4143; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
4144; CHECK-SD-NEXT:    .cfi_offset w19, -8
4145; CHECK-SD-NEXT:    .cfi_offset w20, -16
4146; CHECK-SD-NEXT:    .cfi_offset w30, -32
4147; CHECK-SD-NEXT:    mov x19, x1
4148; CHECK-SD-NEXT:    mov x20, x0
4149; CHECK-SD-NEXT:    mov x0, x2
4150; CHECK-SD-NEXT:    mov x1, x3
4151; CHECK-SD-NEXT:    bl __floattisf
4152; CHECK-SD-NEXT:    mov x0, x20
4153; CHECK-SD-NEXT:    mov x1, x19
4154; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4155; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4156; CHECK-SD-NEXT:    bl __floattisf
4157; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4158; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4159; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
4160; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4161; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
4162; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
4163; CHECK-SD-NEXT:    add sp, sp, #48
4164; CHECK-SD-NEXT:    ret
4165;
4166; CHECK-GI-LABEL: stofp_v2i128_v2f32:
4167; CHECK-GI:       // %bb.0: // %entry
4168; CHECK-GI-NEXT:    sub sp, sp, #48
4169; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4170; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
4171; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
4172; CHECK-GI-NEXT:    .cfi_offset w19, -8
4173; CHECK-GI-NEXT:    .cfi_offset w20, -16
4174; CHECK-GI-NEXT:    .cfi_offset w30, -32
4175; CHECK-GI-NEXT:    mov x19, x2
4176; CHECK-GI-NEXT:    mov x20, x3
4177; CHECK-GI-NEXT:    bl __floattisf
4178; CHECK-GI-NEXT:    mov x0, x19
4179; CHECK-GI-NEXT:    mov x1, x20
4180; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4181; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
4182; CHECK-GI-NEXT:    bl __floattisf
4183; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4184; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4185; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
4186; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4187; CHECK-GI-NEXT:    mov v1.s[1], v0.s[0]
4188; CHECK-GI-NEXT:    fmov d0, d1
4189; CHECK-GI-NEXT:    add sp, sp, #48
4190; CHECK-GI-NEXT:    ret
4191entry:
4192  %c = sitofp <2 x i128> %a to <2 x float>
4193  ret <2 x float> %c
4194}
4195
4196define <2 x float> @utofp_v2i128_v2f32(<2 x i128> %a) {
4197; CHECK-SD-LABEL: utofp_v2i128_v2f32:
4198; CHECK-SD:       // %bb.0: // %entry
4199; CHECK-SD-NEXT:    sub sp, sp, #48
4200; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4201; CHECK-SD-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
4202; CHECK-SD-NEXT:    .cfi_def_cfa_offset 48
4203; CHECK-SD-NEXT:    .cfi_offset w19, -8
4204; CHECK-SD-NEXT:    .cfi_offset w20, -16
4205; CHECK-SD-NEXT:    .cfi_offset w30, -32
4206; CHECK-SD-NEXT:    mov x19, x1
4207; CHECK-SD-NEXT:    mov x20, x0
4208; CHECK-SD-NEXT:    mov x0, x2
4209; CHECK-SD-NEXT:    mov x1, x3
4210; CHECK-SD-NEXT:    bl __floatuntisf
4211; CHECK-SD-NEXT:    mov x0, x20
4212; CHECK-SD-NEXT:    mov x1, x19
4213; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4214; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4215; CHECK-SD-NEXT:    bl __floatuntisf
4216; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4217; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4218; CHECK-SD-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
4219; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4220; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
4221; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
4222; CHECK-SD-NEXT:    add sp, sp, #48
4223; CHECK-SD-NEXT:    ret
4224;
4225; CHECK-GI-LABEL: utofp_v2i128_v2f32:
4226; CHECK-GI:       // %bb.0: // %entry
4227; CHECK-GI-NEXT:    sub sp, sp, #48
4228; CHECK-GI-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4229; CHECK-GI-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
4230; CHECK-GI-NEXT:    .cfi_def_cfa_offset 48
4231; CHECK-GI-NEXT:    .cfi_offset w19, -8
4232; CHECK-GI-NEXT:    .cfi_offset w20, -16
4233; CHECK-GI-NEXT:    .cfi_offset w30, -32
4234; CHECK-GI-NEXT:    mov x19, x2
4235; CHECK-GI-NEXT:    mov x20, x3
4236; CHECK-GI-NEXT:    bl __floatuntisf
4237; CHECK-GI-NEXT:    mov x0, x19
4238; CHECK-GI-NEXT:    mov x1, x20
4239; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4240; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
4241; CHECK-GI-NEXT:    bl __floatuntisf
4242; CHECK-GI-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4243; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4244; CHECK-GI-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
4245; CHECK-GI-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4246; CHECK-GI-NEXT:    mov v1.s[1], v0.s[0]
4247; CHECK-GI-NEXT:    fmov d0, d1
4248; CHECK-GI-NEXT:    add sp, sp, #48
4249; CHECK-GI-NEXT:    ret
4250entry:
4251  %c = uitofp <2 x i128> %a to <2 x float>
4252  ret <2 x float> %c
4253}
4254
4255define <3 x float> @stofp_v3i128_v3f32(<3 x i128> %a) {
4256; CHECK-SD-LABEL: stofp_v3i128_v3f32:
4257; CHECK-SD:       // %bb.0: // %entry
4258; CHECK-SD-NEXT:    sub sp, sp, #64
4259; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4260; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
4261; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
4262; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
4263; CHECK-SD-NEXT:    .cfi_offset w19, -8
4264; CHECK-SD-NEXT:    .cfi_offset w20, -16
4265; CHECK-SD-NEXT:    .cfi_offset w21, -24
4266; CHECK-SD-NEXT:    .cfi_offset w22, -32
4267; CHECK-SD-NEXT:    .cfi_offset w30, -48
4268; CHECK-SD-NEXT:    mov x21, x1
4269; CHECK-SD-NEXT:    mov x22, x0
4270; CHECK-SD-NEXT:    mov x0, x2
4271; CHECK-SD-NEXT:    mov x1, x3
4272; CHECK-SD-NEXT:    mov x19, x5
4273; CHECK-SD-NEXT:    mov x20, x4
4274; CHECK-SD-NEXT:    bl __floattisf
4275; CHECK-SD-NEXT:    mov x0, x22
4276; CHECK-SD-NEXT:    mov x1, x21
4277; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4278; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4279; CHECK-SD-NEXT:    bl __floattisf
4280; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4281; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4282; CHECK-SD-NEXT:    mov x0, x20
4283; CHECK-SD-NEXT:    mov x1, x19
4284; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
4285; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4286; CHECK-SD-NEXT:    bl __floattisf
4287; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4288; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4289; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
4290; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
4291; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4292; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
4293; CHECK-SD-NEXT:    mov v0.16b, v1.16b
4294; CHECK-SD-NEXT:    add sp, sp, #64
4295; CHECK-SD-NEXT:    ret
4296;
4297; CHECK-GI-LABEL: stofp_v3i128_v3f32:
4298; CHECK-GI:       // %bb.0: // %entry
4299; CHECK-GI-NEXT:    sub sp, sp, #80
4300; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
4301; CHECK-GI-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
4302; CHECK-GI-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
4303; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
4304; CHECK-GI-NEXT:    .cfi_offset w19, -8
4305; CHECK-GI-NEXT:    .cfi_offset w20, -16
4306; CHECK-GI-NEXT:    .cfi_offset w21, -24
4307; CHECK-GI-NEXT:    .cfi_offset w22, -32
4308; CHECK-GI-NEXT:    .cfi_offset w30, -48
4309; CHECK-GI-NEXT:    mov x19, x2
4310; CHECK-GI-NEXT:    mov x20, x3
4311; CHECK-GI-NEXT:    mov x21, x4
4312; CHECK-GI-NEXT:    mov x22, x5
4313; CHECK-GI-NEXT:    bl __floattisf
4314; CHECK-GI-NEXT:    mov x0, x19
4315; CHECK-GI-NEXT:    mov x1, x20
4316; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4317; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
4318; CHECK-GI-NEXT:    bl __floattisf
4319; CHECK-GI-NEXT:    mov x0, x21
4320; CHECK-GI-NEXT:    mov x1, x22
4321; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4322; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
4323; CHECK-GI-NEXT:    bl __floattisf
4324; CHECK-GI-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
4325; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4326; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
4327; CHECK-GI-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
4328; CHECK-GI-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
4329; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
4330; CHECK-GI-NEXT:    mov v1.s[2], v0.s[0]
4331; CHECK-GI-NEXT:    mov v0.16b, v1.16b
4332; CHECK-GI-NEXT:    add sp, sp, #80
4333; CHECK-GI-NEXT:    ret
4334entry:
4335  %c = sitofp <3 x i128> %a to <3 x float>
4336  ret <3 x float> %c
4337}
4338
4339define <3 x float> @utofp_v3i128_v3f32(<3 x i128> %a) {
4340; CHECK-SD-LABEL: utofp_v3i128_v3f32:
4341; CHECK-SD:       // %bb.0: // %entry
4342; CHECK-SD-NEXT:    sub sp, sp, #64
4343; CHECK-SD-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
4344; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
4345; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
4346; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
4347; CHECK-SD-NEXT:    .cfi_offset w19, -8
4348; CHECK-SD-NEXT:    .cfi_offset w20, -16
4349; CHECK-SD-NEXT:    .cfi_offset w21, -24
4350; CHECK-SD-NEXT:    .cfi_offset w22, -32
4351; CHECK-SD-NEXT:    .cfi_offset w30, -48
4352; CHECK-SD-NEXT:    mov x21, x1
4353; CHECK-SD-NEXT:    mov x22, x0
4354; CHECK-SD-NEXT:    mov x0, x2
4355; CHECK-SD-NEXT:    mov x1, x3
4356; CHECK-SD-NEXT:    mov x19, x5
4357; CHECK-SD-NEXT:    mov x20, x4
4358; CHECK-SD-NEXT:    bl __floatuntisf
4359; CHECK-SD-NEXT:    mov x0, x22
4360; CHECK-SD-NEXT:    mov x1, x21
4361; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4362; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4363; CHECK-SD-NEXT:    bl __floatuntisf
4364; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4365; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4366; CHECK-SD-NEXT:    mov x0, x20
4367; CHECK-SD-NEXT:    mov x1, x19
4368; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
4369; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
4370; CHECK-SD-NEXT:    bl __floatuntisf
4371; CHECK-SD-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
4372; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
4373; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
4374; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
4375; CHECK-SD-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
4376; CHECK-SD-NEXT:    mov v1.s[2], v0.s[0]
4377; CHECK-SD-NEXT:    mov v0.16b, v1.16b
4378; CHECK-SD-NEXT:    add sp, sp, #64
4379; CHECK-SD-NEXT:    ret
4380;
4381; CHECK-GI-LABEL: utofp_v3i128_v3f32:
4382; CHECK-GI:       // %bb.0: // %entry
4383; CHECK-GI-NEXT:    sub sp, sp, #80
4384; CHECK-GI-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
4385; CHECK-GI-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
4386; CHECK-GI-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
4387; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
4388; CHECK-GI-NEXT:    .cfi_offset w19, -8
4389; CHECK-GI-NEXT:    .cfi_offset w20, -16
4390; CHECK-GI-NEXT:    .cfi_offset w21, -24
4391; CHECK-GI-NEXT:    .cfi_offset w22, -32
4392; CHECK-GI-NEXT:    .cfi_offset w30, -48
4393; CHECK-GI-NEXT:    mov x19, x2
4394; CHECK-GI-NEXT:    mov x20, x3
4395; CHECK-GI-NEXT:    mov x21, x4
4396; CHECK-GI-NEXT:    mov x22, x5
4397; CHECK-GI-NEXT:    bl __floatuntisf
4398; CHECK-GI-NEXT:    mov x0, x19
4399; CHECK-GI-NEXT:    mov x1, x20
4400; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4401; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
4402; CHECK-GI-NEXT:    bl __floatuntisf
4403; CHECK-GI-NEXT:    mov x0, x21
4404; CHECK-GI-NEXT:    mov x1, x22
4405; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4406; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
4407; CHECK-GI-NEXT:    bl __floatuntisf
4408; CHECK-GI-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
4409; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
4410; CHECK-GI-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
4411; CHECK-GI-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
4412; CHECK-GI-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
4413; CHECK-GI-NEXT:    mov v1.s[1], v2.s[0]
4414; CHECK-GI-NEXT:    mov v1.s[2], v0.s[0]
4415; CHECK-GI-NEXT:    mov v0.16b, v1.16b
4416; CHECK-GI-NEXT:    add sp, sp, #80
4417; CHECK-GI-NEXT:    ret
4418entry:
4419  %c = uitofp <3 x i128> %a to <3 x float>
4420  ret <3 x float> %c
4421}
4422
4423define <2 x float> @stofp_v2i64_v2f32(<2 x i64> %a) {
4424; CHECK-LABEL: stofp_v2i64_v2f32:
4425; CHECK:       // %bb.0: // %entry
4426; CHECK-NEXT:    scvtf v0.2d, v0.2d
4427; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4428; CHECK-NEXT:    ret
4429entry:
4430  %c = sitofp <2 x i64> %a to <2 x float>
4431  ret <2 x float> %c
4432}
4433
4434define <2 x float> @utofp_v2i64_v2f32(<2 x i64> %a) {
4435; CHECK-LABEL: utofp_v2i64_v2f32:
4436; CHECK:       // %bb.0: // %entry
4437; CHECK-NEXT:    ucvtf v0.2d, v0.2d
4438; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4439; CHECK-NEXT:    ret
4440entry:
4441  %c = uitofp <2 x i64> %a to <2 x float>
4442  ret <2 x float> %c
4443}
4444
4445define <3 x float> @stofp_v3i64_v3f32(<3 x i64> %a) {
4446; CHECK-SD-LABEL: stofp_v3i64_v3f32:
4447; CHECK-SD:       // %bb.0: // %entry
4448; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
4449; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
4450; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
4451; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
4452; CHECK-SD-NEXT:    scvtf v1.2d, v2.2d
4453; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
4454; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4455; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
4456; CHECK-SD-NEXT:    ret
4457;
4458; CHECK-GI-LABEL: stofp_v3i64_v3f32:
4459; CHECK-GI:       // %bb.0: // %entry
4460; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
4461; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
4462; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
4463; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
4464; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
4465; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
4466; CHECK-GI-NEXT:    fcvtn v2.2s, v2.2d
4467; CHECK-GI-NEXT:    fcvtn v1.2s, v0.2d
4468; CHECK-GI-NEXT:    mov v0.s[0], v1.s[0]
4469; CHECK-GI-NEXT:    mov v0.s[1], v1.s[1]
4470; CHECK-GI-NEXT:    mov v0.s[2], v2.s[0]
4471; CHECK-GI-NEXT:    ret
4472entry:
4473  %c = sitofp <3 x i64> %a to <3 x float>
4474  ret <3 x float> %c
4475}
4476
4477define <3 x float> @utofp_v3i64_v3f32(<3 x i64> %a) {
4478; CHECK-SD-LABEL: utofp_v3i64_v3f32:
4479; CHECK-SD:       // %bb.0: // %entry
4480; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
4481; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
4482; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
4483; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
4484; CHECK-SD-NEXT:    ucvtf v1.2d, v2.2d
4485; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
4486; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4487; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
4488; CHECK-SD-NEXT:    ret
4489;
4490; CHECK-GI-LABEL: utofp_v3i64_v3f32:
4491; CHECK-GI:       // %bb.0: // %entry
4492; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
4493; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
4494; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
4495; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
4496; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
4497; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
4498; CHECK-GI-NEXT:    fcvtn v2.2s, v2.2d
4499; CHECK-GI-NEXT:    fcvtn v1.2s, v0.2d
4500; CHECK-GI-NEXT:    mov v0.s[0], v1.s[0]
4501; CHECK-GI-NEXT:    mov v0.s[1], v1.s[1]
4502; CHECK-GI-NEXT:    mov v0.s[2], v2.s[0]
4503; CHECK-GI-NEXT:    ret
4504entry:
4505  %c = uitofp <3 x i64> %a to <3 x float>
4506  ret <3 x float> %c
4507}
4508
4509define <4 x float> @stofp_v4i64_v4f32(<4 x i64> %a) {
4510; CHECK-LABEL: stofp_v4i64_v4f32:
4511; CHECK:       // %bb.0: // %entry
4512; CHECK-NEXT:    scvtf v0.2d, v0.2d
4513; CHECK-NEXT:    scvtf v1.2d, v1.2d
4514; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4515; CHECK-NEXT:    fcvtn2 v0.4s, v1.2d
4516; CHECK-NEXT:    ret
4517entry:
4518  %c = sitofp <4 x i64> %a to <4 x float>
4519  ret <4 x float> %c
4520}
4521
4522define <4 x float> @utofp_v4i64_v4f32(<4 x i64> %a) {
4523; CHECK-LABEL: utofp_v4i64_v4f32:
4524; CHECK:       // %bb.0: // %entry
4525; CHECK-NEXT:    ucvtf v0.2d, v0.2d
4526; CHECK-NEXT:    ucvtf v1.2d, v1.2d
4527; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4528; CHECK-NEXT:    fcvtn2 v0.4s, v1.2d
4529; CHECK-NEXT:    ret
4530entry:
4531  %c = uitofp <4 x i64> %a to <4 x float>
4532  ret <4 x float> %c
4533}
4534
4535define <8 x float> @stofp_v8i64_v8f32(<8 x i64> %a) {
4536; CHECK-SD-LABEL: stofp_v8i64_v8f32:
4537; CHECK-SD:       // %bb.0: // %entry
4538; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
4539; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
4540; CHECK-SD-NEXT:    scvtf v4.2d, v1.2d
4541; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4542; CHECK-SD-NEXT:    fcvtn v1.2s, v2.2d
4543; CHECK-SD-NEXT:    scvtf v2.2d, v3.2d
4544; CHECK-SD-NEXT:    fcvtn2 v0.4s, v4.2d
4545; CHECK-SD-NEXT:    fcvtn2 v1.4s, v2.2d
4546; CHECK-SD-NEXT:    ret
4547;
4548; CHECK-GI-LABEL: stofp_v8i64_v8f32:
4549; CHECK-GI:       // %bb.0: // %entry
4550; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
4551; CHECK-GI-NEXT:    scvtf v2.2d, v2.2d
4552; CHECK-GI-NEXT:    scvtf v4.2d, v1.2d
4553; CHECK-GI-NEXT:    scvtf v3.2d, v3.2d
4554; CHECK-GI-NEXT:    fcvtn v0.2s, v0.2d
4555; CHECK-GI-NEXT:    fcvtn v1.2s, v2.2d
4556; CHECK-GI-NEXT:    fcvtn2 v0.4s, v4.2d
4557; CHECK-GI-NEXT:    fcvtn2 v1.4s, v3.2d
4558; CHECK-GI-NEXT:    ret
4559entry:
4560  %c = sitofp <8 x i64> %a to <8 x float>
4561  ret <8 x float> %c
4562}
4563
4564define <8 x float> @utofp_v8i64_v8f32(<8 x i64> %a) {
4565; CHECK-SD-LABEL: utofp_v8i64_v8f32:
4566; CHECK-SD:       // %bb.0: // %entry
4567; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
4568; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
4569; CHECK-SD-NEXT:    ucvtf v4.2d, v1.2d
4570; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4571; CHECK-SD-NEXT:    fcvtn v1.2s, v2.2d
4572; CHECK-SD-NEXT:    ucvtf v2.2d, v3.2d
4573; CHECK-SD-NEXT:    fcvtn2 v0.4s, v4.2d
4574; CHECK-SD-NEXT:    fcvtn2 v1.4s, v2.2d
4575; CHECK-SD-NEXT:    ret
4576;
4577; CHECK-GI-LABEL: utofp_v8i64_v8f32:
4578; CHECK-GI:       // %bb.0: // %entry
4579; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
4580; CHECK-GI-NEXT:    ucvtf v2.2d, v2.2d
4581; CHECK-GI-NEXT:    ucvtf v4.2d, v1.2d
4582; CHECK-GI-NEXT:    ucvtf v3.2d, v3.2d
4583; CHECK-GI-NEXT:    fcvtn v0.2s, v0.2d
4584; CHECK-GI-NEXT:    fcvtn v1.2s, v2.2d
4585; CHECK-GI-NEXT:    fcvtn2 v0.4s, v4.2d
4586; CHECK-GI-NEXT:    fcvtn2 v1.4s, v3.2d
4587; CHECK-GI-NEXT:    ret
4588entry:
4589  %c = uitofp <8 x i64> %a to <8 x float>
4590  ret <8 x float> %c
4591}
4592
4593define <16 x float> @stofp_v16i64_v16f32(<16 x i64> %a) {
4594; CHECK-LABEL: stofp_v16i64_v16f32:
4595; CHECK:       // %bb.0: // %entry
4596; CHECK-NEXT:    scvtf v0.2d, v0.2d
4597; CHECK-NEXT:    scvtf v2.2d, v2.2d
4598; CHECK-NEXT:    scvtf v4.2d, v4.2d
4599; CHECK-NEXT:    scvtf v6.2d, v6.2d
4600; CHECK-NEXT:    scvtf v16.2d, v1.2d
4601; CHECK-NEXT:    scvtf v17.2d, v3.2d
4602; CHECK-NEXT:    scvtf v5.2d, v5.2d
4603; CHECK-NEXT:    scvtf v7.2d, v7.2d
4604; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4605; CHECK-NEXT:    fcvtn v1.2s, v2.2d
4606; CHECK-NEXT:    fcvtn v2.2s, v4.2d
4607; CHECK-NEXT:    fcvtn v3.2s, v6.2d
4608; CHECK-NEXT:    fcvtn2 v0.4s, v16.2d
4609; CHECK-NEXT:    fcvtn2 v1.4s, v17.2d
4610; CHECK-NEXT:    fcvtn2 v2.4s, v5.2d
4611; CHECK-NEXT:    fcvtn2 v3.4s, v7.2d
4612; CHECK-NEXT:    ret
4613entry:
4614  %c = sitofp <16 x i64> %a to <16 x float>
4615  ret <16 x float> %c
4616}
4617
4618define <16 x float> @utofp_v16i64_v16f32(<16 x i64> %a) {
4619; CHECK-LABEL: utofp_v16i64_v16f32:
4620; CHECK:       // %bb.0: // %entry
4621; CHECK-NEXT:    ucvtf v0.2d, v0.2d
4622; CHECK-NEXT:    ucvtf v2.2d, v2.2d
4623; CHECK-NEXT:    ucvtf v4.2d, v4.2d
4624; CHECK-NEXT:    ucvtf v6.2d, v6.2d
4625; CHECK-NEXT:    ucvtf v16.2d, v1.2d
4626; CHECK-NEXT:    ucvtf v17.2d, v3.2d
4627; CHECK-NEXT:    ucvtf v5.2d, v5.2d
4628; CHECK-NEXT:    ucvtf v7.2d, v7.2d
4629; CHECK-NEXT:    fcvtn v0.2s, v0.2d
4630; CHECK-NEXT:    fcvtn v1.2s, v2.2d
4631; CHECK-NEXT:    fcvtn v2.2s, v4.2d
4632; CHECK-NEXT:    fcvtn v3.2s, v6.2d
4633; CHECK-NEXT:    fcvtn2 v0.4s, v16.2d
4634; CHECK-NEXT:    fcvtn2 v1.4s, v17.2d
4635; CHECK-NEXT:    fcvtn2 v2.4s, v5.2d
4636; CHECK-NEXT:    fcvtn2 v3.4s, v7.2d
4637; CHECK-NEXT:    ret
4638entry:
4639  %c = uitofp <16 x i64> %a to <16 x float>
4640  ret <16 x float> %c
4641}
4642
4643define <32 x float> @stofp_v32i64_v32f32(<32 x i64> %a) {
4644; CHECK-SD-LABEL: stofp_v32i64_v32f32:
4645; CHECK-SD:       // %bb.0: // %entry
4646; CHECK-SD-NEXT:    ldp q17, q16, [sp, #64]
4647; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
4648; CHECK-SD-NEXT:    ldp q19, q18, [sp, #32]
4649; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
4650; CHECK-SD-NEXT:    ldp q21, q20, [sp]
4651; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
4652; CHECK-SD-NEXT:    ldp q23, q22, [sp, #96]
4653; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
4654; CHECK-SD-NEXT:    scvtf v19.2d, v19.2d
4655; CHECK-SD-NEXT:    scvtf v17.2d, v17.2d
4656; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4657; CHECK-SD-NEXT:    scvtf v21.2d, v21.2d
4658; CHECK-SD-NEXT:    scvtf v24.2d, v1.2d
4659; CHECK-SD-NEXT:    fcvtn v1.2s, v2.2d
4660; CHECK-SD-NEXT:    scvtf v23.2d, v23.2d
4661; CHECK-SD-NEXT:    scvtf v25.2d, v3.2d
4662; CHECK-SD-NEXT:    fcvtn v2.2s, v4.2d
4663; CHECK-SD-NEXT:    scvtf v26.2d, v5.2d
4664; CHECK-SD-NEXT:    fcvtn v3.2s, v6.2d
4665; CHECK-SD-NEXT:    scvtf v27.2d, v7.2d
4666; CHECK-SD-NEXT:    scvtf v20.2d, v20.2d
4667; CHECK-SD-NEXT:    fcvtn v5.2s, v19.2d
4668; CHECK-SD-NEXT:    scvtf v18.2d, v18.2d
4669; CHECK-SD-NEXT:    fcvtn v4.2s, v21.2d
4670; CHECK-SD-NEXT:    fcvtn v6.2s, v17.2d
4671; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
4672; CHECK-SD-NEXT:    fcvtn v7.2s, v23.2d
4673; CHECK-SD-NEXT:    scvtf v17.2d, v22.2d
4674; CHECK-SD-NEXT:    fcvtn2 v0.4s, v24.2d
4675; CHECK-SD-NEXT:    fcvtn2 v1.4s, v25.2d
4676; CHECK-SD-NEXT:    fcvtn2 v2.4s, v26.2d
4677; CHECK-SD-NEXT:    fcvtn2 v3.4s, v27.2d
4678; CHECK-SD-NEXT:    fcvtn2 v5.4s, v18.2d
4679; CHECK-SD-NEXT:    fcvtn2 v4.4s, v20.2d
4680; CHECK-SD-NEXT:    fcvtn2 v6.4s, v16.2d
4681; CHECK-SD-NEXT:    fcvtn2 v7.4s, v17.2d
4682; CHECK-SD-NEXT:    ret
4683;
4684; CHECK-GI-LABEL: stofp_v32i64_v32f32:
4685; CHECK-GI:       // %bb.0: // %entry
4686; CHECK-GI-NEXT:    ldp q16, q17, [sp]
4687; CHECK-GI-NEXT:    scvtf v0.2d, v0.2d
4688; CHECK-GI-NEXT:    ldp q18, q19, [sp, #32]
4689; CHECK-GI-NEXT:    scvtf v24.2d, v1.2d
4690; CHECK-GI-NEXT:    ldp q20, q21, [sp, #64]
4691; CHECK-GI-NEXT:    scvtf v1.2d, v2.2d
4692; CHECK-GI-NEXT:    ldp q22, q23, [sp, #96]
4693; CHECK-GI-NEXT:    scvtf v25.2d, v3.2d
4694; CHECK-GI-NEXT:    scvtf v2.2d, v4.2d
4695; CHECK-GI-NEXT:    scvtf v26.2d, v5.2d
4696; CHECK-GI-NEXT:    scvtf v3.2d, v6.2d
4697; CHECK-GI-NEXT:    scvtf v27.2d, v7.2d
4698; CHECK-GI-NEXT:    scvtf v4.2d, v16.2d
4699; CHECK-GI-NEXT:    scvtf v5.2d, v18.2d
4700; CHECK-GI-NEXT:    scvtf v6.2d, v20.2d
4701; CHECK-GI-NEXT:    scvtf v7.2d, v22.2d
4702; CHECK-GI-NEXT:    scvtf v16.2d, v17.2d
4703; CHECK-GI-NEXT:    scvtf v17.2d, v19.2d
4704; CHECK-GI-NEXT:    scvtf v18.2d, v21.2d
4705; CHECK-GI-NEXT:    scvtf v19.2d, v23.2d
4706; CHECK-GI-NEXT:    fcvtn v0.2s, v0.2d
4707; CHECK-GI-NEXT:    fcvtn v1.2s, v1.2d
4708; CHECK-GI-NEXT:    fcvtn v2.2s, v2.2d
4709; CHECK-GI-NEXT:    fcvtn v3.2s, v3.2d
4710; CHECK-GI-NEXT:    fcvtn v4.2s, v4.2d
4711; CHECK-GI-NEXT:    fcvtn v5.2s, v5.2d
4712; CHECK-GI-NEXT:    fcvtn v6.2s, v6.2d
4713; CHECK-GI-NEXT:    fcvtn v7.2s, v7.2d
4714; CHECK-GI-NEXT:    fcvtn2 v0.4s, v24.2d
4715; CHECK-GI-NEXT:    fcvtn2 v1.4s, v25.2d
4716; CHECK-GI-NEXT:    fcvtn2 v2.4s, v26.2d
4717; CHECK-GI-NEXT:    fcvtn2 v3.4s, v27.2d
4718; CHECK-GI-NEXT:    fcvtn2 v4.4s, v16.2d
4719; CHECK-GI-NEXT:    fcvtn2 v5.4s, v17.2d
4720; CHECK-GI-NEXT:    fcvtn2 v6.4s, v18.2d
4721; CHECK-GI-NEXT:    fcvtn2 v7.4s, v19.2d
4722; CHECK-GI-NEXT:    ret
4723entry:
4724  %c = sitofp <32 x i64> %a to <32 x float>
4725  ret <32 x float> %c
4726}
4727
4728define <32 x float> @utofp_v32i64_v32f32(<32 x i64> %a) {
4729; CHECK-SD-LABEL: utofp_v32i64_v32f32:
4730; CHECK-SD:       // %bb.0: // %entry
4731; CHECK-SD-NEXT:    ldp q17, q16, [sp, #64]
4732; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
4733; CHECK-SD-NEXT:    ldp q19, q18, [sp, #32]
4734; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
4735; CHECK-SD-NEXT:    ldp q21, q20, [sp]
4736; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
4737; CHECK-SD-NEXT:    ldp q23, q22, [sp, #96]
4738; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
4739; CHECK-SD-NEXT:    ucvtf v19.2d, v19.2d
4740; CHECK-SD-NEXT:    ucvtf v17.2d, v17.2d
4741; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
4742; CHECK-SD-NEXT:    ucvtf v21.2d, v21.2d
4743; CHECK-SD-NEXT:    ucvtf v24.2d, v1.2d
4744; CHECK-SD-NEXT:    fcvtn v1.2s, v2.2d
4745; CHECK-SD-NEXT:    ucvtf v23.2d, v23.2d
4746; CHECK-SD-NEXT:    ucvtf v25.2d, v3.2d
4747; CHECK-SD-NEXT:    fcvtn v2.2s, v4.2d
4748; CHECK-SD-NEXT:    ucvtf v26.2d, v5.2d
4749; CHECK-SD-NEXT:    fcvtn v3.2s, v6.2d
4750; CHECK-SD-NEXT:    ucvtf v27.2d, v7.2d
4751; CHECK-SD-NEXT:    ucvtf v20.2d, v20.2d
4752; CHECK-SD-NEXT:    fcvtn v5.2s, v19.2d
4753; CHECK-SD-NEXT:    ucvtf v18.2d, v18.2d
4754; CHECK-SD-NEXT:    fcvtn v4.2s, v21.2d
4755; CHECK-SD-NEXT:    fcvtn v6.2s, v17.2d
4756; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
4757; CHECK-SD-NEXT:    fcvtn v7.2s, v23.2d
4758; CHECK-SD-NEXT:    ucvtf v17.2d, v22.2d
4759; CHECK-SD-NEXT:    fcvtn2 v0.4s, v24.2d
4760; CHECK-SD-NEXT:    fcvtn2 v1.4s, v25.2d
4761; CHECK-SD-NEXT:    fcvtn2 v2.4s, v26.2d
4762; CHECK-SD-NEXT:    fcvtn2 v3.4s, v27.2d
4763; CHECK-SD-NEXT:    fcvtn2 v5.4s, v18.2d
4764; CHECK-SD-NEXT:    fcvtn2 v4.4s, v20.2d
4765; CHECK-SD-NEXT:    fcvtn2 v6.4s, v16.2d
4766; CHECK-SD-NEXT:    fcvtn2 v7.4s, v17.2d
4767; CHECK-SD-NEXT:    ret
4768;
4769; CHECK-GI-LABEL: utofp_v32i64_v32f32:
4770; CHECK-GI:       // %bb.0: // %entry
4771; CHECK-GI-NEXT:    ldp q16, q17, [sp]
4772; CHECK-GI-NEXT:    ucvtf v0.2d, v0.2d
4773; CHECK-GI-NEXT:    ldp q18, q19, [sp, #32]
4774; CHECK-GI-NEXT:    ucvtf v24.2d, v1.2d
4775; CHECK-GI-NEXT:    ldp q20, q21, [sp, #64]
4776; CHECK-GI-NEXT:    ucvtf v1.2d, v2.2d
4777; CHECK-GI-NEXT:    ldp q22, q23, [sp, #96]
4778; CHECK-GI-NEXT:    ucvtf v25.2d, v3.2d
4779; CHECK-GI-NEXT:    ucvtf v2.2d, v4.2d
4780; CHECK-GI-NEXT:    ucvtf v26.2d, v5.2d
4781; CHECK-GI-NEXT:    ucvtf v3.2d, v6.2d
4782; CHECK-GI-NEXT:    ucvtf v27.2d, v7.2d
4783; CHECK-GI-NEXT:    ucvtf v4.2d, v16.2d
4784; CHECK-GI-NEXT:    ucvtf v5.2d, v18.2d
4785; CHECK-GI-NEXT:    ucvtf v6.2d, v20.2d
4786; CHECK-GI-NEXT:    ucvtf v7.2d, v22.2d
4787; CHECK-GI-NEXT:    ucvtf v16.2d, v17.2d
4788; CHECK-GI-NEXT:    ucvtf v17.2d, v19.2d
4789; CHECK-GI-NEXT:    ucvtf v18.2d, v21.2d
4790; CHECK-GI-NEXT:    ucvtf v19.2d, v23.2d
4791; CHECK-GI-NEXT:    fcvtn v0.2s, v0.2d
4792; CHECK-GI-NEXT:    fcvtn v1.2s, v1.2d
4793; CHECK-GI-NEXT:    fcvtn v2.2s, v2.2d
4794; CHECK-GI-NEXT:    fcvtn v3.2s, v3.2d
4795; CHECK-GI-NEXT:    fcvtn v4.2s, v4.2d
4796; CHECK-GI-NEXT:    fcvtn v5.2s, v5.2d
4797; CHECK-GI-NEXT:    fcvtn v6.2s, v6.2d
4798; CHECK-GI-NEXT:    fcvtn v7.2s, v7.2d
4799; CHECK-GI-NEXT:    fcvtn2 v0.4s, v24.2d
4800; CHECK-GI-NEXT:    fcvtn2 v1.4s, v25.2d
4801; CHECK-GI-NEXT:    fcvtn2 v2.4s, v26.2d
4802; CHECK-GI-NEXT:    fcvtn2 v3.4s, v27.2d
4803; CHECK-GI-NEXT:    fcvtn2 v4.4s, v16.2d
4804; CHECK-GI-NEXT:    fcvtn2 v5.4s, v17.2d
4805; CHECK-GI-NEXT:    fcvtn2 v6.4s, v18.2d
4806; CHECK-GI-NEXT:    fcvtn2 v7.4s, v19.2d
4807; CHECK-GI-NEXT:    ret
4808entry:
4809  %c = uitofp <32 x i64> %a to <32 x float>
4810  ret <32 x float> %c
4811}
4812
4813define <2 x float> @stofp_v2i32_v2f32(<2 x i32> %a) {
4814; CHECK-LABEL: stofp_v2i32_v2f32:
4815; CHECK:       // %bb.0: // %entry
4816; CHECK-NEXT:    scvtf v0.2s, v0.2s
4817; CHECK-NEXT:    ret
4818entry:
4819  %c = sitofp <2 x i32> %a to <2 x float>
4820  ret <2 x float> %c
4821}
4822
4823define <2 x float> @utofp_v2i32_v2f32(<2 x i32> %a) {
4824; CHECK-LABEL: utofp_v2i32_v2f32:
4825; CHECK:       // %bb.0: // %entry
4826; CHECK-NEXT:    ucvtf v0.2s, v0.2s
4827; CHECK-NEXT:    ret
4828entry:
4829  %c = uitofp <2 x i32> %a to <2 x float>
4830  ret <2 x float> %c
4831}
4832
4833define <3 x float> @stofp_v3i32_v3f32(<3 x i32> %a) {
4834; CHECK-LABEL: stofp_v3i32_v3f32:
4835; CHECK:       // %bb.0: // %entry
4836; CHECK-NEXT:    scvtf v0.4s, v0.4s
4837; CHECK-NEXT:    ret
4838entry:
4839  %c = sitofp <3 x i32> %a to <3 x float>
4840  ret <3 x float> %c
4841}
4842
4843define <3 x float> @utofp_v3i32_v3f32(<3 x i32> %a) {
4844; CHECK-LABEL: utofp_v3i32_v3f32:
4845; CHECK:       // %bb.0: // %entry
4846; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4847; CHECK-NEXT:    ret
4848entry:
4849  %c = uitofp <3 x i32> %a to <3 x float>
4850  ret <3 x float> %c
4851}
4852
4853define <4 x float> @stofp_v4i32_v4f32(<4 x i32> %a) {
4854; CHECK-LABEL: stofp_v4i32_v4f32:
4855; CHECK:       // %bb.0: // %entry
4856; CHECK-NEXT:    scvtf v0.4s, v0.4s
4857; CHECK-NEXT:    ret
4858entry:
4859  %c = sitofp <4 x i32> %a to <4 x float>
4860  ret <4 x float> %c
4861}
4862
4863define <4 x float> @utofp_v4i32_v4f32(<4 x i32> %a) {
4864; CHECK-LABEL: utofp_v4i32_v4f32:
4865; CHECK:       // %bb.0: // %entry
4866; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4867; CHECK-NEXT:    ret
4868entry:
4869  %c = uitofp <4 x i32> %a to <4 x float>
4870  ret <4 x float> %c
4871}
4872
4873define <8 x float> @stofp_v8i32_v8f32(<8 x i32> %a) {
4874; CHECK-LABEL: stofp_v8i32_v8f32:
4875; CHECK:       // %bb.0: // %entry
4876; CHECK-NEXT:    scvtf v0.4s, v0.4s
4877; CHECK-NEXT:    scvtf v1.4s, v1.4s
4878; CHECK-NEXT:    ret
4879entry:
4880  %c = sitofp <8 x i32> %a to <8 x float>
4881  ret <8 x float> %c
4882}
4883
4884define <8 x float> @utofp_v8i32_v8f32(<8 x i32> %a) {
4885; CHECK-LABEL: utofp_v8i32_v8f32:
4886; CHECK:       // %bb.0: // %entry
4887; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4888; CHECK-NEXT:    ucvtf v1.4s, v1.4s
4889; CHECK-NEXT:    ret
4890entry:
4891  %c = uitofp <8 x i32> %a to <8 x float>
4892  ret <8 x float> %c
4893}
4894
4895define <16 x float> @stofp_v16i32_v16f32(<16 x i32> %a) {
4896; CHECK-LABEL: stofp_v16i32_v16f32:
4897; CHECK:       // %bb.0: // %entry
4898; CHECK-NEXT:    scvtf v0.4s, v0.4s
4899; CHECK-NEXT:    scvtf v1.4s, v1.4s
4900; CHECK-NEXT:    scvtf v2.4s, v2.4s
4901; CHECK-NEXT:    scvtf v3.4s, v3.4s
4902; CHECK-NEXT:    ret
4903entry:
4904  %c = sitofp <16 x i32> %a to <16 x float>
4905  ret <16 x float> %c
4906}
4907
4908define <16 x float> @utofp_v16i32_v16f32(<16 x i32> %a) {
4909; CHECK-LABEL: utofp_v16i32_v16f32:
4910; CHECK:       // %bb.0: // %entry
4911; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4912; CHECK-NEXT:    ucvtf v1.4s, v1.4s
4913; CHECK-NEXT:    ucvtf v2.4s, v2.4s
4914; CHECK-NEXT:    ucvtf v3.4s, v3.4s
4915; CHECK-NEXT:    ret
4916entry:
4917  %c = uitofp <16 x i32> %a to <16 x float>
4918  ret <16 x float> %c
4919}
4920
4921define <32 x float> @stofp_v32i32_v32f32(<32 x i32> %a) {
4922; CHECK-LABEL: stofp_v32i32_v32f32:
4923; CHECK:       // %bb.0: // %entry
4924; CHECK-NEXT:    scvtf v0.4s, v0.4s
4925; CHECK-NEXT:    scvtf v1.4s, v1.4s
4926; CHECK-NEXT:    scvtf v2.4s, v2.4s
4927; CHECK-NEXT:    scvtf v3.4s, v3.4s
4928; CHECK-NEXT:    scvtf v4.4s, v4.4s
4929; CHECK-NEXT:    scvtf v5.4s, v5.4s
4930; CHECK-NEXT:    scvtf v6.4s, v6.4s
4931; CHECK-NEXT:    scvtf v7.4s, v7.4s
4932; CHECK-NEXT:    ret
4933entry:
4934  %c = sitofp <32 x i32> %a to <32 x float>
4935  ret <32 x float> %c
4936}
4937
4938define <32 x float> @utofp_v32i32_v32f32(<32 x i32> %a) {
4939; CHECK-LABEL: utofp_v32i32_v32f32:
4940; CHECK:       // %bb.0: // %entry
4941; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4942; CHECK-NEXT:    ucvtf v1.4s, v1.4s
4943; CHECK-NEXT:    ucvtf v2.4s, v2.4s
4944; CHECK-NEXT:    ucvtf v3.4s, v3.4s
4945; CHECK-NEXT:    ucvtf v4.4s, v4.4s
4946; CHECK-NEXT:    ucvtf v5.4s, v5.4s
4947; CHECK-NEXT:    ucvtf v6.4s, v6.4s
4948; CHECK-NEXT:    ucvtf v7.4s, v7.4s
4949; CHECK-NEXT:    ret
4950entry:
4951  %c = uitofp <32 x i32> %a to <32 x float>
4952  ret <32 x float> %c
4953}
4954
4955define <2 x float> @stofp_v2i16_v2f32(<2 x i16> %a) {
4956; CHECK-LABEL: stofp_v2i16_v2f32:
4957; CHECK:       // %bb.0: // %entry
4958; CHECK-NEXT:    shl v0.2s, v0.2s, #16
4959; CHECK-NEXT:    sshr v0.2s, v0.2s, #16
4960; CHECK-NEXT:    scvtf v0.2s, v0.2s
4961; CHECK-NEXT:    ret
4962entry:
4963  %c = sitofp <2 x i16> %a to <2 x float>
4964  ret <2 x float> %c
4965}
4966
4967define <2 x float> @utofp_v2i16_v2f32(<2 x i16> %a) {
4968; CHECK-LABEL: utofp_v2i16_v2f32:
4969; CHECK:       // %bb.0: // %entry
4970; CHECK-NEXT:    movi d1, #0x00ffff0000ffff
4971; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
4972; CHECK-NEXT:    ucvtf v0.2s, v0.2s
4973; CHECK-NEXT:    ret
4974entry:
4975  %c = uitofp <2 x i16> %a to <2 x float>
4976  ret <2 x float> %c
4977}
4978
4979define <3 x float> @stofp_v3i16_v3f32(<3 x i16> %a) {
4980; CHECK-LABEL: stofp_v3i16_v3f32:
4981; CHECK:       // %bb.0: // %entry
4982; CHECK-NEXT:    sshll v0.4s, v0.4h, #0
4983; CHECK-NEXT:    scvtf v0.4s, v0.4s
4984; CHECK-NEXT:    ret
4985entry:
4986  %c = sitofp <3 x i16> %a to <3 x float>
4987  ret <3 x float> %c
4988}
4989
4990define <3 x float> @utofp_v3i16_v3f32(<3 x i16> %a) {
4991; CHECK-LABEL: utofp_v3i16_v3f32:
4992; CHECK:       // %bb.0: // %entry
4993; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
4994; CHECK-NEXT:    ucvtf v0.4s, v0.4s
4995; CHECK-NEXT:    ret
4996entry:
4997  %c = uitofp <3 x i16> %a to <3 x float>
4998  ret <3 x float> %c
4999}
5000
5001define <4 x float> @stofp_v4i16_v4f32(<4 x i16> %a) {
5002; CHECK-LABEL: stofp_v4i16_v4f32:
5003; CHECK:       // %bb.0: // %entry
5004; CHECK-NEXT:    sshll v0.4s, v0.4h, #0
5005; CHECK-NEXT:    scvtf v0.4s, v0.4s
5006; CHECK-NEXT:    ret
5007entry:
5008  %c = sitofp <4 x i16> %a to <4 x float>
5009  ret <4 x float> %c
5010}
5011
5012define <4 x float> @utofp_v4i16_v4f32(<4 x i16> %a) {
5013; CHECK-LABEL: utofp_v4i16_v4f32:
5014; CHECK:       // %bb.0: // %entry
5015; CHECK-NEXT:    ushll v0.4s, v0.4h, #0
5016; CHECK-NEXT:    ucvtf v0.4s, v0.4s
5017; CHECK-NEXT:    ret
5018entry:
5019  %c = uitofp <4 x i16> %a to <4 x float>
5020  ret <4 x float> %c
5021}
5022
5023define <8 x float> @stofp_v8i16_v8f32(<8 x i16> %a) {
5024; CHECK-SD-LABEL: stofp_v8i16_v8f32:
5025; CHECK-SD:       // %bb.0: // %entry
5026; CHECK-SD-NEXT:    sshll2 v1.4s, v0.8h, #0
5027; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
5028; CHECK-SD-NEXT:    scvtf v1.4s, v1.4s
5029; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
5030; CHECK-SD-NEXT:    ret
5031;
5032; CHECK-GI-LABEL: stofp_v8i16_v8f32:
5033; CHECK-GI:       // %bb.0: // %entry
5034; CHECK-GI-NEXT:    sshll v1.4s, v0.4h, #0
5035; CHECK-GI-NEXT:    sshll2 v2.4s, v0.8h, #0
5036; CHECK-GI-NEXT:    scvtf v0.4s, v1.4s
5037; CHECK-GI-NEXT:    scvtf v1.4s, v2.4s
5038; CHECK-GI-NEXT:    ret
5039entry:
5040  %c = sitofp <8 x i16> %a to <8 x float>
5041  ret <8 x float> %c
5042}
5043
5044define <8 x float> @utofp_v8i16_v8f32(<8 x i16> %a) {
5045; CHECK-SD-LABEL: utofp_v8i16_v8f32:
5046; CHECK-SD:       // %bb.0: // %entry
5047; CHECK-SD-NEXT:    ushll2 v1.4s, v0.8h, #0
5048; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
5049; CHECK-SD-NEXT:    ucvtf v1.4s, v1.4s
5050; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
5051; CHECK-SD-NEXT:    ret
5052;
5053; CHECK-GI-LABEL: utofp_v8i16_v8f32:
5054; CHECK-GI:       // %bb.0: // %entry
5055; CHECK-GI-NEXT:    ushll v1.4s, v0.4h, #0
5056; CHECK-GI-NEXT:    ushll2 v2.4s, v0.8h, #0
5057; CHECK-GI-NEXT:    ucvtf v0.4s, v1.4s
5058; CHECK-GI-NEXT:    ucvtf v1.4s, v2.4s
5059; CHECK-GI-NEXT:    ret
5060entry:
5061  %c = uitofp <8 x i16> %a to <8 x float>
5062  ret <8 x float> %c
5063}
5064
5065define <16 x float> @stofp_v16i16_v16f32(<16 x i16> %a) {
5066; CHECK-SD-LABEL: stofp_v16i16_v16f32:
5067; CHECK-SD:       // %bb.0: // %entry
5068; CHECK-SD-NEXT:    sshll v2.4s, v0.4h, #0
5069; CHECK-SD-NEXT:    sshll2 v3.4s, v0.8h, #0
5070; CHECK-SD-NEXT:    sshll2 v4.4s, v1.8h, #0
5071; CHECK-SD-NEXT:    sshll v5.4s, v1.4h, #0
5072; CHECK-SD-NEXT:    scvtf v0.4s, v2.4s
5073; CHECK-SD-NEXT:    scvtf v1.4s, v3.4s
5074; CHECK-SD-NEXT:    scvtf v3.4s, v4.4s
5075; CHECK-SD-NEXT:    scvtf v2.4s, v5.4s
5076; CHECK-SD-NEXT:    ret
5077;
5078; CHECK-GI-LABEL: stofp_v16i16_v16f32:
5079; CHECK-GI:       // %bb.0: // %entry
5080; CHECK-GI-NEXT:    sshll v2.4s, v0.4h, #0
5081; CHECK-GI-NEXT:    sshll2 v3.4s, v0.8h, #0
5082; CHECK-GI-NEXT:    sshll v4.4s, v1.4h, #0
5083; CHECK-GI-NEXT:    sshll2 v5.4s, v1.8h, #0
5084; CHECK-GI-NEXT:    scvtf v0.4s, v2.4s
5085; CHECK-GI-NEXT:    scvtf v1.4s, v3.4s
5086; CHECK-GI-NEXT:    scvtf v2.4s, v4.4s
5087; CHECK-GI-NEXT:    scvtf v3.4s, v5.4s
5088; CHECK-GI-NEXT:    ret
5089entry:
5090  %c = sitofp <16 x i16> %a to <16 x float>
5091  ret <16 x float> %c
5092}
5093
5094define <16 x float> @utofp_v16i16_v16f32(<16 x i16> %a) {
5095; CHECK-SD-LABEL: utofp_v16i16_v16f32:
5096; CHECK-SD:       // %bb.0: // %entry
5097; CHECK-SD-NEXT:    ushll v2.4s, v0.4h, #0
5098; CHECK-SD-NEXT:    ushll2 v3.4s, v0.8h, #0
5099; CHECK-SD-NEXT:    ushll2 v4.4s, v1.8h, #0
5100; CHECK-SD-NEXT:    ushll v5.4s, v1.4h, #0
5101; CHECK-SD-NEXT:    ucvtf v0.4s, v2.4s
5102; CHECK-SD-NEXT:    ucvtf v1.4s, v3.4s
5103; CHECK-SD-NEXT:    ucvtf v3.4s, v4.4s
5104; CHECK-SD-NEXT:    ucvtf v2.4s, v5.4s
5105; CHECK-SD-NEXT:    ret
5106;
5107; CHECK-GI-LABEL: utofp_v16i16_v16f32:
5108; CHECK-GI:       // %bb.0: // %entry
5109; CHECK-GI-NEXT:    ushll v2.4s, v0.4h, #0
5110; CHECK-GI-NEXT:    ushll2 v3.4s, v0.8h, #0
5111; CHECK-GI-NEXT:    ushll v4.4s, v1.4h, #0
5112; CHECK-GI-NEXT:    ushll2 v5.4s, v1.8h, #0
5113; CHECK-GI-NEXT:    ucvtf v0.4s, v2.4s
5114; CHECK-GI-NEXT:    ucvtf v1.4s, v3.4s
5115; CHECK-GI-NEXT:    ucvtf v2.4s, v4.4s
5116; CHECK-GI-NEXT:    ucvtf v3.4s, v5.4s
5117; CHECK-GI-NEXT:    ret
5118entry:
5119  %c = uitofp <16 x i16> %a to <16 x float>
5120  ret <16 x float> %c
5121}
5122
5123define <32 x float> @stofp_v32i16_v32f32(<32 x i16> %a) {
5124; CHECK-SD-LABEL: stofp_v32i16_v32f32:
5125; CHECK-SD:       // %bb.0: // %entry
5126; CHECK-SD-NEXT:    sshll2 v4.4s, v0.8h, #0
5127; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
5128; CHECK-SD-NEXT:    sshll2 v5.4s, v1.8h, #0
5129; CHECK-SD-NEXT:    sshll v6.4s, v1.4h, #0
5130; CHECK-SD-NEXT:    sshll v7.4s, v2.4h, #0
5131; CHECK-SD-NEXT:    sshll2 v16.4s, v2.8h, #0
5132; CHECK-SD-NEXT:    sshll2 v17.4s, v3.8h, #0
5133; CHECK-SD-NEXT:    sshll v18.4s, v3.4h, #0
5134; CHECK-SD-NEXT:    scvtf v1.4s, v4.4s
5135; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
5136; CHECK-SD-NEXT:    scvtf v3.4s, v5.4s
5137; CHECK-SD-NEXT:    scvtf v2.4s, v6.4s
5138; CHECK-SD-NEXT:    scvtf v4.4s, v7.4s
5139; CHECK-SD-NEXT:    scvtf v5.4s, v16.4s
5140; CHECK-SD-NEXT:    scvtf v7.4s, v17.4s
5141; CHECK-SD-NEXT:    scvtf v6.4s, v18.4s
5142; CHECK-SD-NEXT:    ret
5143;
5144; CHECK-GI-LABEL: stofp_v32i16_v32f32:
5145; CHECK-GI:       // %bb.0: // %entry
5146; CHECK-GI-NEXT:    sshll v4.4s, v0.4h, #0
5147; CHECK-GI-NEXT:    sshll2 v5.4s, v0.8h, #0
5148; CHECK-GI-NEXT:    sshll v6.4s, v1.4h, #0
5149; CHECK-GI-NEXT:    sshll2 v7.4s, v1.8h, #0
5150; CHECK-GI-NEXT:    sshll v16.4s, v2.4h, #0
5151; CHECK-GI-NEXT:    sshll2 v17.4s, v2.8h, #0
5152; CHECK-GI-NEXT:    sshll v18.4s, v3.4h, #0
5153; CHECK-GI-NEXT:    sshll2 v19.4s, v3.8h, #0
5154; CHECK-GI-NEXT:    scvtf v0.4s, v4.4s
5155; CHECK-GI-NEXT:    scvtf v1.4s, v5.4s
5156; CHECK-GI-NEXT:    scvtf v2.4s, v6.4s
5157; CHECK-GI-NEXT:    scvtf v3.4s, v7.4s
5158; CHECK-GI-NEXT:    scvtf v4.4s, v16.4s
5159; CHECK-GI-NEXT:    scvtf v5.4s, v17.4s
5160; CHECK-GI-NEXT:    scvtf v6.4s, v18.4s
5161; CHECK-GI-NEXT:    scvtf v7.4s, v19.4s
5162; CHECK-GI-NEXT:    ret
5163entry:
5164  %c = sitofp <32 x i16> %a to <32 x float>
5165  ret <32 x float> %c
5166}
5167
5168define <32 x float> @utofp_v32i16_v32f32(<32 x i16> %a) {
5169; CHECK-SD-LABEL: utofp_v32i16_v32f32:
5170; CHECK-SD:       // %bb.0: // %entry
5171; CHECK-SD-NEXT:    ushll2 v4.4s, v0.8h, #0
5172; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
5173; CHECK-SD-NEXT:    ushll2 v5.4s, v1.8h, #0
5174; CHECK-SD-NEXT:    ushll v6.4s, v1.4h, #0
5175; CHECK-SD-NEXT:    ushll v7.4s, v2.4h, #0
5176; CHECK-SD-NEXT:    ushll2 v16.4s, v2.8h, #0
5177; CHECK-SD-NEXT:    ushll2 v17.4s, v3.8h, #0
5178; CHECK-SD-NEXT:    ushll v18.4s, v3.4h, #0
5179; CHECK-SD-NEXT:    ucvtf v1.4s, v4.4s
5180; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
5181; CHECK-SD-NEXT:    ucvtf v3.4s, v5.4s
5182; CHECK-SD-NEXT:    ucvtf v2.4s, v6.4s
5183; CHECK-SD-NEXT:    ucvtf v4.4s, v7.4s
5184; CHECK-SD-NEXT:    ucvtf v5.4s, v16.4s
5185; CHECK-SD-NEXT:    ucvtf v7.4s, v17.4s
5186; CHECK-SD-NEXT:    ucvtf v6.4s, v18.4s
5187; CHECK-SD-NEXT:    ret
5188;
5189; CHECK-GI-LABEL: utofp_v32i16_v32f32:
5190; CHECK-GI:       // %bb.0: // %entry
5191; CHECK-GI-NEXT:    ushll v4.4s, v0.4h, #0
5192; CHECK-GI-NEXT:    ushll2 v5.4s, v0.8h, #0
5193; CHECK-GI-NEXT:    ushll v6.4s, v1.4h, #0
5194; CHECK-GI-NEXT:    ushll2 v7.4s, v1.8h, #0
5195; CHECK-GI-NEXT:    ushll v16.4s, v2.4h, #0
5196; CHECK-GI-NEXT:    ushll2 v17.4s, v2.8h, #0
5197; CHECK-GI-NEXT:    ushll v18.4s, v3.4h, #0
5198; CHECK-GI-NEXT:    ushll2 v19.4s, v3.8h, #0
5199; CHECK-GI-NEXT:    ucvtf v0.4s, v4.4s
5200; CHECK-GI-NEXT:    ucvtf v1.4s, v5.4s
5201; CHECK-GI-NEXT:    ucvtf v2.4s, v6.4s
5202; CHECK-GI-NEXT:    ucvtf v3.4s, v7.4s
5203; CHECK-GI-NEXT:    ucvtf v4.4s, v16.4s
5204; CHECK-GI-NEXT:    ucvtf v5.4s, v17.4s
5205; CHECK-GI-NEXT:    ucvtf v6.4s, v18.4s
5206; CHECK-GI-NEXT:    ucvtf v7.4s, v19.4s
5207; CHECK-GI-NEXT:    ret
5208entry:
5209  %c = uitofp <32 x i16> %a to <32 x float>
5210  ret <32 x float> %c
5211}
5212
5213define <2 x float> @stofp_v2i8_v2f32(<2 x i8> %a) {
5214; CHECK-LABEL: stofp_v2i8_v2f32:
5215; CHECK:       // %bb.0: // %entry
5216; CHECK-NEXT:    shl v0.2s, v0.2s, #24
5217; CHECK-NEXT:    sshr v0.2s, v0.2s, #24
5218; CHECK-NEXT:    scvtf v0.2s, v0.2s
5219; CHECK-NEXT:    ret
5220entry:
5221  %c = sitofp <2 x i8> %a to <2 x float>
5222  ret <2 x float> %c
5223}
5224
5225define <2 x float> @utofp_v2i8_v2f32(<2 x i8> %a) {
5226; CHECK-LABEL: utofp_v2i8_v2f32:
5227; CHECK:       // %bb.0: // %entry
5228; CHECK-NEXT:    movi d1, #0x0000ff000000ff
5229; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
5230; CHECK-NEXT:    ucvtf v0.2s, v0.2s
5231; CHECK-NEXT:    ret
5232entry:
5233  %c = uitofp <2 x i8> %a to <2 x float>
5234  ret <2 x float> %c
5235}
5236
5237define <3 x float> @stofp_v3i8_v3f32(<3 x i8> %a) {
5238; CHECK-SD-LABEL: stofp_v3i8_v3f32:
5239; CHECK-SD:       // %bb.0: // %entry
5240; CHECK-SD-NEXT:    fmov s0, w0
5241; CHECK-SD-NEXT:    mov v0.h[1], w1
5242; CHECK-SD-NEXT:    mov v0.h[2], w2
5243; CHECK-SD-NEXT:    shl v0.4h, v0.4h, #8
5244; CHECK-SD-NEXT:    sshr v0.4h, v0.4h, #8
5245; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
5246; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
5247; CHECK-SD-NEXT:    ret
5248;
5249; CHECK-GI-LABEL: stofp_v3i8_v3f32:
5250; CHECK-GI:       // %bb.0: // %entry
5251; CHECK-GI-NEXT:    fmov s0, w0
5252; CHECK-GI-NEXT:    mov v0.h[1], w1
5253; CHECK-GI-NEXT:    mov v0.h[2], w2
5254; CHECK-GI-NEXT:    shl v0.4h, v0.4h, #8
5255; CHECK-GI-NEXT:    sshr v0.4h, v0.4h, #8
5256; CHECK-GI-NEXT:    mov v1.h[0], v0.h[2]
5257; CHECK-GI-NEXT:    mov v1.h[1], v0.h[3]
5258; CHECK-GI-NEXT:    sshll v0.4s, v0.4h, #0
5259; CHECK-GI-NEXT:    sshll v1.4s, v1.4h, #0
5260; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
5261; CHECK-GI-NEXT:    scvtf v0.4s, v0.4s
5262; CHECK-GI-NEXT:    ret
5263entry:
5264  %c = sitofp <3 x i8> %a to <3 x float>
5265  ret <3 x float> %c
5266}
5267
5268define <3 x float> @utofp_v3i8_v3f32(<3 x i8> %a) {
5269; CHECK-SD-LABEL: utofp_v3i8_v3f32:
5270; CHECK-SD:       // %bb.0: // %entry
5271; CHECK-SD-NEXT:    fmov s0, w0
5272; CHECK-SD-NEXT:    mov v0.h[1], w1
5273; CHECK-SD-NEXT:    mov v0.h[2], w2
5274; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
5275; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
5276; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
5277; CHECK-SD-NEXT:    ret
5278;
5279; CHECK-GI-LABEL: utofp_v3i8_v3f32:
5280; CHECK-GI:       // %bb.0: // %entry
5281; CHECK-GI-NEXT:    fmov s0, w0
5282; CHECK-GI-NEXT:    movi d1, #0xff00ff00ff00ff
5283; CHECK-GI-NEXT:    mov v0.h[1], w1
5284; CHECK-GI-NEXT:    mov v0.h[2], w2
5285; CHECK-GI-NEXT:    and v0.8b, v0.8b, v1.8b
5286; CHECK-GI-NEXT:    mov v1.h[0], v0.h[2]
5287; CHECK-GI-NEXT:    mov v1.h[1], v0.h[3]
5288; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
5289; CHECK-GI-NEXT:    ushll v1.4s, v1.4h, #0
5290; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
5291; CHECK-GI-NEXT:    ucvtf v0.4s, v0.4s
5292; CHECK-GI-NEXT:    ret
5293entry:
5294  %c = uitofp <3 x i8> %a to <3 x float>
5295  ret <3 x float> %c
5296}
5297
5298define <4 x float> @stofp_v4i8_v4f32(<4 x i8> %a) {
5299; CHECK-SD-LABEL: stofp_v4i8_v4f32:
5300; CHECK-SD:       // %bb.0: // %entry
5301; CHECK-SD-NEXT:    shl v0.4h, v0.4h, #8
5302; CHECK-SD-NEXT:    sshr v0.4h, v0.4h, #8
5303; CHECK-SD-NEXT:    sshll v0.4s, v0.4h, #0
5304; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
5305; CHECK-SD-NEXT:    ret
5306;
5307; CHECK-GI-LABEL: stofp_v4i8_v4f32:
5308; CHECK-GI:       // %bb.0: // %entry
5309; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
5310; CHECK-GI-NEXT:    shl v0.4s, v0.4s, #24
5311; CHECK-GI-NEXT:    sshr v0.4s, v0.4s, #24
5312; CHECK-GI-NEXT:    scvtf v0.4s, v0.4s
5313; CHECK-GI-NEXT:    ret
5314entry:
5315  %c = sitofp <4 x i8> %a to <4 x float>
5316  ret <4 x float> %c
5317}
5318
5319define <4 x float> @utofp_v4i8_v4f32(<4 x i8> %a) {
5320; CHECK-SD-LABEL: utofp_v4i8_v4f32:
5321; CHECK-SD:       // %bb.0: // %entry
5322; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
5323; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
5324; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
5325; CHECK-SD-NEXT:    ret
5326;
5327; CHECK-GI-LABEL: utofp_v4i8_v4f32:
5328; CHECK-GI:       // %bb.0: // %entry
5329; CHECK-GI-NEXT:    movi v1.2d, #0x0000ff000000ff
5330; CHECK-GI-NEXT:    ushll v0.4s, v0.4h, #0
5331; CHECK-GI-NEXT:    and v0.16b, v0.16b, v1.16b
5332; CHECK-GI-NEXT:    ucvtf v0.4s, v0.4s
5333; CHECK-GI-NEXT:    ret
5334entry:
5335  %c = uitofp <4 x i8> %a to <4 x float>
5336  ret <4 x float> %c
5337}
5338
5339define <8 x float> @stofp_v8i8_v8f32(<8 x i8> %a) {
5340; CHECK-SD-LABEL: stofp_v8i8_v8f32:
5341; CHECK-SD:       // %bb.0: // %entry
5342; CHECK-SD-NEXT:    zip1 v1.8b, v0.8b, v0.8b
5343; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5344; CHECK-SD-NEXT:    shl v1.4h, v1.4h, #8
5345; CHECK-SD-NEXT:    shl v0.4h, v0.4h, #8
5346; CHECK-SD-NEXT:    sshr v1.4h, v1.4h, #8
5347; CHECK-SD-NEXT:    sshr v0.4h, v0.4h, #8
5348; CHECK-SD-NEXT:    sshll v1.4s, v1.4h, #0
5349; CHECK-SD-NEXT:    sshll v2.4s, v0.4h, #0
5350; CHECK-SD-NEXT:    scvtf v0.4s, v1.4s
5351; CHECK-SD-NEXT:    scvtf v1.4s, v2.4s
5352; CHECK-SD-NEXT:    ret
5353;
5354; CHECK-GI-LABEL: stofp_v8i8_v8f32:
5355; CHECK-GI:       // %bb.0: // %entry
5356; CHECK-GI-NEXT:    sshll v0.8h, v0.8b, #0
5357; CHECK-GI-NEXT:    sshll v1.4s, v0.4h, #0
5358; CHECK-GI-NEXT:    sshll2 v2.4s, v0.8h, #0
5359; CHECK-GI-NEXT:    scvtf v0.4s, v1.4s
5360; CHECK-GI-NEXT:    scvtf v1.4s, v2.4s
5361; CHECK-GI-NEXT:    ret
5362entry:
5363  %c = sitofp <8 x i8> %a to <8 x float>
5364  ret <8 x float> %c
5365}
5366
5367define <8 x float> @utofp_v8i8_v8f32(<8 x i8> %a) {
5368; CHECK-SD-LABEL: utofp_v8i8_v8f32:
5369; CHECK-SD:       // %bb.0: // %entry
5370; CHECK-SD-NEXT:    zip1 v1.8b, v0.8b, v0.8b
5371; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5372; CHECK-SD-NEXT:    bic v1.4h, #255, lsl #8
5373; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
5374; CHECK-SD-NEXT:    ushll v1.4s, v1.4h, #0
5375; CHECK-SD-NEXT:    ushll v2.4s, v0.4h, #0
5376; CHECK-SD-NEXT:    ucvtf v0.4s, v1.4s
5377; CHECK-SD-NEXT:    ucvtf v1.4s, v2.4s
5378; CHECK-SD-NEXT:    ret
5379;
5380; CHECK-GI-LABEL: utofp_v8i8_v8f32:
5381; CHECK-GI:       // %bb.0: // %entry
5382; CHECK-GI-NEXT:    ushll v0.8h, v0.8b, #0
5383; CHECK-GI-NEXT:    ushll v1.4s, v0.4h, #0
5384; CHECK-GI-NEXT:    ushll2 v2.4s, v0.8h, #0
5385; CHECK-GI-NEXT:    ucvtf v0.4s, v1.4s
5386; CHECK-GI-NEXT:    ucvtf v1.4s, v2.4s
5387; CHECK-GI-NEXT:    ret
5388entry:
5389  %c = uitofp <8 x i8> %a to <8 x float>
5390  ret <8 x float> %c
5391}
5392
5393define <16 x float> @stofp_v16i8_v16f32(<16 x i8> %a) {
5394; CHECK-SD-LABEL: stofp_v16i8_v16f32:
5395; CHECK-SD:       // %bb.0: // %entry
5396; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
5397; CHECK-SD-NEXT:    zip1 v2.8b, v0.8b, v0.8b
5398; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5399; CHECK-SD-NEXT:    zip1 v3.8b, v1.8b, v0.8b
5400; CHECK-SD-NEXT:    zip2 v1.8b, v1.8b, v0.8b
5401; CHECK-SD-NEXT:    shl v2.4h, v2.4h, #8
5402; CHECK-SD-NEXT:    shl v0.4h, v0.4h, #8
5403; CHECK-SD-NEXT:    sshr v2.4h, v2.4h, #8
5404; CHECK-SD-NEXT:    shl v3.4h, v3.4h, #8
5405; CHECK-SD-NEXT:    shl v1.4h, v1.4h, #8
5406; CHECK-SD-NEXT:    sshr v0.4h, v0.4h, #8
5407; CHECK-SD-NEXT:    sshll v2.4s, v2.4h, #0
5408; CHECK-SD-NEXT:    sshr v3.4h, v3.4h, #8
5409; CHECK-SD-NEXT:    sshr v1.4h, v1.4h, #8
5410; CHECK-SD-NEXT:    sshll v4.4s, v0.4h, #0
5411; CHECK-SD-NEXT:    scvtf v0.4s, v2.4s
5412; CHECK-SD-NEXT:    sshll v3.4s, v3.4h, #0
5413; CHECK-SD-NEXT:    sshll v5.4s, v1.4h, #0
5414; CHECK-SD-NEXT:    scvtf v1.4s, v4.4s
5415; CHECK-SD-NEXT:    scvtf v2.4s, v3.4s
5416; CHECK-SD-NEXT:    scvtf v3.4s, v5.4s
5417; CHECK-SD-NEXT:    ret
5418;
5419; CHECK-GI-LABEL: stofp_v16i8_v16f32:
5420; CHECK-GI:       // %bb.0: // %entry
5421; CHECK-GI-NEXT:    sshll v1.8h, v0.8b, #0
5422; CHECK-GI-NEXT:    sshll2 v0.8h, v0.16b, #0
5423; CHECK-GI-NEXT:    sshll v2.4s, v1.4h, #0
5424; CHECK-GI-NEXT:    sshll2 v1.4s, v1.8h, #0
5425; CHECK-GI-NEXT:    sshll v3.4s, v0.4h, #0
5426; CHECK-GI-NEXT:    sshll2 v4.4s, v0.8h, #0
5427; CHECK-GI-NEXT:    scvtf v0.4s, v2.4s
5428; CHECK-GI-NEXT:    scvtf v1.4s, v1.4s
5429; CHECK-GI-NEXT:    scvtf v2.4s, v3.4s
5430; CHECK-GI-NEXT:    scvtf v3.4s, v4.4s
5431; CHECK-GI-NEXT:    ret
5432entry:
5433  %c = sitofp <16 x i8> %a to <16 x float>
5434  ret <16 x float> %c
5435}
5436
5437define <16 x float> @utofp_v16i8_v16f32(<16 x i8> %a) {
5438; CHECK-SD-LABEL: utofp_v16i8_v16f32:
5439; CHECK-SD:       // %bb.0: // %entry
5440; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
5441; CHECK-SD-NEXT:    zip1 v2.8b, v0.8b, v0.8b
5442; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5443; CHECK-SD-NEXT:    zip1 v3.8b, v1.8b, v0.8b
5444; CHECK-SD-NEXT:    zip2 v1.8b, v1.8b, v0.8b
5445; CHECK-SD-NEXT:    bic v2.4h, #255, lsl #8
5446; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
5447; CHECK-SD-NEXT:    ushll v2.4s, v2.4h, #0
5448; CHECK-SD-NEXT:    bic v3.4h, #255, lsl #8
5449; CHECK-SD-NEXT:    bic v1.4h, #255, lsl #8
5450; CHECK-SD-NEXT:    ushll v4.4s, v0.4h, #0
5451; CHECK-SD-NEXT:    ucvtf v0.4s, v2.4s
5452; CHECK-SD-NEXT:    ushll v3.4s, v3.4h, #0
5453; CHECK-SD-NEXT:    ushll v5.4s, v1.4h, #0
5454; CHECK-SD-NEXT:    ucvtf v1.4s, v4.4s
5455; CHECK-SD-NEXT:    ucvtf v2.4s, v3.4s
5456; CHECK-SD-NEXT:    ucvtf v3.4s, v5.4s
5457; CHECK-SD-NEXT:    ret
5458;
5459; CHECK-GI-LABEL: utofp_v16i8_v16f32:
5460; CHECK-GI:       // %bb.0: // %entry
5461; CHECK-GI-NEXT:    ushll v1.8h, v0.8b, #0
5462; CHECK-GI-NEXT:    ushll2 v0.8h, v0.16b, #0
5463; CHECK-GI-NEXT:    ushll v2.4s, v1.4h, #0
5464; CHECK-GI-NEXT:    ushll2 v1.4s, v1.8h, #0
5465; CHECK-GI-NEXT:    ushll v3.4s, v0.4h, #0
5466; CHECK-GI-NEXT:    ushll2 v4.4s, v0.8h, #0
5467; CHECK-GI-NEXT:    ucvtf v0.4s, v2.4s
5468; CHECK-GI-NEXT:    ucvtf v1.4s, v1.4s
5469; CHECK-GI-NEXT:    ucvtf v2.4s, v3.4s
5470; CHECK-GI-NEXT:    ucvtf v3.4s, v4.4s
5471; CHECK-GI-NEXT:    ret
5472entry:
5473  %c = uitofp <16 x i8> %a to <16 x float>
5474  ret <16 x float> %c
5475}
5476
5477define <32 x float> @stofp_v32i8_v32f32(<32 x i8> %a) {
5478; CHECK-SD-LABEL: stofp_v32i8_v32f32:
5479; CHECK-SD:       // %bb.0: // %entry
5480; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
5481; CHECK-SD-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
5482; CHECK-SD-NEXT:    zip1 v4.8b, v0.8b, v0.8b
5483; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5484; CHECK-SD-NEXT:    shl v4.4h, v4.4h, #8
5485; CHECK-SD-NEXT:    zip1 v5.8b, v1.8b, v0.8b
5486; CHECK-SD-NEXT:    zip1 v6.8b, v2.8b, v0.8b
5487; CHECK-SD-NEXT:    zip2 v2.8b, v2.8b, v0.8b
5488; CHECK-SD-NEXT:    zip2 v1.8b, v1.8b, v0.8b
5489; CHECK-SD-NEXT:    zip1 v7.8b, v3.8b, v0.8b
5490; CHECK-SD-NEXT:    zip2 v3.8b, v3.8b, v0.8b
5491; CHECK-SD-NEXT:    shl v0.4h, v0.4h, #8
5492; CHECK-SD-NEXT:    sshr v4.4h, v4.4h, #8
5493; CHECK-SD-NEXT:    shl v5.4h, v5.4h, #8
5494; CHECK-SD-NEXT:    shl v6.4h, v6.4h, #8
5495; CHECK-SD-NEXT:    shl v2.4h, v2.4h, #8
5496; CHECK-SD-NEXT:    shl v1.4h, v1.4h, #8
5497; CHECK-SD-NEXT:    shl v7.4h, v7.4h, #8
5498; CHECK-SD-NEXT:    shl v3.4h, v3.4h, #8
5499; CHECK-SD-NEXT:    sshr v0.4h, v0.4h, #8
5500; CHECK-SD-NEXT:    sshll v4.4s, v4.4h, #0
5501; CHECK-SD-NEXT:    sshr v5.4h, v5.4h, #8
5502; CHECK-SD-NEXT:    sshr v6.4h, v6.4h, #8
5503; CHECK-SD-NEXT:    sshr v2.4h, v2.4h, #8
5504; CHECK-SD-NEXT:    sshr v1.4h, v1.4h, #8
5505; CHECK-SD-NEXT:    sshr v7.4h, v7.4h, #8
5506; CHECK-SD-NEXT:    sshr v3.4h, v3.4h, #8
5507; CHECK-SD-NEXT:    sshll v16.4s, v0.4h, #0
5508; CHECK-SD-NEXT:    scvtf v0.4s, v4.4s
5509; CHECK-SD-NEXT:    sshll v5.4s, v5.4h, #0
5510; CHECK-SD-NEXT:    sshll v6.4s, v6.4h, #0
5511; CHECK-SD-NEXT:    sshll v17.4s, v2.4h, #0
5512; CHECK-SD-NEXT:    sshll v18.4s, v1.4h, #0
5513; CHECK-SD-NEXT:    sshll v7.4s, v7.4h, #0
5514; CHECK-SD-NEXT:    sshll v19.4s, v3.4h, #0
5515; CHECK-SD-NEXT:    scvtf v1.4s, v16.4s
5516; CHECK-SD-NEXT:    scvtf v4.4s, v5.4s
5517; CHECK-SD-NEXT:    scvtf v2.4s, v6.4s
5518; CHECK-SD-NEXT:    scvtf v3.4s, v17.4s
5519; CHECK-SD-NEXT:    scvtf v5.4s, v18.4s
5520; CHECK-SD-NEXT:    scvtf v6.4s, v7.4s
5521; CHECK-SD-NEXT:    scvtf v7.4s, v19.4s
5522; CHECK-SD-NEXT:    ret
5523;
5524; CHECK-GI-LABEL: stofp_v32i8_v32f32:
5525; CHECK-GI:       // %bb.0: // %entry
5526; CHECK-GI-NEXT:    sshll v2.8h, v0.8b, #0
5527; CHECK-GI-NEXT:    sshll2 v0.8h, v0.16b, #0
5528; CHECK-GI-NEXT:    sshll v3.8h, v1.8b, #0
5529; CHECK-GI-NEXT:    sshll2 v1.8h, v1.16b, #0
5530; CHECK-GI-NEXT:    sshll v4.4s, v2.4h, #0
5531; CHECK-GI-NEXT:    sshll2 v2.4s, v2.8h, #0
5532; CHECK-GI-NEXT:    sshll v5.4s, v0.4h, #0
5533; CHECK-GI-NEXT:    sshll2 v6.4s, v0.8h, #0
5534; CHECK-GI-NEXT:    sshll v7.4s, v3.4h, #0
5535; CHECK-GI-NEXT:    sshll2 v16.4s, v3.8h, #0
5536; CHECK-GI-NEXT:    sshll v17.4s, v1.4h, #0
5537; CHECK-GI-NEXT:    sshll2 v18.4s, v1.8h, #0
5538; CHECK-GI-NEXT:    scvtf v0.4s, v4.4s
5539; CHECK-GI-NEXT:    scvtf v1.4s, v2.4s
5540; CHECK-GI-NEXT:    scvtf v2.4s, v5.4s
5541; CHECK-GI-NEXT:    scvtf v3.4s, v6.4s
5542; CHECK-GI-NEXT:    scvtf v4.4s, v7.4s
5543; CHECK-GI-NEXT:    scvtf v5.4s, v16.4s
5544; CHECK-GI-NEXT:    scvtf v6.4s, v17.4s
5545; CHECK-GI-NEXT:    scvtf v7.4s, v18.4s
5546; CHECK-GI-NEXT:    ret
5547entry:
5548  %c = sitofp <32 x i8> %a to <32 x float>
5549  ret <32 x float> %c
5550}
5551
5552define <32 x float> @utofp_v32i8_v32f32(<32 x i8> %a) {
5553; CHECK-SD-LABEL: utofp_v32i8_v32f32:
5554; CHECK-SD:       // %bb.0: // %entry
5555; CHECK-SD-NEXT:    ext v2.16b, v0.16b, v0.16b, #8
5556; CHECK-SD-NEXT:    ext v3.16b, v1.16b, v1.16b, #8
5557; CHECK-SD-NEXT:    zip1 v4.8b, v0.8b, v0.8b
5558; CHECK-SD-NEXT:    zip2 v0.8b, v0.8b, v0.8b
5559; CHECK-SD-NEXT:    bic v4.4h, #255, lsl #8
5560; CHECK-SD-NEXT:    zip1 v5.8b, v1.8b, v0.8b
5561; CHECK-SD-NEXT:    zip1 v6.8b, v2.8b, v0.8b
5562; CHECK-SD-NEXT:    zip2 v2.8b, v2.8b, v0.8b
5563; CHECK-SD-NEXT:    zip2 v1.8b, v1.8b, v0.8b
5564; CHECK-SD-NEXT:    zip1 v7.8b, v3.8b, v0.8b
5565; CHECK-SD-NEXT:    zip2 v3.8b, v3.8b, v0.8b
5566; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
5567; CHECK-SD-NEXT:    ushll v4.4s, v4.4h, #0
5568; CHECK-SD-NEXT:    bic v5.4h, #255, lsl #8
5569; CHECK-SD-NEXT:    bic v6.4h, #255, lsl #8
5570; CHECK-SD-NEXT:    bic v2.4h, #255, lsl #8
5571; CHECK-SD-NEXT:    bic v1.4h, #255, lsl #8
5572; CHECK-SD-NEXT:    bic v7.4h, #255, lsl #8
5573; CHECK-SD-NEXT:    bic v3.4h, #255, lsl #8
5574; CHECK-SD-NEXT:    ushll v16.4s, v0.4h, #0
5575; CHECK-SD-NEXT:    ucvtf v0.4s, v4.4s
5576; CHECK-SD-NEXT:    ushll v5.4s, v5.4h, #0
5577; CHECK-SD-NEXT:    ushll v6.4s, v6.4h, #0
5578; CHECK-SD-NEXT:    ushll v17.4s, v2.4h, #0
5579; CHECK-SD-NEXT:    ushll v18.4s, v1.4h, #0
5580; CHECK-SD-NEXT:    ushll v7.4s, v7.4h, #0
5581; CHECK-SD-NEXT:    ushll v19.4s, v3.4h, #0
5582; CHECK-SD-NEXT:    ucvtf v1.4s, v16.4s
5583; CHECK-SD-NEXT:    ucvtf v4.4s, v5.4s
5584; CHECK-SD-NEXT:    ucvtf v2.4s, v6.4s
5585; CHECK-SD-NEXT:    ucvtf v3.4s, v17.4s
5586; CHECK-SD-NEXT:    ucvtf v5.4s, v18.4s
5587; CHECK-SD-NEXT:    ucvtf v6.4s, v7.4s
5588; CHECK-SD-NEXT:    ucvtf v7.4s, v19.4s
5589; CHECK-SD-NEXT:    ret
5590;
5591; CHECK-GI-LABEL: utofp_v32i8_v32f32:
5592; CHECK-GI:       // %bb.0: // %entry
5593; CHECK-GI-NEXT:    ushll v2.8h, v0.8b, #0
5594; CHECK-GI-NEXT:    ushll2 v0.8h, v0.16b, #0
5595; CHECK-GI-NEXT:    ushll v3.8h, v1.8b, #0
5596; CHECK-GI-NEXT:    ushll2 v1.8h, v1.16b, #0
5597; CHECK-GI-NEXT:    ushll v4.4s, v2.4h, #0
5598; CHECK-GI-NEXT:    ushll2 v2.4s, v2.8h, #0
5599; CHECK-GI-NEXT:    ushll v5.4s, v0.4h, #0
5600; CHECK-GI-NEXT:    ushll2 v6.4s, v0.8h, #0
5601; CHECK-GI-NEXT:    ushll v7.4s, v3.4h, #0
5602; CHECK-GI-NEXT:    ushll2 v16.4s, v3.8h, #0
5603; CHECK-GI-NEXT:    ushll v17.4s, v1.4h, #0
5604; CHECK-GI-NEXT:    ushll2 v18.4s, v1.8h, #0
5605; CHECK-GI-NEXT:    ucvtf v0.4s, v4.4s
5606; CHECK-GI-NEXT:    ucvtf v1.4s, v2.4s
5607; CHECK-GI-NEXT:    ucvtf v2.4s, v5.4s
5608; CHECK-GI-NEXT:    ucvtf v3.4s, v6.4s
5609; CHECK-GI-NEXT:    ucvtf v4.4s, v7.4s
5610; CHECK-GI-NEXT:    ucvtf v5.4s, v16.4s
5611; CHECK-GI-NEXT:    ucvtf v6.4s, v17.4s
5612; CHECK-GI-NEXT:    ucvtf v7.4s, v18.4s
5613; CHECK-GI-NEXT:    ret
5614entry:
5615  %c = uitofp <32 x i8> %a to <32 x float>
5616  ret <32 x float> %c
5617}
5618
5619define <2 x half> @stofp_v2i128_v2f16(<2 x i128> %a) {
5620; CHECK-SD-NOFP16-LABEL: stofp_v2i128_v2f16:
5621; CHECK-SD-NOFP16:       // %bb.0: // %entry
5622; CHECK-SD-NOFP16-NEXT:    sub sp, sp, #48
5623; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5624; CHECK-SD-NOFP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5625; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 48
5626; CHECK-SD-NOFP16-NEXT:    .cfi_offset w19, -8
5627; CHECK-SD-NOFP16-NEXT:    .cfi_offset w20, -16
5628; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -32
5629; CHECK-SD-NOFP16-NEXT:    mov x19, x1
5630; CHECK-SD-NOFP16-NEXT:    mov x20, x0
5631; CHECK-SD-NOFP16-NEXT:    mov x0, x2
5632; CHECK-SD-NOFP16-NEXT:    mov x1, x3
5633; CHECK-SD-NOFP16-NEXT:    bl __floattisf
5634; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5635; CHECK-SD-NOFP16-NEXT:    mov x0, x20
5636; CHECK-SD-NOFP16-NEXT:    mov x1, x19
5637; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5638; CHECK-SD-NOFP16-NEXT:    bl __floattisf
5639; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5640; CHECK-SD-NOFP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5641; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5642; CHECK-SD-NOFP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5643; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
5644; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5645; CHECK-SD-NOFP16-NEXT:    add sp, sp, #48
5646; CHECK-SD-NOFP16-NEXT:    ret
5647;
5648; CHECK-SD-FP16-LABEL: stofp_v2i128_v2f16:
5649; CHECK-SD-FP16:       // %bb.0: // %entry
5650; CHECK-SD-FP16-NEXT:    sub sp, sp, #48
5651; CHECK-SD-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5652; CHECK-SD-FP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5653; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 48
5654; CHECK-SD-FP16-NEXT:    .cfi_offset w19, -8
5655; CHECK-SD-FP16-NEXT:    .cfi_offset w20, -16
5656; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -32
5657; CHECK-SD-FP16-NEXT:    mov x19, x1
5658; CHECK-SD-FP16-NEXT:    mov x20, x0
5659; CHECK-SD-FP16-NEXT:    mov x0, x2
5660; CHECK-SD-FP16-NEXT:    mov x1, x3
5661; CHECK-SD-FP16-NEXT:    bl __floattihf
5662; CHECK-SD-FP16-NEXT:    mov x0, x20
5663; CHECK-SD-FP16-NEXT:    mov x1, x19
5664; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5665; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5666; CHECK-SD-FP16-NEXT:    bl __floattihf
5667; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5668; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5669; CHECK-SD-FP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5670; CHECK-SD-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5671; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
5672; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5673; CHECK-SD-FP16-NEXT:    add sp, sp, #48
5674; CHECK-SD-FP16-NEXT:    ret
5675;
5676; CHECK-GI-NOFP16-LABEL: stofp_v2i128_v2f16:
5677; CHECK-GI-NOFP16:       // %bb.0: // %entry
5678; CHECK-GI-NOFP16-NEXT:    sub sp, sp, #48
5679; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5680; CHECK-GI-NOFP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5681; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 48
5682; CHECK-GI-NOFP16-NEXT:    .cfi_offset w19, -8
5683; CHECK-GI-NOFP16-NEXT:    .cfi_offset w20, -16
5684; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -32
5685; CHECK-GI-NOFP16-NEXT:    mov x19, x2
5686; CHECK-GI-NOFP16-NEXT:    mov x20, x3
5687; CHECK-GI-NOFP16-NEXT:    bl __floattisf
5688; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
5689; CHECK-GI-NOFP16-NEXT:    mov x0, x19
5690; CHECK-GI-NOFP16-NEXT:    mov x1, x20
5691; CHECK-GI-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5692; CHECK-GI-NOFP16-NEXT:    bl __floattisf
5693; CHECK-GI-NOFP16-NEXT:    fcvt h1, s0
5694; CHECK-GI-NOFP16-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
5695; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5696; CHECK-GI-NOFP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5697; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
5698; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5699; CHECK-GI-NOFP16-NEXT:    add sp, sp, #48
5700; CHECK-GI-NOFP16-NEXT:    ret
5701;
5702; CHECK-GI-FP16-LABEL: stofp_v2i128_v2f16:
5703; CHECK-GI-FP16:       // %bb.0: // %entry
5704; CHECK-GI-FP16-NEXT:    sub sp, sp, #48
5705; CHECK-GI-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5706; CHECK-GI-FP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5707; CHECK-GI-FP16-NEXT:    .cfi_def_cfa_offset 48
5708; CHECK-GI-FP16-NEXT:    .cfi_offset w19, -8
5709; CHECK-GI-FP16-NEXT:    .cfi_offset w20, -16
5710; CHECK-GI-FP16-NEXT:    .cfi_offset w30, -32
5711; CHECK-GI-FP16-NEXT:    mov x19, x2
5712; CHECK-GI-FP16-NEXT:    mov x20, x3
5713; CHECK-GI-FP16-NEXT:    bl __floattihf
5714; CHECK-GI-FP16-NEXT:    mov x0, x19
5715; CHECK-GI-FP16-NEXT:    mov x1, x20
5716; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5717; CHECK-GI-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5718; CHECK-GI-FP16-NEXT:    bl __floattihf
5719; CHECK-GI-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5720; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5721; CHECK-GI-FP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5722; CHECK-GI-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5723; CHECK-GI-FP16-NEXT:    mov v1.h[1], v0.h[0]
5724; CHECK-GI-FP16-NEXT:    fmov d0, d1
5725; CHECK-GI-FP16-NEXT:    add sp, sp, #48
5726; CHECK-GI-FP16-NEXT:    ret
5727entry:
5728  %c = sitofp <2 x i128> %a to <2 x half>
5729  ret <2 x half> %c
5730}
5731
5732define <2 x half> @utofp_v2i128_v2f16(<2 x i128> %a) {
5733; CHECK-SD-NOFP16-LABEL: utofp_v2i128_v2f16:
5734; CHECK-SD-NOFP16:       // %bb.0: // %entry
5735; CHECK-SD-NOFP16-NEXT:    sub sp, sp, #48
5736; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5737; CHECK-SD-NOFP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5738; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 48
5739; CHECK-SD-NOFP16-NEXT:    .cfi_offset w19, -8
5740; CHECK-SD-NOFP16-NEXT:    .cfi_offset w20, -16
5741; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -32
5742; CHECK-SD-NOFP16-NEXT:    mov x19, x1
5743; CHECK-SD-NOFP16-NEXT:    mov x20, x0
5744; CHECK-SD-NOFP16-NEXT:    mov x0, x2
5745; CHECK-SD-NOFP16-NEXT:    mov x1, x3
5746; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
5747; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5748; CHECK-SD-NOFP16-NEXT:    mov x0, x20
5749; CHECK-SD-NOFP16-NEXT:    mov x1, x19
5750; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5751; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
5752; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5753; CHECK-SD-NOFP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5754; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5755; CHECK-SD-NOFP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5756; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
5757; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5758; CHECK-SD-NOFP16-NEXT:    add sp, sp, #48
5759; CHECK-SD-NOFP16-NEXT:    ret
5760;
5761; CHECK-SD-FP16-LABEL: utofp_v2i128_v2f16:
5762; CHECK-SD-FP16:       // %bb.0: // %entry
5763; CHECK-SD-FP16-NEXT:    sub sp, sp, #48
5764; CHECK-SD-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5765; CHECK-SD-FP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5766; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 48
5767; CHECK-SD-FP16-NEXT:    .cfi_offset w19, -8
5768; CHECK-SD-FP16-NEXT:    .cfi_offset w20, -16
5769; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -32
5770; CHECK-SD-FP16-NEXT:    mov x19, x1
5771; CHECK-SD-FP16-NEXT:    mov x20, x0
5772; CHECK-SD-FP16-NEXT:    mov x0, x2
5773; CHECK-SD-FP16-NEXT:    mov x1, x3
5774; CHECK-SD-FP16-NEXT:    bl __floatuntihf
5775; CHECK-SD-FP16-NEXT:    mov x0, x20
5776; CHECK-SD-FP16-NEXT:    mov x1, x19
5777; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5778; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5779; CHECK-SD-FP16-NEXT:    bl __floatuntihf
5780; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5781; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5782; CHECK-SD-FP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5783; CHECK-SD-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5784; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
5785; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5786; CHECK-SD-FP16-NEXT:    add sp, sp, #48
5787; CHECK-SD-FP16-NEXT:    ret
5788;
5789; CHECK-GI-NOFP16-LABEL: utofp_v2i128_v2f16:
5790; CHECK-GI-NOFP16:       // %bb.0: // %entry
5791; CHECK-GI-NOFP16-NEXT:    sub sp, sp, #48
5792; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5793; CHECK-GI-NOFP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5794; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 48
5795; CHECK-GI-NOFP16-NEXT:    .cfi_offset w19, -8
5796; CHECK-GI-NOFP16-NEXT:    .cfi_offset w20, -16
5797; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -32
5798; CHECK-GI-NOFP16-NEXT:    mov x19, x2
5799; CHECK-GI-NOFP16-NEXT:    mov x20, x3
5800; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
5801; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
5802; CHECK-GI-NOFP16-NEXT:    mov x0, x19
5803; CHECK-GI-NOFP16-NEXT:    mov x1, x20
5804; CHECK-GI-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5805; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
5806; CHECK-GI-NOFP16-NEXT:    fcvt h1, s0
5807; CHECK-GI-NOFP16-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
5808; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5809; CHECK-GI-NOFP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5810; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
5811; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5812; CHECK-GI-NOFP16-NEXT:    add sp, sp, #48
5813; CHECK-GI-NOFP16-NEXT:    ret
5814;
5815; CHECK-GI-FP16-LABEL: utofp_v2i128_v2f16:
5816; CHECK-GI-FP16:       // %bb.0: // %entry
5817; CHECK-GI-FP16-NEXT:    sub sp, sp, #48
5818; CHECK-GI-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5819; CHECK-GI-FP16-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
5820; CHECK-GI-FP16-NEXT:    .cfi_def_cfa_offset 48
5821; CHECK-GI-FP16-NEXT:    .cfi_offset w19, -8
5822; CHECK-GI-FP16-NEXT:    .cfi_offset w20, -16
5823; CHECK-GI-FP16-NEXT:    .cfi_offset w30, -32
5824; CHECK-GI-FP16-NEXT:    mov x19, x2
5825; CHECK-GI-FP16-NEXT:    mov x20, x3
5826; CHECK-GI-FP16-NEXT:    bl __floatuntihf
5827; CHECK-GI-FP16-NEXT:    mov x0, x19
5828; CHECK-GI-FP16-NEXT:    mov x1, x20
5829; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5830; CHECK-GI-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5831; CHECK-GI-FP16-NEXT:    bl __floatuntihf
5832; CHECK-GI-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5833; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5834; CHECK-GI-FP16-NEXT:    ldp x20, x19, [sp, #32] // 16-byte Folded Reload
5835; CHECK-GI-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5836; CHECK-GI-FP16-NEXT:    mov v1.h[1], v0.h[0]
5837; CHECK-GI-FP16-NEXT:    fmov d0, d1
5838; CHECK-GI-FP16-NEXT:    add sp, sp, #48
5839; CHECK-GI-FP16-NEXT:    ret
5840entry:
5841  %c = uitofp <2 x i128> %a to <2 x half>
5842  ret <2 x half> %c
5843}
5844
5845define <3 x half> @stofp_v3i128_v3f16(<3 x i128> %a) {
5846; CHECK-SD-NOFP16-LABEL: stofp_v3i128_v3f16:
5847; CHECK-SD-NOFP16:       // %bb.0: // %entry
5848; CHECK-SD-NOFP16-NEXT:    sub sp, sp, #64
5849; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5850; CHECK-SD-NOFP16-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
5851; CHECK-SD-NOFP16-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
5852; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 64
5853; CHECK-SD-NOFP16-NEXT:    .cfi_offset w19, -8
5854; CHECK-SD-NOFP16-NEXT:    .cfi_offset w20, -16
5855; CHECK-SD-NOFP16-NEXT:    .cfi_offset w21, -24
5856; CHECK-SD-NOFP16-NEXT:    .cfi_offset w22, -32
5857; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -48
5858; CHECK-SD-NOFP16-NEXT:    mov x21, x1
5859; CHECK-SD-NOFP16-NEXT:    mov x22, x0
5860; CHECK-SD-NOFP16-NEXT:    mov x0, x2
5861; CHECK-SD-NOFP16-NEXT:    mov x1, x3
5862; CHECK-SD-NOFP16-NEXT:    mov x19, x5
5863; CHECK-SD-NOFP16-NEXT:    mov x20, x4
5864; CHECK-SD-NOFP16-NEXT:    bl __floattisf
5865; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5866; CHECK-SD-NOFP16-NEXT:    mov x0, x22
5867; CHECK-SD-NOFP16-NEXT:    mov x1, x21
5868; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5869; CHECK-SD-NOFP16-NEXT:    bl __floattisf
5870; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
5871; CHECK-SD-NOFP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5872; CHECK-SD-NOFP16-NEXT:    mov x0, x20
5873; CHECK-SD-NOFP16-NEXT:    mov x1, x19
5874; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
5875; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5876; CHECK-SD-NOFP16-NEXT:    bl __floattisf
5877; CHECK-SD-NOFP16-NEXT:    fcvt h1, s0
5878; CHECK-SD-NOFP16-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
5879; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5880; CHECK-SD-NOFP16-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
5881; CHECK-SD-NOFP16-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
5882; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
5883; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5884; CHECK-SD-NOFP16-NEXT:    add sp, sp, #64
5885; CHECK-SD-NOFP16-NEXT:    ret
5886;
5887; CHECK-SD-FP16-LABEL: stofp_v3i128_v3f16:
5888; CHECK-SD-FP16:       // %bb.0: // %entry
5889; CHECK-SD-FP16-NEXT:    sub sp, sp, #64
5890; CHECK-SD-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
5891; CHECK-SD-FP16-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
5892; CHECK-SD-FP16-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
5893; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 64
5894; CHECK-SD-FP16-NEXT:    .cfi_offset w19, -8
5895; CHECK-SD-FP16-NEXT:    .cfi_offset w20, -16
5896; CHECK-SD-FP16-NEXT:    .cfi_offset w21, -24
5897; CHECK-SD-FP16-NEXT:    .cfi_offset w22, -32
5898; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -48
5899; CHECK-SD-FP16-NEXT:    mov x21, x1
5900; CHECK-SD-FP16-NEXT:    mov x22, x0
5901; CHECK-SD-FP16-NEXT:    mov x0, x2
5902; CHECK-SD-FP16-NEXT:    mov x1, x3
5903; CHECK-SD-FP16-NEXT:    mov x19, x5
5904; CHECK-SD-FP16-NEXT:    mov x20, x4
5905; CHECK-SD-FP16-NEXT:    bl __floattihf
5906; CHECK-SD-FP16-NEXT:    mov x0, x22
5907; CHECK-SD-FP16-NEXT:    mov x1, x21
5908; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5909; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5910; CHECK-SD-FP16-NEXT:    bl __floattihf
5911; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5912; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5913; CHECK-SD-FP16-NEXT:    mov x0, x20
5914; CHECK-SD-FP16-NEXT:    mov x1, x19
5915; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
5916; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5917; CHECK-SD-FP16-NEXT:    bl __floattihf
5918; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
5919; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5920; CHECK-SD-FP16-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
5921; CHECK-SD-FP16-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
5922; CHECK-SD-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
5923; CHECK-SD-FP16-NEXT:    mov v1.h[2], v0.h[0]
5924; CHECK-SD-FP16-NEXT:    fmov d0, d1
5925; CHECK-SD-FP16-NEXT:    add sp, sp, #64
5926; CHECK-SD-FP16-NEXT:    ret
5927;
5928; CHECK-GI-NOFP16-LABEL: stofp_v3i128_v3f16:
5929; CHECK-GI-NOFP16:       // %bb.0: // %entry
5930; CHECK-GI-NOFP16-NEXT:    sub sp, sp, #80
5931; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
5932; CHECK-GI-NOFP16-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
5933; CHECK-GI-NOFP16-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
5934; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 80
5935; CHECK-GI-NOFP16-NEXT:    .cfi_offset w19, -8
5936; CHECK-GI-NOFP16-NEXT:    .cfi_offset w20, -16
5937; CHECK-GI-NOFP16-NEXT:    .cfi_offset w21, -24
5938; CHECK-GI-NOFP16-NEXT:    .cfi_offset w22, -32
5939; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -48
5940; CHECK-GI-NOFP16-NEXT:    mov x19, x2
5941; CHECK-GI-NOFP16-NEXT:    mov x20, x3
5942; CHECK-GI-NOFP16-NEXT:    mov x21, x4
5943; CHECK-GI-NOFP16-NEXT:    mov x22, x5
5944; CHECK-GI-NOFP16-NEXT:    bl __floattisf
5945; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
5946; CHECK-GI-NOFP16-NEXT:    mov x0, x19
5947; CHECK-GI-NOFP16-NEXT:    mov x1, x20
5948; CHECK-GI-NOFP16-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
5949; CHECK-GI-NOFP16-NEXT:    bl __floattisf
5950; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
5951; CHECK-GI-NOFP16-NEXT:    mov x0, x21
5952; CHECK-GI-NOFP16-NEXT:    mov x1, x22
5953; CHECK-GI-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5954; CHECK-GI-NOFP16-NEXT:    bl __floattisf
5955; CHECK-GI-NOFP16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
5956; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
5957; CHECK-GI-NOFP16-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
5958; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
5959; CHECK-GI-NOFP16-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
5960; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
5961; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
5962; CHECK-GI-NOFP16-NEXT:    mov v0.16b, v1.16b
5963; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
5964; CHECK-GI-NOFP16-NEXT:    add sp, sp, #80
5965; CHECK-GI-NOFP16-NEXT:    ret
5966;
5967; CHECK-GI-FP16-LABEL: stofp_v3i128_v3f16:
5968; CHECK-GI-FP16:       // %bb.0: // %entry
5969; CHECK-GI-FP16-NEXT:    sub sp, sp, #80
5970; CHECK-GI-FP16-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
5971; CHECK-GI-FP16-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
5972; CHECK-GI-FP16-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
5973; CHECK-GI-FP16-NEXT:    .cfi_def_cfa_offset 80
5974; CHECK-GI-FP16-NEXT:    .cfi_offset w19, -8
5975; CHECK-GI-FP16-NEXT:    .cfi_offset w20, -16
5976; CHECK-GI-FP16-NEXT:    .cfi_offset w21, -24
5977; CHECK-GI-FP16-NEXT:    .cfi_offset w22, -32
5978; CHECK-GI-FP16-NEXT:    .cfi_offset w30, -48
5979; CHECK-GI-FP16-NEXT:    mov x19, x2
5980; CHECK-GI-FP16-NEXT:    mov x20, x3
5981; CHECK-GI-FP16-NEXT:    mov x21, x4
5982; CHECK-GI-FP16-NEXT:    mov x22, x5
5983; CHECK-GI-FP16-NEXT:    bl __floattihf
5984; CHECK-GI-FP16-NEXT:    mov x0, x19
5985; CHECK-GI-FP16-NEXT:    mov x1, x20
5986; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5987; CHECK-GI-FP16-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
5988; CHECK-GI-FP16-NEXT:    bl __floattihf
5989; CHECK-GI-FP16-NEXT:    mov x0, x21
5990; CHECK-GI-FP16-NEXT:    mov x1, x22
5991; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5992; CHECK-GI-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
5993; CHECK-GI-FP16-NEXT:    bl __floattihf
5994; CHECK-GI-FP16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
5995; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
5996; CHECK-GI-FP16-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
5997; CHECK-GI-FP16-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
5998; CHECK-GI-FP16-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
5999; CHECK-GI-FP16-NEXT:    mov v1.h[1], v2.h[0]
6000; CHECK-GI-FP16-NEXT:    mov v1.h[2], v0.h[0]
6001; CHECK-GI-FP16-NEXT:    mov v0.16b, v1.16b
6002; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6003; CHECK-GI-FP16-NEXT:    add sp, sp, #80
6004; CHECK-GI-FP16-NEXT:    ret
6005entry:
6006  %c = sitofp <3 x i128> %a to <3 x half>
6007  ret <3 x half> %c
6008}
6009
6010define <3 x half> @utofp_v3i128_v3f16(<3 x i128> %a) {
6011; CHECK-SD-NOFP16-LABEL: utofp_v3i128_v3f16:
6012; CHECK-SD-NOFP16:       // %bb.0: // %entry
6013; CHECK-SD-NOFP16-NEXT:    sub sp, sp, #64
6014; CHECK-SD-NOFP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
6015; CHECK-SD-NOFP16-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
6016; CHECK-SD-NOFP16-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
6017; CHECK-SD-NOFP16-NEXT:    .cfi_def_cfa_offset 64
6018; CHECK-SD-NOFP16-NEXT:    .cfi_offset w19, -8
6019; CHECK-SD-NOFP16-NEXT:    .cfi_offset w20, -16
6020; CHECK-SD-NOFP16-NEXT:    .cfi_offset w21, -24
6021; CHECK-SD-NOFP16-NEXT:    .cfi_offset w22, -32
6022; CHECK-SD-NOFP16-NEXT:    .cfi_offset w30, -48
6023; CHECK-SD-NOFP16-NEXT:    mov x21, x1
6024; CHECK-SD-NOFP16-NEXT:    mov x22, x0
6025; CHECK-SD-NOFP16-NEXT:    mov x0, x2
6026; CHECK-SD-NOFP16-NEXT:    mov x1, x3
6027; CHECK-SD-NOFP16-NEXT:    mov x19, x5
6028; CHECK-SD-NOFP16-NEXT:    mov x20, x4
6029; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
6030; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
6031; CHECK-SD-NOFP16-NEXT:    mov x0, x22
6032; CHECK-SD-NOFP16-NEXT:    mov x1, x21
6033; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6034; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
6035; CHECK-SD-NOFP16-NEXT:    fcvt h0, s0
6036; CHECK-SD-NOFP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
6037; CHECK-SD-NOFP16-NEXT:    mov x0, x20
6038; CHECK-SD-NOFP16-NEXT:    mov x1, x19
6039; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v1.h[0]
6040; CHECK-SD-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6041; CHECK-SD-NOFP16-NEXT:    bl __floatuntisf
6042; CHECK-SD-NOFP16-NEXT:    fcvt h1, s0
6043; CHECK-SD-NOFP16-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
6044; CHECK-SD-NOFP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
6045; CHECK-SD-NOFP16-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
6046; CHECK-SD-NOFP16-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
6047; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], v1.h[0]
6048; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6049; CHECK-SD-NOFP16-NEXT:    add sp, sp, #64
6050; CHECK-SD-NOFP16-NEXT:    ret
6051;
6052; CHECK-SD-FP16-LABEL: utofp_v3i128_v3f16:
6053; CHECK-SD-FP16:       // %bb.0: // %entry
6054; CHECK-SD-FP16-NEXT:    sub sp, sp, #64
6055; CHECK-SD-FP16-NEXT:    str x30, [sp, #16] // 8-byte Folded Spill
6056; CHECK-SD-FP16-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill
6057; CHECK-SD-FP16-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill
6058; CHECK-SD-FP16-NEXT:    .cfi_def_cfa_offset 64
6059; CHECK-SD-FP16-NEXT:    .cfi_offset w19, -8
6060; CHECK-SD-FP16-NEXT:    .cfi_offset w20, -16
6061; CHECK-SD-FP16-NEXT:    .cfi_offset w21, -24
6062; CHECK-SD-FP16-NEXT:    .cfi_offset w22, -32
6063; CHECK-SD-FP16-NEXT:    .cfi_offset w30, -48
6064; CHECK-SD-FP16-NEXT:    mov x21, x1
6065; CHECK-SD-FP16-NEXT:    mov x22, x0
6066; CHECK-SD-FP16-NEXT:    mov x0, x2
6067; CHECK-SD-FP16-NEXT:    mov x1, x3
6068; CHECK-SD-FP16-NEXT:    mov x19, x5
6069; CHECK-SD-FP16-NEXT:    mov x20, x4
6070; CHECK-SD-FP16-NEXT:    bl __floatuntihf
6071; CHECK-SD-FP16-NEXT:    mov x0, x22
6072; CHECK-SD-FP16-NEXT:    mov x1, x21
6073; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6074; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6075; CHECK-SD-FP16-NEXT:    bl __floatuntihf
6076; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
6077; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6078; CHECK-SD-FP16-NEXT:    mov x0, x20
6079; CHECK-SD-FP16-NEXT:    mov x1, x19
6080; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
6081; CHECK-SD-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6082; CHECK-SD-FP16-NEXT:    bl __floatuntihf
6083; CHECK-SD-FP16-NEXT:    ldr q1, [sp] // 16-byte Folded Reload
6084; CHECK-SD-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6085; CHECK-SD-FP16-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload
6086; CHECK-SD-FP16-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload
6087; CHECK-SD-FP16-NEXT:    ldr x30, [sp, #16] // 8-byte Folded Reload
6088; CHECK-SD-FP16-NEXT:    mov v1.h[2], v0.h[0]
6089; CHECK-SD-FP16-NEXT:    fmov d0, d1
6090; CHECK-SD-FP16-NEXT:    add sp, sp, #64
6091; CHECK-SD-FP16-NEXT:    ret
6092;
6093; CHECK-GI-NOFP16-LABEL: utofp_v3i128_v3f16:
6094; CHECK-GI-NOFP16:       // %bb.0: // %entry
6095; CHECK-GI-NOFP16-NEXT:    sub sp, sp, #80
6096; CHECK-GI-NOFP16-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
6097; CHECK-GI-NOFP16-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
6098; CHECK-GI-NOFP16-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
6099; CHECK-GI-NOFP16-NEXT:    .cfi_def_cfa_offset 80
6100; CHECK-GI-NOFP16-NEXT:    .cfi_offset w19, -8
6101; CHECK-GI-NOFP16-NEXT:    .cfi_offset w20, -16
6102; CHECK-GI-NOFP16-NEXT:    .cfi_offset w21, -24
6103; CHECK-GI-NOFP16-NEXT:    .cfi_offset w22, -32
6104; CHECK-GI-NOFP16-NEXT:    .cfi_offset w30, -48
6105; CHECK-GI-NOFP16-NEXT:    mov x19, x2
6106; CHECK-GI-NOFP16-NEXT:    mov x20, x3
6107; CHECK-GI-NOFP16-NEXT:    mov x21, x4
6108; CHECK-GI-NOFP16-NEXT:    mov x22, x5
6109; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
6110; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
6111; CHECK-GI-NOFP16-NEXT:    mov x0, x19
6112; CHECK-GI-NOFP16-NEXT:    mov x1, x20
6113; CHECK-GI-NOFP16-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
6114; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
6115; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
6116; CHECK-GI-NOFP16-NEXT:    mov x0, x21
6117; CHECK-GI-NOFP16-NEXT:    mov x1, x22
6118; CHECK-GI-NOFP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6119; CHECK-GI-NOFP16-NEXT:    bl __floatuntisf
6120; CHECK-GI-NOFP16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
6121; CHECK-GI-NOFP16-NEXT:    fcvt h0, s0
6122; CHECK-GI-NOFP16-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
6123; CHECK-GI-NOFP16-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
6124; CHECK-GI-NOFP16-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
6125; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v2.h[0]
6126; CHECK-GI-NOFP16-NEXT:    mov v1.h[2], v0.h[0]
6127; CHECK-GI-NOFP16-NEXT:    mov v0.16b, v1.16b
6128; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6129; CHECK-GI-NOFP16-NEXT:    add sp, sp, #80
6130; CHECK-GI-NOFP16-NEXT:    ret
6131;
6132; CHECK-GI-FP16-LABEL: utofp_v3i128_v3f16:
6133; CHECK-GI-FP16:       // %bb.0: // %entry
6134; CHECK-GI-FP16-NEXT:    sub sp, sp, #80
6135; CHECK-GI-FP16-NEXT:    str x30, [sp, #32] // 8-byte Folded Spill
6136; CHECK-GI-FP16-NEXT:    stp x22, x21, [sp, #48] // 16-byte Folded Spill
6137; CHECK-GI-FP16-NEXT:    stp x20, x19, [sp, #64] // 16-byte Folded Spill
6138; CHECK-GI-FP16-NEXT:    .cfi_def_cfa_offset 80
6139; CHECK-GI-FP16-NEXT:    .cfi_offset w19, -8
6140; CHECK-GI-FP16-NEXT:    .cfi_offset w20, -16
6141; CHECK-GI-FP16-NEXT:    .cfi_offset w21, -24
6142; CHECK-GI-FP16-NEXT:    .cfi_offset w22, -32
6143; CHECK-GI-FP16-NEXT:    .cfi_offset w30, -48
6144; CHECK-GI-FP16-NEXT:    mov x19, x2
6145; CHECK-GI-FP16-NEXT:    mov x20, x3
6146; CHECK-GI-FP16-NEXT:    mov x21, x4
6147; CHECK-GI-FP16-NEXT:    mov x22, x5
6148; CHECK-GI-FP16-NEXT:    bl __floatuntihf
6149; CHECK-GI-FP16-NEXT:    mov x0, x19
6150; CHECK-GI-FP16-NEXT:    mov x1, x20
6151; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6152; CHECK-GI-FP16-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
6153; CHECK-GI-FP16-NEXT:    bl __floatuntihf
6154; CHECK-GI-FP16-NEXT:    mov x0, x21
6155; CHECK-GI-FP16-NEXT:    mov x1, x22
6156; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6157; CHECK-GI-FP16-NEXT:    str q0, [sp] // 16-byte Folded Spill
6158; CHECK-GI-FP16-NEXT:    bl __floatuntihf
6159; CHECK-GI-FP16-NEXT:    ldp q2, q1, [sp] // 32-byte Folded Reload
6160; CHECK-GI-FP16-NEXT:    // kill: def $h0 killed $h0 def $q0
6161; CHECK-GI-FP16-NEXT:    ldr x30, [sp, #32] // 8-byte Folded Reload
6162; CHECK-GI-FP16-NEXT:    ldp x20, x19, [sp, #64] // 16-byte Folded Reload
6163; CHECK-GI-FP16-NEXT:    ldp x22, x21, [sp, #48] // 16-byte Folded Reload
6164; CHECK-GI-FP16-NEXT:    mov v1.h[1], v2.h[0]
6165; CHECK-GI-FP16-NEXT:    mov v1.h[2], v0.h[0]
6166; CHECK-GI-FP16-NEXT:    mov v0.16b, v1.16b
6167; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6168; CHECK-GI-FP16-NEXT:    add sp, sp, #80
6169; CHECK-GI-FP16-NEXT:    ret
6170entry:
6171  %c = uitofp <3 x i128> %a to <3 x half>
6172  ret <3 x half> %c
6173}
6174
6175define <2 x half> @stofp_v2i64_v2f16(<2 x i64> %a) {
6176; CHECK-SD-NOFP16-LABEL: stofp_v2i64_v2f16:
6177; CHECK-SD-NOFP16:       // %bb.0: // %entry
6178; CHECK-SD-NOFP16-NEXT:    mov x8, v0.d[1]
6179; CHECK-SD-NOFP16-NEXT:    fmov x9, d0
6180; CHECK-SD-NOFP16-NEXT:    scvtf s1, x9
6181; CHECK-SD-NOFP16-NEXT:    scvtf s0, x8
6182; CHECK-SD-NOFP16-NEXT:    fcvt h2, s0
6183; CHECK-SD-NOFP16-NEXT:    fcvt h0, s1
6184; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
6185; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6186; CHECK-SD-NOFP16-NEXT:    ret
6187;
6188; CHECK-SD-FP16-LABEL: stofp_v2i64_v2f16:
6189; CHECK-SD-FP16:       // %bb.0: // %entry
6190; CHECK-SD-FP16-NEXT:    mov x8, v0.d[1]
6191; CHECK-SD-FP16-NEXT:    fmov x9, d0
6192; CHECK-SD-FP16-NEXT:    scvtf h0, x9
6193; CHECK-SD-FP16-NEXT:    scvtf h1, x8
6194; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
6195; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6196; CHECK-SD-FP16-NEXT:    ret
6197;
6198; CHECK-GI-NOFP16-LABEL: stofp_v2i64_v2f16:
6199; CHECK-GI-NOFP16:       // %bb.0: // %entry
6200; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6201; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6202; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
6203; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
6204; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
6205; CHECK-GI-NOFP16-NEXT:    ret
6206;
6207; CHECK-GI-FP16-LABEL: stofp_v2i64_v2f16:
6208; CHECK-GI-FP16:       // %bb.0: // %entry
6209; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6210; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
6211; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6212; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6213; CHECK-GI-FP16-NEXT:    mov v0.h[1], v1.h[0]
6214; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6215; CHECK-GI-FP16-NEXT:    ret
6216entry:
6217  %c = sitofp <2 x i64> %a to <2 x half>
6218  ret <2 x half> %c
6219}
6220
6221define <2 x half> @utofp_v2i64_v2f16(<2 x i64> %a) {
6222; CHECK-SD-NOFP16-LABEL: utofp_v2i64_v2f16:
6223; CHECK-SD-NOFP16:       // %bb.0: // %entry
6224; CHECK-SD-NOFP16-NEXT:    mov x8, v0.d[1]
6225; CHECK-SD-NOFP16-NEXT:    fmov x9, d0
6226; CHECK-SD-NOFP16-NEXT:    ucvtf s1, x9
6227; CHECK-SD-NOFP16-NEXT:    ucvtf s0, x8
6228; CHECK-SD-NOFP16-NEXT:    fcvt h2, s0
6229; CHECK-SD-NOFP16-NEXT:    fcvt h0, s1
6230; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
6231; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6232; CHECK-SD-NOFP16-NEXT:    ret
6233;
6234; CHECK-SD-FP16-LABEL: utofp_v2i64_v2f16:
6235; CHECK-SD-FP16:       // %bb.0: // %entry
6236; CHECK-SD-FP16-NEXT:    mov x8, v0.d[1]
6237; CHECK-SD-FP16-NEXT:    fmov x9, d0
6238; CHECK-SD-FP16-NEXT:    ucvtf h0, x9
6239; CHECK-SD-FP16-NEXT:    ucvtf h1, x8
6240; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
6241; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6242; CHECK-SD-FP16-NEXT:    ret
6243;
6244; CHECK-GI-NOFP16-LABEL: utofp_v2i64_v2f16:
6245; CHECK-GI-NOFP16:       // %bb.0: // %entry
6246; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
6247; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6248; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
6249; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
6250; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
6251; CHECK-GI-NOFP16-NEXT:    ret
6252;
6253; CHECK-GI-FP16-LABEL: utofp_v2i64_v2f16:
6254; CHECK-GI-FP16:       // %bb.0: // %entry
6255; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
6256; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
6257; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6258; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6259; CHECK-GI-FP16-NEXT:    mov v0.h[1], v1.h[0]
6260; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6261; CHECK-GI-FP16-NEXT:    ret
6262entry:
6263  %c = uitofp <2 x i64> %a to <2 x half>
6264  ret <2 x half> %c
6265}
6266
6267define <3 x half> @stofp_v3i64_v3f16(<3 x i64> %a) {
6268; CHECK-SD-LABEL: stofp_v3i64_v3f16:
6269; CHECK-SD:       // %bb.0: // %entry
6270; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
6271; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
6272; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
6273; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
6274; CHECK-SD-NEXT:    scvtf v1.2d, v2.2d
6275; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
6276; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6277; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6278; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6279; CHECK-SD-NEXT:    ret
6280;
6281; CHECK-GI-NOFP16-LABEL: stofp_v3i64_v3f16:
6282; CHECK-GI-NOFP16:       // %bb.0: // %entry
6283; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
6284; CHECK-GI-NOFP16-NEXT:    // kill: def $d1 killed $d1 def $q1
6285; CHECK-GI-NOFP16-NEXT:    // kill: def $d2 killed $d2 def $q2
6286; CHECK-GI-NOFP16-NEXT:    mov v0.d[1], v1.d[0]
6287; CHECK-GI-NOFP16-NEXT:    scvtf v1.2d, v2.2d
6288; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6289; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6290; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6291; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6292; CHECK-GI-NOFP16-NEXT:    ret
6293;
6294; CHECK-GI-FP16-LABEL: stofp_v3i64_v3f16:
6295; CHECK-GI-FP16:       // %bb.0: // %entry
6296; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
6297; CHECK-GI-FP16-NEXT:    // kill: def $d1 killed $d1 def $q1
6298; CHECK-GI-FP16-NEXT:    // kill: def $d2 killed $d2 def $q2
6299; CHECK-GI-FP16-NEXT:    mov v0.d[1], v1.d[0]
6300; CHECK-GI-FP16-NEXT:    scvtf v2.2d, v2.2d
6301; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6302; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6303; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
6304; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6305; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6306; CHECK-GI-FP16-NEXT:    mov v0.h[1], v1.h[0]
6307; CHECK-GI-FP16-NEXT:    mov v0.h[2], v2.h[0]
6308; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6309; CHECK-GI-FP16-NEXT:    ret
6310entry:
6311  %c = sitofp <3 x i64> %a to <3 x half>
6312  ret <3 x half> %c
6313}
6314
6315define <3 x half> @utofp_v3i64_v3f16(<3 x i64> %a) {
6316; CHECK-SD-LABEL: utofp_v3i64_v3f16:
6317; CHECK-SD:       // %bb.0: // %entry
6318; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
6319; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
6320; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
6321; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
6322; CHECK-SD-NEXT:    ucvtf v1.2d, v2.2d
6323; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
6324; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6325; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6326; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6327; CHECK-SD-NEXT:    ret
6328;
6329; CHECK-GI-NOFP16-LABEL: utofp_v3i64_v3f16:
6330; CHECK-GI-NOFP16:       // %bb.0: // %entry
6331; CHECK-GI-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
6332; CHECK-GI-NOFP16-NEXT:    // kill: def $d1 killed $d1 def $q1
6333; CHECK-GI-NOFP16-NEXT:    // kill: def $d2 killed $d2 def $q2
6334; CHECK-GI-NOFP16-NEXT:    mov v0.d[1], v1.d[0]
6335; CHECK-GI-NOFP16-NEXT:    ucvtf v1.2d, v2.2d
6336; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
6337; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6338; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6339; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6340; CHECK-GI-NOFP16-NEXT:    ret
6341;
6342; CHECK-GI-FP16-LABEL: utofp_v3i64_v3f16:
6343; CHECK-GI-FP16:       // %bb.0: // %entry
6344; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
6345; CHECK-GI-FP16-NEXT:    // kill: def $d1 killed $d1 def $q1
6346; CHECK-GI-FP16-NEXT:    // kill: def $d2 killed $d2 def $q2
6347; CHECK-GI-FP16-NEXT:    mov v0.d[1], v1.d[0]
6348; CHECK-GI-FP16-NEXT:    ucvtf v2.2d, v2.2d
6349; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
6350; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6351; CHECK-GI-FP16-NEXT:    mov d1, v0.d[1]
6352; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6353; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6354; CHECK-GI-FP16-NEXT:    mov v0.h[1], v1.h[0]
6355; CHECK-GI-FP16-NEXT:    mov v0.h[2], v2.h[0]
6356; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6357; CHECK-GI-FP16-NEXT:    ret
6358entry:
6359  %c = uitofp <3 x i64> %a to <3 x half>
6360  ret <3 x half> %c
6361}
6362
6363define <4 x half> @stofp_v4i64_v4f16(<4 x i64> %a) {
6364; CHECK-SD-LABEL: stofp_v4i64_v4f16:
6365; CHECK-SD:       // %bb.0: // %entry
6366; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
6367; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
6368; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6369; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6370; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6371; CHECK-SD-NEXT:    ret
6372;
6373; CHECK-GI-NOFP16-LABEL: stofp_v4i64_v4f16:
6374; CHECK-GI-NOFP16:       // %bb.0: // %entry
6375; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6376; CHECK-GI-NOFP16-NEXT:    scvtf v1.2d, v1.2d
6377; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6378; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6379; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6380; CHECK-GI-NOFP16-NEXT:    ret
6381;
6382; CHECK-GI-FP16-LABEL: stofp_v4i64_v4f16:
6383; CHECK-GI-FP16:       // %bb.0: // %entry
6384; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6385; CHECK-GI-FP16-NEXT:    scvtf v1.2d, v1.2d
6386; CHECK-GI-FP16-NEXT:    mov d2, v0.d[1]
6387; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6388; CHECK-GI-FP16-NEXT:    mov d3, v1.d[1]
6389; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6390; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6391; CHECK-GI-FP16-NEXT:    mov v0.h[1], v2.h[0]
6392; CHECK-GI-FP16-NEXT:    fcvt h2, d3
6393; CHECK-GI-FP16-NEXT:    mov v0.h[2], v1.h[0]
6394; CHECK-GI-FP16-NEXT:    mov v0.h[3], v2.h[0]
6395; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6396; CHECK-GI-FP16-NEXT:    ret
6397entry:
6398  %c = sitofp <4 x i64> %a to <4 x half>
6399  ret <4 x half> %c
6400}
6401
6402define <4 x half> @utofp_v4i64_v4f16(<4 x i64> %a) {
6403; CHECK-SD-LABEL: utofp_v4i64_v4f16:
6404; CHECK-SD:       // %bb.0: // %entry
6405; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
6406; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
6407; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6408; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6409; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6410; CHECK-SD-NEXT:    ret
6411;
6412; CHECK-GI-NOFP16-LABEL: utofp_v4i64_v4f16:
6413; CHECK-GI-NOFP16:       // %bb.0: // %entry
6414; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
6415; CHECK-GI-NOFP16-NEXT:    ucvtf v1.2d, v1.2d
6416; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6417; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6418; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6419; CHECK-GI-NOFP16-NEXT:    ret
6420;
6421; CHECK-GI-FP16-LABEL: utofp_v4i64_v4f16:
6422; CHECK-GI-FP16:       // %bb.0: // %entry
6423; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
6424; CHECK-GI-FP16-NEXT:    ucvtf v1.2d, v1.2d
6425; CHECK-GI-FP16-NEXT:    mov d2, v0.d[1]
6426; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6427; CHECK-GI-FP16-NEXT:    mov d3, v1.d[1]
6428; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6429; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6430; CHECK-GI-FP16-NEXT:    mov v0.h[1], v2.h[0]
6431; CHECK-GI-FP16-NEXT:    fcvt h2, d3
6432; CHECK-GI-FP16-NEXT:    mov v0.h[2], v1.h[0]
6433; CHECK-GI-FP16-NEXT:    mov v0.h[3], v2.h[0]
6434; CHECK-GI-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
6435; CHECK-GI-FP16-NEXT:    ret
6436entry:
6437  %c = uitofp <4 x i64> %a to <4 x half>
6438  ret <4 x half> %c
6439}
6440
6441define <8 x half> @stofp_v8i64_v8f16(<8 x i64> %a) {
6442; CHECK-SD-LABEL: stofp_v8i64_v8f16:
6443; CHECK-SD:       // %bb.0: // %entry
6444; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
6445; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
6446; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
6447; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
6448; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6449; CHECK-SD-NEXT:    fcvtn v2.2s, v2.2d
6450; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6451; CHECK-SD-NEXT:    fcvtn2 v2.4s, v3.2d
6452; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6453; CHECK-SD-NEXT:    fcvtn2 v0.8h, v2.4s
6454; CHECK-SD-NEXT:    ret
6455;
6456; CHECK-GI-NOFP16-LABEL: stofp_v8i64_v8f16:
6457; CHECK-GI-NOFP16:       // %bb.0: // %entry
6458; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6459; CHECK-GI-NOFP16-NEXT:    scvtf v1.2d, v1.2d
6460; CHECK-GI-NOFP16-NEXT:    scvtf v2.2d, v2.2d
6461; CHECK-GI-NOFP16-NEXT:    scvtf v3.2d, v3.2d
6462; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6463; CHECK-GI-NOFP16-NEXT:    fcvtn v2.2s, v2.2d
6464; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6465; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.4s, v3.2d
6466; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6467; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
6468; CHECK-GI-NOFP16-NEXT:    ret
6469;
6470; CHECK-GI-FP16-LABEL: stofp_v8i64_v8f16:
6471; CHECK-GI-FP16:       // %bb.0: // %entry
6472; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6473; CHECK-GI-FP16-NEXT:    scvtf v1.2d, v1.2d
6474; CHECK-GI-FP16-NEXT:    scvtf v2.2d, v2.2d
6475; CHECK-GI-FP16-NEXT:    scvtf v3.2d, v3.2d
6476; CHECK-GI-FP16-NEXT:    mov d4, v0.d[1]
6477; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6478; CHECK-GI-FP16-NEXT:    mov d5, v1.d[1]
6479; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6480; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6481; CHECK-GI-FP16-NEXT:    mov v0.h[1], v4.h[0]
6482; CHECK-GI-FP16-NEXT:    fcvt h4, d5
6483; CHECK-GI-FP16-NEXT:    mov v0.h[2], v1.h[0]
6484; CHECK-GI-FP16-NEXT:    mov d1, v2.d[1]
6485; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6486; CHECK-GI-FP16-NEXT:    mov v0.h[3], v4.h[0]
6487; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6488; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
6489; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
6490; CHECK-GI-FP16-NEXT:    fcvt h3, d3
6491; CHECK-GI-FP16-NEXT:    mov v0.h[5], v1.h[0]
6492; CHECK-GI-FP16-NEXT:    fcvt h1, d2
6493; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
6494; CHECK-GI-FP16-NEXT:    mov v0.h[7], v1.h[0]
6495; CHECK-GI-FP16-NEXT:    ret
6496entry:
6497  %c = sitofp <8 x i64> %a to <8 x half>
6498  ret <8 x half> %c
6499}
6500
6501define <8 x half> @utofp_v8i64_v8f16(<8 x i64> %a) {
6502; CHECK-SD-LABEL: utofp_v8i64_v8f16:
6503; CHECK-SD:       // %bb.0: // %entry
6504; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
6505; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
6506; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
6507; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
6508; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6509; CHECK-SD-NEXT:    fcvtn v2.2s, v2.2d
6510; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6511; CHECK-SD-NEXT:    fcvtn2 v2.4s, v3.2d
6512; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6513; CHECK-SD-NEXT:    fcvtn2 v0.8h, v2.4s
6514; CHECK-SD-NEXT:    ret
6515;
6516; CHECK-GI-NOFP16-LABEL: utofp_v8i64_v8f16:
6517; CHECK-GI-NOFP16:       // %bb.0: // %entry
6518; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
6519; CHECK-GI-NOFP16-NEXT:    ucvtf v1.2d, v1.2d
6520; CHECK-GI-NOFP16-NEXT:    ucvtf v2.2d, v2.2d
6521; CHECK-GI-NOFP16-NEXT:    ucvtf v3.2d, v3.2d
6522; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6523; CHECK-GI-NOFP16-NEXT:    fcvtn v2.2s, v2.2d
6524; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6525; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.4s, v3.2d
6526; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6527; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
6528; CHECK-GI-NOFP16-NEXT:    ret
6529;
6530; CHECK-GI-FP16-LABEL: utofp_v8i64_v8f16:
6531; CHECK-GI-FP16:       // %bb.0: // %entry
6532; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
6533; CHECK-GI-FP16-NEXT:    ucvtf v1.2d, v1.2d
6534; CHECK-GI-FP16-NEXT:    ucvtf v2.2d, v2.2d
6535; CHECK-GI-FP16-NEXT:    ucvtf v3.2d, v3.2d
6536; CHECK-GI-FP16-NEXT:    mov d4, v0.d[1]
6537; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6538; CHECK-GI-FP16-NEXT:    mov d5, v1.d[1]
6539; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6540; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6541; CHECK-GI-FP16-NEXT:    mov v0.h[1], v4.h[0]
6542; CHECK-GI-FP16-NEXT:    fcvt h4, d5
6543; CHECK-GI-FP16-NEXT:    mov v0.h[2], v1.h[0]
6544; CHECK-GI-FP16-NEXT:    mov d1, v2.d[1]
6545; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6546; CHECK-GI-FP16-NEXT:    mov v0.h[3], v4.h[0]
6547; CHECK-GI-FP16-NEXT:    fcvt h1, d1
6548; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
6549; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
6550; CHECK-GI-FP16-NEXT:    fcvt h3, d3
6551; CHECK-GI-FP16-NEXT:    mov v0.h[5], v1.h[0]
6552; CHECK-GI-FP16-NEXT:    fcvt h1, d2
6553; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
6554; CHECK-GI-FP16-NEXT:    mov v0.h[7], v1.h[0]
6555; CHECK-GI-FP16-NEXT:    ret
6556entry:
6557  %c = uitofp <8 x i64> %a to <8 x half>
6558  ret <8 x half> %c
6559}
6560
6561define <16 x half> @stofp_v16i64_v16f16(<16 x i64> %a) {
6562; CHECK-SD-LABEL: stofp_v16i64_v16f16:
6563; CHECK-SD:       // %bb.0: // %entry
6564; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
6565; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
6566; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
6567; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
6568; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
6569; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
6570; CHECK-SD-NEXT:    scvtf v3.2d, v3.2d
6571; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6572; CHECK-SD-NEXT:    fcvtn v4.2s, v4.2d
6573; CHECK-SD-NEXT:    fcvtn v2.2s, v2.2d
6574; CHECK-SD-NEXT:    fcvtn v6.2s, v6.2d
6575; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6576; CHECK-SD-NEXT:    scvtf v1.2d, v7.2d
6577; CHECK-SD-NEXT:    fcvtn2 v4.4s, v5.2d
6578; CHECK-SD-NEXT:    fcvtn2 v2.4s, v3.2d
6579; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6580; CHECK-SD-NEXT:    fcvtn2 v6.4s, v1.2d
6581; CHECK-SD-NEXT:    fcvtn v1.4h, v4.4s
6582; CHECK-SD-NEXT:    fcvtn2 v0.8h, v2.4s
6583; CHECK-SD-NEXT:    fcvtn2 v1.8h, v6.4s
6584; CHECK-SD-NEXT:    ret
6585;
6586; CHECK-GI-NOFP16-LABEL: stofp_v16i64_v16f16:
6587; CHECK-GI-NOFP16:       // %bb.0: // %entry
6588; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6589; CHECK-GI-NOFP16-NEXT:    scvtf v4.2d, v4.2d
6590; CHECK-GI-NOFP16-NEXT:    scvtf v1.2d, v1.2d
6591; CHECK-GI-NOFP16-NEXT:    scvtf v2.2d, v2.2d
6592; CHECK-GI-NOFP16-NEXT:    scvtf v5.2d, v5.2d
6593; CHECK-GI-NOFP16-NEXT:    scvtf v6.2d, v6.2d
6594; CHECK-GI-NOFP16-NEXT:    scvtf v3.2d, v3.2d
6595; CHECK-GI-NOFP16-NEXT:    scvtf v7.2d, v7.2d
6596; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6597; CHECK-GI-NOFP16-NEXT:    fcvtn v4.2s, v4.2d
6598; CHECK-GI-NOFP16-NEXT:    fcvtn v2.2s, v2.2d
6599; CHECK-GI-NOFP16-NEXT:    fcvtn v6.2s, v6.2d
6600; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6601; CHECK-GI-NOFP16-NEXT:    fcvtn2 v4.4s, v5.2d
6602; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.4s, v3.2d
6603; CHECK-GI-NOFP16-NEXT:    fcvtn2 v6.4s, v7.2d
6604; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6605; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v4.4s
6606; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
6607; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v6.4s
6608; CHECK-GI-NOFP16-NEXT:    ret
6609;
6610; CHECK-GI-FP16-LABEL: stofp_v16i64_v16f16:
6611; CHECK-GI-FP16:       // %bb.0: // %entry
6612; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6613; CHECK-GI-FP16-NEXT:    scvtf v4.2d, v4.2d
6614; CHECK-GI-FP16-NEXT:    scvtf v18.2d, v1.2d
6615; CHECK-GI-FP16-NEXT:    scvtf v5.2d, v5.2d
6616; CHECK-GI-FP16-NEXT:    scvtf v2.2d, v2.2d
6617; CHECK-GI-FP16-NEXT:    scvtf v3.2d, v3.2d
6618; CHECK-GI-FP16-NEXT:    mov d16, v0.d[1]
6619; CHECK-GI-FP16-NEXT:    mov d17, v4.d[1]
6620; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6621; CHECK-GI-FP16-NEXT:    fcvt h1, d4
6622; CHECK-GI-FP16-NEXT:    mov d19, v5.d[1]
6623; CHECK-GI-FP16-NEXT:    fcvt h5, d5
6624; CHECK-GI-FP16-NEXT:    fcvt h16, d16
6625; CHECK-GI-FP16-NEXT:    fcvt h4, d17
6626; CHECK-GI-FP16-NEXT:    mov d17, v18.d[1]
6627; CHECK-GI-FP16-NEXT:    fcvt h18, d18
6628; CHECK-GI-FP16-NEXT:    mov v0.h[1], v16.h[0]
6629; CHECK-GI-FP16-NEXT:    mov v1.h[1], v4.h[0]
6630; CHECK-GI-FP16-NEXT:    scvtf v4.2d, v6.2d
6631; CHECK-GI-FP16-NEXT:    fcvt h6, d17
6632; CHECK-GI-FP16-NEXT:    fcvt h16, d19
6633; CHECK-GI-FP16-NEXT:    mov v0.h[2], v18.h[0]
6634; CHECK-GI-FP16-NEXT:    mov v1.h[2], v5.h[0]
6635; CHECK-GI-FP16-NEXT:    mov d5, v2.d[1]
6636; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6637; CHECK-GI-FP16-NEXT:    mov d17, v4.d[1]
6638; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6639; CHECK-GI-FP16-NEXT:    mov v0.h[3], v6.h[0]
6640; CHECK-GI-FP16-NEXT:    mov v1.h[3], v16.h[0]
6641; CHECK-GI-FP16-NEXT:    scvtf v6.2d, v7.2d
6642; CHECK-GI-FP16-NEXT:    fcvt h5, d5
6643; CHECK-GI-FP16-NEXT:    fcvt h7, d17
6644; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
6645; CHECK-GI-FP16-NEXT:    mov v1.h[4], v4.h[0]
6646; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
6647; CHECK-GI-FP16-NEXT:    fcvt h3, d3
6648; CHECK-GI-FP16-NEXT:    mov d4, v6.d[1]
6649; CHECK-GI-FP16-NEXT:    fcvt h6, d6
6650; CHECK-GI-FP16-NEXT:    mov v0.h[5], v5.h[0]
6651; CHECK-GI-FP16-NEXT:    mov v1.h[5], v7.h[0]
6652; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6653; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6654; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
6655; CHECK-GI-FP16-NEXT:    mov v1.h[6], v6.h[0]
6656; CHECK-GI-FP16-NEXT:    mov v0.h[7], v2.h[0]
6657; CHECK-GI-FP16-NEXT:    mov v1.h[7], v4.h[0]
6658; CHECK-GI-FP16-NEXT:    ret
6659entry:
6660  %c = sitofp <16 x i64> %a to <16 x half>
6661  ret <16 x half> %c
6662}
6663
6664define <16 x half> @utofp_v16i64_v16f16(<16 x i64> %a) {
6665; CHECK-SD-LABEL: utofp_v16i64_v16f16:
6666; CHECK-SD:       // %bb.0: // %entry
6667; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
6668; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
6669; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
6670; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
6671; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
6672; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
6673; CHECK-SD-NEXT:    ucvtf v3.2d, v3.2d
6674; CHECK-SD-NEXT:    fcvtn v0.2s, v0.2d
6675; CHECK-SD-NEXT:    fcvtn v4.2s, v4.2d
6676; CHECK-SD-NEXT:    fcvtn v2.2s, v2.2d
6677; CHECK-SD-NEXT:    fcvtn v6.2s, v6.2d
6678; CHECK-SD-NEXT:    fcvtn2 v0.4s, v1.2d
6679; CHECK-SD-NEXT:    ucvtf v1.2d, v7.2d
6680; CHECK-SD-NEXT:    fcvtn2 v4.4s, v5.2d
6681; CHECK-SD-NEXT:    fcvtn2 v2.4s, v3.2d
6682; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
6683; CHECK-SD-NEXT:    fcvtn2 v6.4s, v1.2d
6684; CHECK-SD-NEXT:    fcvtn v1.4h, v4.4s
6685; CHECK-SD-NEXT:    fcvtn2 v0.8h, v2.4s
6686; CHECK-SD-NEXT:    fcvtn2 v1.8h, v6.4s
6687; CHECK-SD-NEXT:    ret
6688;
6689; CHECK-GI-NOFP16-LABEL: utofp_v16i64_v16f16:
6690; CHECK-GI-NOFP16:       // %bb.0: // %entry
6691; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
6692; CHECK-GI-NOFP16-NEXT:    ucvtf v4.2d, v4.2d
6693; CHECK-GI-NOFP16-NEXT:    ucvtf v1.2d, v1.2d
6694; CHECK-GI-NOFP16-NEXT:    ucvtf v2.2d, v2.2d
6695; CHECK-GI-NOFP16-NEXT:    ucvtf v5.2d, v5.2d
6696; CHECK-GI-NOFP16-NEXT:    ucvtf v6.2d, v6.2d
6697; CHECK-GI-NOFP16-NEXT:    ucvtf v3.2d, v3.2d
6698; CHECK-GI-NOFP16-NEXT:    ucvtf v7.2d, v7.2d
6699; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6700; CHECK-GI-NOFP16-NEXT:    fcvtn v4.2s, v4.2d
6701; CHECK-GI-NOFP16-NEXT:    fcvtn v2.2s, v2.2d
6702; CHECK-GI-NOFP16-NEXT:    fcvtn v6.2s, v6.2d
6703; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6704; CHECK-GI-NOFP16-NEXT:    fcvtn2 v4.4s, v5.2d
6705; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.4s, v3.2d
6706; CHECK-GI-NOFP16-NEXT:    fcvtn2 v6.4s, v7.2d
6707; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6708; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v4.4s
6709; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
6710; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v6.4s
6711; CHECK-GI-NOFP16-NEXT:    ret
6712;
6713; CHECK-GI-FP16-LABEL: utofp_v16i64_v16f16:
6714; CHECK-GI-FP16:       // %bb.0: // %entry
6715; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
6716; CHECK-GI-FP16-NEXT:    ucvtf v4.2d, v4.2d
6717; CHECK-GI-FP16-NEXT:    ucvtf v18.2d, v1.2d
6718; CHECK-GI-FP16-NEXT:    ucvtf v5.2d, v5.2d
6719; CHECK-GI-FP16-NEXT:    ucvtf v2.2d, v2.2d
6720; CHECK-GI-FP16-NEXT:    ucvtf v3.2d, v3.2d
6721; CHECK-GI-FP16-NEXT:    mov d16, v0.d[1]
6722; CHECK-GI-FP16-NEXT:    mov d17, v4.d[1]
6723; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6724; CHECK-GI-FP16-NEXT:    fcvt h1, d4
6725; CHECK-GI-FP16-NEXT:    mov d19, v5.d[1]
6726; CHECK-GI-FP16-NEXT:    fcvt h5, d5
6727; CHECK-GI-FP16-NEXT:    fcvt h16, d16
6728; CHECK-GI-FP16-NEXT:    fcvt h4, d17
6729; CHECK-GI-FP16-NEXT:    mov d17, v18.d[1]
6730; CHECK-GI-FP16-NEXT:    fcvt h18, d18
6731; CHECK-GI-FP16-NEXT:    mov v0.h[1], v16.h[0]
6732; CHECK-GI-FP16-NEXT:    mov v1.h[1], v4.h[0]
6733; CHECK-GI-FP16-NEXT:    ucvtf v4.2d, v6.2d
6734; CHECK-GI-FP16-NEXT:    fcvt h6, d17
6735; CHECK-GI-FP16-NEXT:    fcvt h16, d19
6736; CHECK-GI-FP16-NEXT:    mov v0.h[2], v18.h[0]
6737; CHECK-GI-FP16-NEXT:    mov v1.h[2], v5.h[0]
6738; CHECK-GI-FP16-NEXT:    mov d5, v2.d[1]
6739; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6740; CHECK-GI-FP16-NEXT:    mov d17, v4.d[1]
6741; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6742; CHECK-GI-FP16-NEXT:    mov v0.h[3], v6.h[0]
6743; CHECK-GI-FP16-NEXT:    mov v1.h[3], v16.h[0]
6744; CHECK-GI-FP16-NEXT:    ucvtf v6.2d, v7.2d
6745; CHECK-GI-FP16-NEXT:    fcvt h5, d5
6746; CHECK-GI-FP16-NEXT:    fcvt h7, d17
6747; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
6748; CHECK-GI-FP16-NEXT:    mov v1.h[4], v4.h[0]
6749; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
6750; CHECK-GI-FP16-NEXT:    fcvt h3, d3
6751; CHECK-GI-FP16-NEXT:    mov d4, v6.d[1]
6752; CHECK-GI-FP16-NEXT:    fcvt h6, d6
6753; CHECK-GI-FP16-NEXT:    mov v0.h[5], v5.h[0]
6754; CHECK-GI-FP16-NEXT:    mov v1.h[5], v7.h[0]
6755; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6756; CHECK-GI-FP16-NEXT:    fcvt h4, d4
6757; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
6758; CHECK-GI-FP16-NEXT:    mov v1.h[6], v6.h[0]
6759; CHECK-GI-FP16-NEXT:    mov v0.h[7], v2.h[0]
6760; CHECK-GI-FP16-NEXT:    mov v1.h[7], v4.h[0]
6761; CHECK-GI-FP16-NEXT:    ret
6762entry:
6763  %c = uitofp <16 x i64> %a to <16 x half>
6764  ret <16 x half> %c
6765}
6766
6767define <32 x half> @stofp_v32i64_v32f16(<32 x i64> %a) {
6768; CHECK-SD-LABEL: stofp_v32i64_v32f16:
6769; CHECK-SD:       // %bb.0: // %entry
6770; CHECK-SD-NEXT:    ldp q17, q16, [sp]
6771; CHECK-SD-NEXT:    scvtf v18.2d, v0.2d
6772; CHECK-SD-NEXT:    ldp q19, q0, [sp, #64]
6773; CHECK-SD-NEXT:    scvtf v4.2d, v4.2d
6774; CHECK-SD-NEXT:    ldp q21, q20, [sp, #96]
6775; CHECK-SD-NEXT:    scvtf v2.2d, v2.2d
6776; CHECK-SD-NEXT:    scvtf v17.2d, v17.2d
6777; CHECK-SD-NEXT:    ldp q23, q22, [sp, #32]
6778; CHECK-SD-NEXT:    scvtf v19.2d, v19.2d
6779; CHECK-SD-NEXT:    fcvtn v18.2s, v18.2d
6780; CHECK-SD-NEXT:    scvtf v1.2d, v1.2d
6781; CHECK-SD-NEXT:    scvtf v6.2d, v6.2d
6782; CHECK-SD-NEXT:    fcvtn v4.2s, v4.2d
6783; CHECK-SD-NEXT:    scvtf v5.2d, v5.2d
6784; CHECK-SD-NEXT:    scvtf v23.2d, v23.2d
6785; CHECK-SD-NEXT:    scvtf v16.2d, v16.2d
6786; CHECK-SD-NEXT:    scvtf v21.2d, v21.2d
6787; CHECK-SD-NEXT:    fcvtn v17.2s, v17.2d
6788; CHECK-SD-NEXT:    scvtf v0.2d, v0.2d
6789; CHECK-SD-NEXT:    fcvtn v24.2s, v2.2d
6790; CHECK-SD-NEXT:    fcvtn v19.2s, v19.2d
6791; CHECK-SD-NEXT:    scvtf v2.2d, v3.2d
6792; CHECK-SD-NEXT:    fcvtn2 v18.4s, v1.2d
6793; CHECK-SD-NEXT:    fcvtn v6.2s, v6.2d
6794; CHECK-SD-NEXT:    scvtf v1.2d, v7.2d
6795; CHECK-SD-NEXT:    fcvtn2 v4.4s, v5.2d
6796; CHECK-SD-NEXT:    fcvtn v5.2s, v23.2d
6797; CHECK-SD-NEXT:    scvtf v3.2d, v22.2d
6798; CHECK-SD-NEXT:    fcvtn v7.2s, v21.2d
6799; CHECK-SD-NEXT:    fcvtn2 v17.4s, v16.2d
6800; CHECK-SD-NEXT:    scvtf v16.2d, v20.2d
6801; CHECK-SD-NEXT:    fcvtn2 v19.4s, v0.2d
6802; CHECK-SD-NEXT:    fcvtn2 v24.4s, v2.2d
6803; CHECK-SD-NEXT:    fcvtn v0.4h, v18.4s
6804; CHECK-SD-NEXT:    fcvtn2 v6.4s, v1.2d
6805; CHECK-SD-NEXT:    fcvtn v1.4h, v4.4s
6806; CHECK-SD-NEXT:    fcvtn2 v5.4s, v3.2d
6807; CHECK-SD-NEXT:    fcvtn v2.4h, v17.4s
6808; CHECK-SD-NEXT:    fcvtn2 v7.4s, v16.2d
6809; CHECK-SD-NEXT:    fcvtn v3.4h, v19.4s
6810; CHECK-SD-NEXT:    fcvtn2 v0.8h, v24.4s
6811; CHECK-SD-NEXT:    fcvtn2 v1.8h, v6.4s
6812; CHECK-SD-NEXT:    fcvtn2 v2.8h, v5.4s
6813; CHECK-SD-NEXT:    fcvtn2 v3.8h, v7.4s
6814; CHECK-SD-NEXT:    ret
6815;
6816; CHECK-GI-NOFP16-LABEL: stofp_v32i64_v32f16:
6817; CHECK-GI-NOFP16:       // %bb.0: // %entry
6818; CHECK-GI-NOFP16-NEXT:    ldp q16, q17, [sp]
6819; CHECK-GI-NOFP16-NEXT:    scvtf v0.2d, v0.2d
6820; CHECK-GI-NOFP16-NEXT:    ldp q20, q21, [sp, #64]
6821; CHECK-GI-NOFP16-NEXT:    scvtf v4.2d, v4.2d
6822; CHECK-GI-NOFP16-NEXT:    ldp q18, q19, [sp, #32]
6823; CHECK-GI-NOFP16-NEXT:    scvtf v1.2d, v1.2d
6824; CHECK-GI-NOFP16-NEXT:    scvtf v16.2d, v16.2d
6825; CHECK-GI-NOFP16-NEXT:    ldp q22, q23, [sp, #96]
6826; CHECK-GI-NOFP16-NEXT:    scvtf v20.2d, v20.2d
6827; CHECK-GI-NOFP16-NEXT:    scvtf v2.2d, v2.2d
6828; CHECK-GI-NOFP16-NEXT:    scvtf v5.2d, v5.2d
6829; CHECK-GI-NOFP16-NEXT:    scvtf v6.2d, v6.2d
6830; CHECK-GI-NOFP16-NEXT:    scvtf v17.2d, v17.2d
6831; CHECK-GI-NOFP16-NEXT:    scvtf v18.2d, v18.2d
6832; CHECK-GI-NOFP16-NEXT:    scvtf v21.2d, v21.2d
6833; CHECK-GI-NOFP16-NEXT:    scvtf v22.2d, v22.2d
6834; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
6835; CHECK-GI-NOFP16-NEXT:    fcvtn v4.2s, v4.2d
6836; CHECK-GI-NOFP16-NEXT:    fcvtn v16.2s, v16.2d
6837; CHECK-GI-NOFP16-NEXT:    scvtf v3.2d, v3.2d
6838; CHECK-GI-NOFP16-NEXT:    fcvtn v20.2s, v20.2d
6839; CHECK-GI-NOFP16-NEXT:    scvtf v7.2d, v7.2d
6840; CHECK-GI-NOFP16-NEXT:    scvtf v19.2d, v19.2d
6841; CHECK-GI-NOFP16-NEXT:    scvtf v23.2d, v23.2d
6842; CHECK-GI-NOFP16-NEXT:    fcvtn v24.2s, v2.2d
6843; CHECK-GI-NOFP16-NEXT:    fcvtn v6.2s, v6.2d
6844; CHECK-GI-NOFP16-NEXT:    fcvtn v18.2s, v18.2d
6845; CHECK-GI-NOFP16-NEXT:    fcvtn v22.2s, v22.2d
6846; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
6847; CHECK-GI-NOFP16-NEXT:    fcvtn2 v4.4s, v5.2d
6848; CHECK-GI-NOFP16-NEXT:    fcvtn2 v16.4s, v17.2d
6849; CHECK-GI-NOFP16-NEXT:    fcvtn2 v20.4s, v21.2d
6850; CHECK-GI-NOFP16-NEXT:    fcvtn2 v24.4s, v3.2d
6851; CHECK-GI-NOFP16-NEXT:    fcvtn2 v6.4s, v7.2d
6852; CHECK-GI-NOFP16-NEXT:    fcvtn2 v18.4s, v19.2d
6853; CHECK-GI-NOFP16-NEXT:    fcvtn2 v22.4s, v23.2d
6854; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
6855; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v4.4s
6856; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v16.4s
6857; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v20.4s
6858; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v24.4s
6859; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v6.4s
6860; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
6861; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v22.4s
6862; CHECK-GI-NOFP16-NEXT:    ret
6863;
6864; CHECK-GI-FP16-LABEL: stofp_v32i64_v32f16:
6865; CHECK-GI-FP16:       // %bb.0: // %entry
6866; CHECK-GI-FP16-NEXT:    ldp q16, q18, [sp]
6867; CHECK-GI-FP16-NEXT:    scvtf v0.2d, v0.2d
6868; CHECK-GI-FP16-NEXT:    ldp q17, q19, [sp, #64]
6869; CHECK-GI-FP16-NEXT:    scvtf v4.2d, v4.2d
6870; CHECK-GI-FP16-NEXT:    scvtf v1.2d, v1.2d
6871; CHECK-GI-FP16-NEXT:    scvtf v5.2d, v5.2d
6872; CHECK-GI-FP16-NEXT:    scvtf v6.2d, v6.2d
6873; CHECK-GI-FP16-NEXT:    scvtf v20.2d, v16.2d
6874; CHECK-GI-FP16-NEXT:    scvtf v24.2d, v18.2d
6875; CHECK-GI-FP16-NEXT:    scvtf v2.2d, v2.2d
6876; CHECK-GI-FP16-NEXT:    scvtf v16.2d, v17.2d
6877; CHECK-GI-FP16-NEXT:    mov d21, v0.d[1]
6878; CHECK-GI-FP16-NEXT:    scvtf v25.2d, v19.2d
6879; CHECK-GI-FP16-NEXT:    mov d22, v4.d[1]
6880; CHECK-GI-FP16-NEXT:    fcvt h0, d0
6881; CHECK-GI-FP16-NEXT:    scvtf v3.2d, v3.2d
6882; CHECK-GI-FP16-NEXT:    mov d18, v1.d[1]
6883; CHECK-GI-FP16-NEXT:    fcvt h17, d1
6884; CHECK-GI-FP16-NEXT:    mov d19, v5.d[1]
6885; CHECK-GI-FP16-NEXT:    mov d23, v20.d[1]
6886; CHECK-GI-FP16-NEXT:    fcvt h1, d4
6887; CHECK-GI-FP16-NEXT:    fcvt h4, d20
6888; CHECK-GI-FP16-NEXT:    mov d26, v16.d[1]
6889; CHECK-GI-FP16-NEXT:    fcvt h20, d5
6890; CHECK-GI-FP16-NEXT:    fcvt h5, d16
6891; CHECK-GI-FP16-NEXT:    fcvt h28, d21
6892; CHECK-GI-FP16-NEXT:    fcvt h29, d22
6893; CHECK-GI-FP16-NEXT:    fcvt h22, d24
6894; CHECK-GI-FP16-NEXT:    fcvt h21, d25
6895; CHECK-GI-FP16-NEXT:    fcvt h18, d18
6896; CHECK-GI-FP16-NEXT:    fcvt h19, d19
6897; CHECK-GI-FP16-NEXT:    fcvt h27, d23
6898; CHECK-GI-FP16-NEXT:    mov d23, v24.d[1]
6899; CHECK-GI-FP16-NEXT:    mov d24, v25.d[1]
6900; CHECK-GI-FP16-NEXT:    ldp q25, q16, [sp, #32]
6901; CHECK-GI-FP16-NEXT:    fcvt h26, d26
6902; CHECK-GI-FP16-NEXT:    mov v0.h[1], v28.h[0]
6903; CHECK-GI-FP16-NEXT:    mov v1.h[1], v29.h[0]
6904; CHECK-GI-FP16-NEXT:    scvtf v7.2d, v7.2d
6905; CHECK-GI-FP16-NEXT:    mov v4.h[1], v27.h[0]
6906; CHECK-GI-FP16-NEXT:    scvtf v25.2d, v25.2d
6907; CHECK-GI-FP16-NEXT:    fcvt h23, d23
6908; CHECK-GI-FP16-NEXT:    mov v5.h[1], v26.h[0]
6909; CHECK-GI-FP16-NEXT:    ldp q26, q27, [sp, #96]
6910; CHECK-GI-FP16-NEXT:    fcvt h24, d24
6911; CHECK-GI-FP16-NEXT:    mov v0.h[2], v17.h[0]
6912; CHECK-GI-FP16-NEXT:    mov v1.h[2], v20.h[0]
6913; CHECK-GI-FP16-NEXT:    mov d20, v6.d[1]
6914; CHECK-GI-FP16-NEXT:    mov d17, v2.d[1]
6915; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6916; CHECK-GI-FP16-NEXT:    scvtf v26.2d, v26.2d
6917; CHECK-GI-FP16-NEXT:    mov v4.h[2], v22.h[0]
6918; CHECK-GI-FP16-NEXT:    fcvt h22, d25
6919; CHECK-GI-FP16-NEXT:    mov v5.h[2], v21.h[0]
6920; CHECK-GI-FP16-NEXT:    mov d21, v25.d[1]
6921; CHECK-GI-FP16-NEXT:    fcvt h6, d6
6922; CHECK-GI-FP16-NEXT:    mov v0.h[3], v18.h[0]
6923; CHECK-GI-FP16-NEXT:    mov v1.h[3], v19.h[0]
6924; CHECK-GI-FP16-NEXT:    scvtf v16.2d, v16.2d
6925; CHECK-GI-FP16-NEXT:    scvtf v18.2d, v27.2d
6926; CHECK-GI-FP16-NEXT:    fcvt h19, d20
6927; CHECK-GI-FP16-NEXT:    fcvt h17, d17
6928; CHECK-GI-FP16-NEXT:    mov d25, v26.d[1]
6929; CHECK-GI-FP16-NEXT:    fcvt h26, d26
6930; CHECK-GI-FP16-NEXT:    mov v4.h[3], v23.h[0]
6931; CHECK-GI-FP16-NEXT:    mov v5.h[3], v24.h[0]
6932; CHECK-GI-FP16-NEXT:    fcvt h20, d21
6933; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
6934; CHECK-GI-FP16-NEXT:    mov v1.h[4], v6.h[0]
6935; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
6936; CHECK-GI-FP16-NEXT:    mov d23, v18.d[1]
6937; CHECK-GI-FP16-NEXT:    fcvt h18, d18
6938; CHECK-GI-FP16-NEXT:    fcvt h3, d3
6939; CHECK-GI-FP16-NEXT:    fcvt h21, d25
6940; CHECK-GI-FP16-NEXT:    mov v4.h[4], v22.h[0]
6941; CHECK-GI-FP16-NEXT:    mov d22, v16.d[1]
6942; CHECK-GI-FP16-NEXT:    mov v5.h[4], v26.h[0]
6943; CHECK-GI-FP16-NEXT:    fcvt h16, d16
6944; CHECK-GI-FP16-NEXT:    mov d6, v7.d[1]
6945; CHECK-GI-FP16-NEXT:    fcvt h7, d7
6946; CHECK-GI-FP16-NEXT:    mov v0.h[5], v17.h[0]
6947; CHECK-GI-FP16-NEXT:    mov v1.h[5], v19.h[0]
6948; CHECK-GI-FP16-NEXT:    fcvt h19, d23
6949; CHECK-GI-FP16-NEXT:    fcvt h2, d2
6950; CHECK-GI-FP16-NEXT:    mov v4.h[5], v20.h[0]
6951; CHECK-GI-FP16-NEXT:    fcvt h17, d22
6952; CHECK-GI-FP16-NEXT:    mov v5.h[5], v21.h[0]
6953; CHECK-GI-FP16-NEXT:    fcvt h6, d6
6954; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
6955; CHECK-GI-FP16-NEXT:    mov v1.h[6], v7.h[0]
6956; CHECK-GI-FP16-NEXT:    mov v4.h[6], v16.h[0]
6957; CHECK-GI-FP16-NEXT:    mov v5.h[6], v18.h[0]
6958; CHECK-GI-FP16-NEXT:    mov v0.h[7], v2.h[0]
6959; CHECK-GI-FP16-NEXT:    mov v1.h[7], v6.h[0]
6960; CHECK-GI-FP16-NEXT:    mov v4.h[7], v17.h[0]
6961; CHECK-GI-FP16-NEXT:    mov v5.h[7], v19.h[0]
6962; CHECK-GI-FP16-NEXT:    mov v2.16b, v4.16b
6963; CHECK-GI-FP16-NEXT:    mov v3.16b, v5.16b
6964; CHECK-GI-FP16-NEXT:    ret
6965entry:
6966  %c = sitofp <32 x i64> %a to <32 x half>
6967  ret <32 x half> %c
6968}
6969
6970define <32 x half> @utofp_v32i64_v32f16(<32 x i64> %a) {
6971; CHECK-SD-LABEL: utofp_v32i64_v32f16:
6972; CHECK-SD:       // %bb.0: // %entry
6973; CHECK-SD-NEXT:    ldp q17, q16, [sp]
6974; CHECK-SD-NEXT:    ucvtf v18.2d, v0.2d
6975; CHECK-SD-NEXT:    ldp q19, q0, [sp, #64]
6976; CHECK-SD-NEXT:    ucvtf v4.2d, v4.2d
6977; CHECK-SD-NEXT:    ldp q21, q20, [sp, #96]
6978; CHECK-SD-NEXT:    ucvtf v2.2d, v2.2d
6979; CHECK-SD-NEXT:    ucvtf v17.2d, v17.2d
6980; CHECK-SD-NEXT:    ldp q23, q22, [sp, #32]
6981; CHECK-SD-NEXT:    ucvtf v19.2d, v19.2d
6982; CHECK-SD-NEXT:    fcvtn v18.2s, v18.2d
6983; CHECK-SD-NEXT:    ucvtf v1.2d, v1.2d
6984; CHECK-SD-NEXT:    ucvtf v6.2d, v6.2d
6985; CHECK-SD-NEXT:    fcvtn v4.2s, v4.2d
6986; CHECK-SD-NEXT:    ucvtf v5.2d, v5.2d
6987; CHECK-SD-NEXT:    ucvtf v23.2d, v23.2d
6988; CHECK-SD-NEXT:    ucvtf v16.2d, v16.2d
6989; CHECK-SD-NEXT:    ucvtf v21.2d, v21.2d
6990; CHECK-SD-NEXT:    fcvtn v17.2s, v17.2d
6991; CHECK-SD-NEXT:    ucvtf v0.2d, v0.2d
6992; CHECK-SD-NEXT:    fcvtn v24.2s, v2.2d
6993; CHECK-SD-NEXT:    fcvtn v19.2s, v19.2d
6994; CHECK-SD-NEXT:    ucvtf v2.2d, v3.2d
6995; CHECK-SD-NEXT:    fcvtn2 v18.4s, v1.2d
6996; CHECK-SD-NEXT:    fcvtn v6.2s, v6.2d
6997; CHECK-SD-NEXT:    ucvtf v1.2d, v7.2d
6998; CHECK-SD-NEXT:    fcvtn2 v4.4s, v5.2d
6999; CHECK-SD-NEXT:    fcvtn v5.2s, v23.2d
7000; CHECK-SD-NEXT:    ucvtf v3.2d, v22.2d
7001; CHECK-SD-NEXT:    fcvtn v7.2s, v21.2d
7002; CHECK-SD-NEXT:    fcvtn2 v17.4s, v16.2d
7003; CHECK-SD-NEXT:    ucvtf v16.2d, v20.2d
7004; CHECK-SD-NEXT:    fcvtn2 v19.4s, v0.2d
7005; CHECK-SD-NEXT:    fcvtn2 v24.4s, v2.2d
7006; CHECK-SD-NEXT:    fcvtn v0.4h, v18.4s
7007; CHECK-SD-NEXT:    fcvtn2 v6.4s, v1.2d
7008; CHECK-SD-NEXT:    fcvtn v1.4h, v4.4s
7009; CHECK-SD-NEXT:    fcvtn2 v5.4s, v3.2d
7010; CHECK-SD-NEXT:    fcvtn v2.4h, v17.4s
7011; CHECK-SD-NEXT:    fcvtn2 v7.4s, v16.2d
7012; CHECK-SD-NEXT:    fcvtn v3.4h, v19.4s
7013; CHECK-SD-NEXT:    fcvtn2 v0.8h, v24.4s
7014; CHECK-SD-NEXT:    fcvtn2 v1.8h, v6.4s
7015; CHECK-SD-NEXT:    fcvtn2 v2.8h, v5.4s
7016; CHECK-SD-NEXT:    fcvtn2 v3.8h, v7.4s
7017; CHECK-SD-NEXT:    ret
7018;
7019; CHECK-GI-NOFP16-LABEL: utofp_v32i64_v32f16:
7020; CHECK-GI-NOFP16:       // %bb.0: // %entry
7021; CHECK-GI-NOFP16-NEXT:    ldp q16, q17, [sp]
7022; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2d, v0.2d
7023; CHECK-GI-NOFP16-NEXT:    ldp q20, q21, [sp, #64]
7024; CHECK-GI-NOFP16-NEXT:    ucvtf v4.2d, v4.2d
7025; CHECK-GI-NOFP16-NEXT:    ldp q18, q19, [sp, #32]
7026; CHECK-GI-NOFP16-NEXT:    ucvtf v1.2d, v1.2d
7027; CHECK-GI-NOFP16-NEXT:    ucvtf v16.2d, v16.2d
7028; CHECK-GI-NOFP16-NEXT:    ldp q22, q23, [sp, #96]
7029; CHECK-GI-NOFP16-NEXT:    ucvtf v20.2d, v20.2d
7030; CHECK-GI-NOFP16-NEXT:    ucvtf v2.2d, v2.2d
7031; CHECK-GI-NOFP16-NEXT:    ucvtf v5.2d, v5.2d
7032; CHECK-GI-NOFP16-NEXT:    ucvtf v6.2d, v6.2d
7033; CHECK-GI-NOFP16-NEXT:    ucvtf v17.2d, v17.2d
7034; CHECK-GI-NOFP16-NEXT:    ucvtf v18.2d, v18.2d
7035; CHECK-GI-NOFP16-NEXT:    ucvtf v21.2d, v21.2d
7036; CHECK-GI-NOFP16-NEXT:    ucvtf v22.2d, v22.2d
7037; CHECK-GI-NOFP16-NEXT:    fcvtn v0.2s, v0.2d
7038; CHECK-GI-NOFP16-NEXT:    fcvtn v4.2s, v4.2d
7039; CHECK-GI-NOFP16-NEXT:    fcvtn v16.2s, v16.2d
7040; CHECK-GI-NOFP16-NEXT:    ucvtf v3.2d, v3.2d
7041; CHECK-GI-NOFP16-NEXT:    fcvtn v20.2s, v20.2d
7042; CHECK-GI-NOFP16-NEXT:    ucvtf v7.2d, v7.2d
7043; CHECK-GI-NOFP16-NEXT:    ucvtf v19.2d, v19.2d
7044; CHECK-GI-NOFP16-NEXT:    ucvtf v23.2d, v23.2d
7045; CHECK-GI-NOFP16-NEXT:    fcvtn v24.2s, v2.2d
7046; CHECK-GI-NOFP16-NEXT:    fcvtn v6.2s, v6.2d
7047; CHECK-GI-NOFP16-NEXT:    fcvtn v18.2s, v18.2d
7048; CHECK-GI-NOFP16-NEXT:    fcvtn v22.2s, v22.2d
7049; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.4s, v1.2d
7050; CHECK-GI-NOFP16-NEXT:    fcvtn2 v4.4s, v5.2d
7051; CHECK-GI-NOFP16-NEXT:    fcvtn2 v16.4s, v17.2d
7052; CHECK-GI-NOFP16-NEXT:    fcvtn2 v20.4s, v21.2d
7053; CHECK-GI-NOFP16-NEXT:    fcvtn2 v24.4s, v3.2d
7054; CHECK-GI-NOFP16-NEXT:    fcvtn2 v6.4s, v7.2d
7055; CHECK-GI-NOFP16-NEXT:    fcvtn2 v18.4s, v19.2d
7056; CHECK-GI-NOFP16-NEXT:    fcvtn2 v22.4s, v23.2d
7057; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7058; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v4.4s
7059; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v16.4s
7060; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v20.4s
7061; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v24.4s
7062; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v6.4s
7063; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
7064; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v22.4s
7065; CHECK-GI-NOFP16-NEXT:    ret
7066;
7067; CHECK-GI-FP16-LABEL: utofp_v32i64_v32f16:
7068; CHECK-GI-FP16:       // %bb.0: // %entry
7069; CHECK-GI-FP16-NEXT:    ldp q16, q18, [sp]
7070; CHECK-GI-FP16-NEXT:    ucvtf v0.2d, v0.2d
7071; CHECK-GI-FP16-NEXT:    ldp q17, q19, [sp, #64]
7072; CHECK-GI-FP16-NEXT:    ucvtf v4.2d, v4.2d
7073; CHECK-GI-FP16-NEXT:    ucvtf v1.2d, v1.2d
7074; CHECK-GI-FP16-NEXT:    ucvtf v5.2d, v5.2d
7075; CHECK-GI-FP16-NEXT:    ucvtf v6.2d, v6.2d
7076; CHECK-GI-FP16-NEXT:    ucvtf v20.2d, v16.2d
7077; CHECK-GI-FP16-NEXT:    ucvtf v24.2d, v18.2d
7078; CHECK-GI-FP16-NEXT:    ucvtf v2.2d, v2.2d
7079; CHECK-GI-FP16-NEXT:    ucvtf v16.2d, v17.2d
7080; CHECK-GI-FP16-NEXT:    mov d21, v0.d[1]
7081; CHECK-GI-FP16-NEXT:    ucvtf v25.2d, v19.2d
7082; CHECK-GI-FP16-NEXT:    mov d22, v4.d[1]
7083; CHECK-GI-FP16-NEXT:    fcvt h0, d0
7084; CHECK-GI-FP16-NEXT:    ucvtf v3.2d, v3.2d
7085; CHECK-GI-FP16-NEXT:    mov d18, v1.d[1]
7086; CHECK-GI-FP16-NEXT:    fcvt h17, d1
7087; CHECK-GI-FP16-NEXT:    mov d19, v5.d[1]
7088; CHECK-GI-FP16-NEXT:    mov d23, v20.d[1]
7089; CHECK-GI-FP16-NEXT:    fcvt h1, d4
7090; CHECK-GI-FP16-NEXT:    fcvt h4, d20
7091; CHECK-GI-FP16-NEXT:    mov d26, v16.d[1]
7092; CHECK-GI-FP16-NEXT:    fcvt h20, d5
7093; CHECK-GI-FP16-NEXT:    fcvt h5, d16
7094; CHECK-GI-FP16-NEXT:    fcvt h28, d21
7095; CHECK-GI-FP16-NEXT:    fcvt h29, d22
7096; CHECK-GI-FP16-NEXT:    fcvt h22, d24
7097; CHECK-GI-FP16-NEXT:    fcvt h21, d25
7098; CHECK-GI-FP16-NEXT:    fcvt h18, d18
7099; CHECK-GI-FP16-NEXT:    fcvt h19, d19
7100; CHECK-GI-FP16-NEXT:    fcvt h27, d23
7101; CHECK-GI-FP16-NEXT:    mov d23, v24.d[1]
7102; CHECK-GI-FP16-NEXT:    mov d24, v25.d[1]
7103; CHECK-GI-FP16-NEXT:    ldp q25, q16, [sp, #32]
7104; CHECK-GI-FP16-NEXT:    fcvt h26, d26
7105; CHECK-GI-FP16-NEXT:    mov v0.h[1], v28.h[0]
7106; CHECK-GI-FP16-NEXT:    mov v1.h[1], v29.h[0]
7107; CHECK-GI-FP16-NEXT:    ucvtf v7.2d, v7.2d
7108; CHECK-GI-FP16-NEXT:    mov v4.h[1], v27.h[0]
7109; CHECK-GI-FP16-NEXT:    ucvtf v25.2d, v25.2d
7110; CHECK-GI-FP16-NEXT:    fcvt h23, d23
7111; CHECK-GI-FP16-NEXT:    mov v5.h[1], v26.h[0]
7112; CHECK-GI-FP16-NEXT:    ldp q26, q27, [sp, #96]
7113; CHECK-GI-FP16-NEXT:    fcvt h24, d24
7114; CHECK-GI-FP16-NEXT:    mov v0.h[2], v17.h[0]
7115; CHECK-GI-FP16-NEXT:    mov v1.h[2], v20.h[0]
7116; CHECK-GI-FP16-NEXT:    mov d20, v6.d[1]
7117; CHECK-GI-FP16-NEXT:    mov d17, v2.d[1]
7118; CHECK-GI-FP16-NEXT:    fcvt h2, d2
7119; CHECK-GI-FP16-NEXT:    ucvtf v26.2d, v26.2d
7120; CHECK-GI-FP16-NEXT:    mov v4.h[2], v22.h[0]
7121; CHECK-GI-FP16-NEXT:    fcvt h22, d25
7122; CHECK-GI-FP16-NEXT:    mov v5.h[2], v21.h[0]
7123; CHECK-GI-FP16-NEXT:    mov d21, v25.d[1]
7124; CHECK-GI-FP16-NEXT:    fcvt h6, d6
7125; CHECK-GI-FP16-NEXT:    mov v0.h[3], v18.h[0]
7126; CHECK-GI-FP16-NEXT:    mov v1.h[3], v19.h[0]
7127; CHECK-GI-FP16-NEXT:    ucvtf v16.2d, v16.2d
7128; CHECK-GI-FP16-NEXT:    ucvtf v18.2d, v27.2d
7129; CHECK-GI-FP16-NEXT:    fcvt h19, d20
7130; CHECK-GI-FP16-NEXT:    fcvt h17, d17
7131; CHECK-GI-FP16-NEXT:    mov d25, v26.d[1]
7132; CHECK-GI-FP16-NEXT:    fcvt h26, d26
7133; CHECK-GI-FP16-NEXT:    mov v4.h[3], v23.h[0]
7134; CHECK-GI-FP16-NEXT:    mov v5.h[3], v24.h[0]
7135; CHECK-GI-FP16-NEXT:    fcvt h20, d21
7136; CHECK-GI-FP16-NEXT:    mov v0.h[4], v2.h[0]
7137; CHECK-GI-FP16-NEXT:    mov v1.h[4], v6.h[0]
7138; CHECK-GI-FP16-NEXT:    mov d2, v3.d[1]
7139; CHECK-GI-FP16-NEXT:    mov d23, v18.d[1]
7140; CHECK-GI-FP16-NEXT:    fcvt h18, d18
7141; CHECK-GI-FP16-NEXT:    fcvt h3, d3
7142; CHECK-GI-FP16-NEXT:    fcvt h21, d25
7143; CHECK-GI-FP16-NEXT:    mov v4.h[4], v22.h[0]
7144; CHECK-GI-FP16-NEXT:    mov d22, v16.d[1]
7145; CHECK-GI-FP16-NEXT:    mov v5.h[4], v26.h[0]
7146; CHECK-GI-FP16-NEXT:    fcvt h16, d16
7147; CHECK-GI-FP16-NEXT:    mov d6, v7.d[1]
7148; CHECK-GI-FP16-NEXT:    fcvt h7, d7
7149; CHECK-GI-FP16-NEXT:    mov v0.h[5], v17.h[0]
7150; CHECK-GI-FP16-NEXT:    mov v1.h[5], v19.h[0]
7151; CHECK-GI-FP16-NEXT:    fcvt h19, d23
7152; CHECK-GI-FP16-NEXT:    fcvt h2, d2
7153; CHECK-GI-FP16-NEXT:    mov v4.h[5], v20.h[0]
7154; CHECK-GI-FP16-NEXT:    fcvt h17, d22
7155; CHECK-GI-FP16-NEXT:    mov v5.h[5], v21.h[0]
7156; CHECK-GI-FP16-NEXT:    fcvt h6, d6
7157; CHECK-GI-FP16-NEXT:    mov v0.h[6], v3.h[0]
7158; CHECK-GI-FP16-NEXT:    mov v1.h[6], v7.h[0]
7159; CHECK-GI-FP16-NEXT:    mov v4.h[6], v16.h[0]
7160; CHECK-GI-FP16-NEXT:    mov v5.h[6], v18.h[0]
7161; CHECK-GI-FP16-NEXT:    mov v0.h[7], v2.h[0]
7162; CHECK-GI-FP16-NEXT:    mov v1.h[7], v6.h[0]
7163; CHECK-GI-FP16-NEXT:    mov v4.h[7], v17.h[0]
7164; CHECK-GI-FP16-NEXT:    mov v5.h[7], v19.h[0]
7165; CHECK-GI-FP16-NEXT:    mov v2.16b, v4.16b
7166; CHECK-GI-FP16-NEXT:    mov v3.16b, v5.16b
7167; CHECK-GI-FP16-NEXT:    ret
7168entry:
7169  %c = uitofp <32 x i64> %a to <32 x half>
7170  ret <32 x half> %c
7171}
7172
7173define <2 x half> @stofp_v2i32_v2f16(<2 x i32> %a) {
7174; CHECK-SD-LABEL: stofp_v2i32_v2f16:
7175; CHECK-SD:       // %bb.0: // %entry
7176; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
7177; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
7178; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
7179; CHECK-SD-NEXT:    ret
7180;
7181; CHECK-GI-LABEL: stofp_v2i32_v2f16:
7182; CHECK-GI:       // %bb.0: // %entry
7183; CHECK-GI-NEXT:    scvtf v0.2s, v0.2s
7184; CHECK-GI-NEXT:    mov v1.s[0], v0.s[0]
7185; CHECK-GI-NEXT:    mov v1.s[1], v0.s[1]
7186; CHECK-GI-NEXT:    fcvtn v0.4h, v1.4s
7187; CHECK-GI-NEXT:    ret
7188entry:
7189  %c = sitofp <2 x i32> %a to <2 x half>
7190  ret <2 x half> %c
7191}
7192
7193define <2 x half> @utofp_v2i32_v2f16(<2 x i32> %a) {
7194; CHECK-SD-LABEL: utofp_v2i32_v2f16:
7195; CHECK-SD:       // %bb.0: // %entry
7196; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
7197; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
7198; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
7199; CHECK-SD-NEXT:    ret
7200;
7201; CHECK-GI-LABEL: utofp_v2i32_v2f16:
7202; CHECK-GI:       // %bb.0: // %entry
7203; CHECK-GI-NEXT:    ucvtf v0.2s, v0.2s
7204; CHECK-GI-NEXT:    mov v1.s[0], v0.s[0]
7205; CHECK-GI-NEXT:    mov v1.s[1], v0.s[1]
7206; CHECK-GI-NEXT:    fcvtn v0.4h, v1.4s
7207; CHECK-GI-NEXT:    ret
7208entry:
7209  %c = uitofp <2 x i32> %a to <2 x half>
7210  ret <2 x half> %c
7211}
7212
7213define <3 x half> @stofp_v3i32_v3f16(<3 x i32> %a) {
7214; CHECK-LABEL: stofp_v3i32_v3f16:
7215; CHECK:       // %bb.0: // %entry
7216; CHECK-NEXT:    scvtf v0.4s, v0.4s
7217; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7218; CHECK-NEXT:    ret
7219entry:
7220  %c = sitofp <3 x i32> %a to <3 x half>
7221  ret <3 x half> %c
7222}
7223
7224define <3 x half> @utofp_v3i32_v3f16(<3 x i32> %a) {
7225; CHECK-LABEL: utofp_v3i32_v3f16:
7226; CHECK:       // %bb.0: // %entry
7227; CHECK-NEXT:    ucvtf v0.4s, v0.4s
7228; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7229; CHECK-NEXT:    ret
7230entry:
7231  %c = uitofp <3 x i32> %a to <3 x half>
7232  ret <3 x half> %c
7233}
7234
7235define <4 x half> @stofp_v4i32_v4f16(<4 x i32> %a) {
7236; CHECK-LABEL: stofp_v4i32_v4f16:
7237; CHECK:       // %bb.0: // %entry
7238; CHECK-NEXT:    scvtf v0.4s, v0.4s
7239; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7240; CHECK-NEXT:    ret
7241entry:
7242  %c = sitofp <4 x i32> %a to <4 x half>
7243  ret <4 x half> %c
7244}
7245
7246define <4 x half> @utofp_v4i32_v4f16(<4 x i32> %a) {
7247; CHECK-LABEL: utofp_v4i32_v4f16:
7248; CHECK:       // %bb.0: // %entry
7249; CHECK-NEXT:    ucvtf v0.4s, v0.4s
7250; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7251; CHECK-NEXT:    ret
7252entry:
7253  %c = uitofp <4 x i32> %a to <4 x half>
7254  ret <4 x half> %c
7255}
7256
7257define <8 x half> @stofp_v8i32_v8f16(<8 x i32> %a) {
7258; CHECK-LABEL: stofp_v8i32_v8f16:
7259; CHECK:       // %bb.0: // %entry
7260; CHECK-NEXT:    scvtf v0.4s, v0.4s
7261; CHECK-NEXT:    scvtf v1.4s, v1.4s
7262; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7263; CHECK-NEXT:    fcvtn2 v0.8h, v1.4s
7264; CHECK-NEXT:    ret
7265entry:
7266  %c = sitofp <8 x i32> %a to <8 x half>
7267  ret <8 x half> %c
7268}
7269
7270define <8 x half> @utofp_v8i32_v8f16(<8 x i32> %a) {
7271; CHECK-LABEL: utofp_v8i32_v8f16:
7272; CHECK:       // %bb.0: // %entry
7273; CHECK-NEXT:    ucvtf v0.4s, v0.4s
7274; CHECK-NEXT:    ucvtf v1.4s, v1.4s
7275; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7276; CHECK-NEXT:    fcvtn2 v0.8h, v1.4s
7277; CHECK-NEXT:    ret
7278entry:
7279  %c = uitofp <8 x i32> %a to <8 x half>
7280  ret <8 x half> %c
7281}
7282
7283define <16 x half> @stofp_v16i32_v16f16(<16 x i32> %a) {
7284; CHECK-SD-LABEL: stofp_v16i32_v16f16:
7285; CHECK-SD:       // %bb.0: // %entry
7286; CHECK-SD-NEXT:    scvtf v0.4s, v0.4s
7287; CHECK-SD-NEXT:    scvtf v2.4s, v2.4s
7288; CHECK-SD-NEXT:    scvtf v4.4s, v1.4s
7289; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
7290; CHECK-SD-NEXT:    fcvtn v1.4h, v2.4s
7291; CHECK-SD-NEXT:    scvtf v2.4s, v3.4s
7292; CHECK-SD-NEXT:    fcvtn2 v0.8h, v4.4s
7293; CHECK-SD-NEXT:    fcvtn2 v1.8h, v2.4s
7294; CHECK-SD-NEXT:    ret
7295;
7296; CHECK-GI-LABEL: stofp_v16i32_v16f16:
7297; CHECK-GI:       // %bb.0: // %entry
7298; CHECK-GI-NEXT:    scvtf v0.4s, v0.4s
7299; CHECK-GI-NEXT:    scvtf v2.4s, v2.4s
7300; CHECK-GI-NEXT:    scvtf v4.4s, v1.4s
7301; CHECK-GI-NEXT:    scvtf v3.4s, v3.4s
7302; CHECK-GI-NEXT:    fcvtn v0.4h, v0.4s
7303; CHECK-GI-NEXT:    fcvtn v1.4h, v2.4s
7304; CHECK-GI-NEXT:    fcvtn2 v0.8h, v4.4s
7305; CHECK-GI-NEXT:    fcvtn2 v1.8h, v3.4s
7306; CHECK-GI-NEXT:    ret
7307entry:
7308  %c = sitofp <16 x i32> %a to <16 x half>
7309  ret <16 x half> %c
7310}
7311
7312define <16 x half> @utofp_v16i32_v16f16(<16 x i32> %a) {
7313; CHECK-SD-LABEL: utofp_v16i32_v16f16:
7314; CHECK-SD:       // %bb.0: // %entry
7315; CHECK-SD-NEXT:    ucvtf v0.4s, v0.4s
7316; CHECK-SD-NEXT:    ucvtf v2.4s, v2.4s
7317; CHECK-SD-NEXT:    ucvtf v4.4s, v1.4s
7318; CHECK-SD-NEXT:    fcvtn v0.4h, v0.4s
7319; CHECK-SD-NEXT:    fcvtn v1.4h, v2.4s
7320; CHECK-SD-NEXT:    ucvtf v2.4s, v3.4s
7321; CHECK-SD-NEXT:    fcvtn2 v0.8h, v4.4s
7322; CHECK-SD-NEXT:    fcvtn2 v1.8h, v2.4s
7323; CHECK-SD-NEXT:    ret
7324;
7325; CHECK-GI-LABEL: utofp_v16i32_v16f16:
7326; CHECK-GI:       // %bb.0: // %entry
7327; CHECK-GI-NEXT:    ucvtf v0.4s, v0.4s
7328; CHECK-GI-NEXT:    ucvtf v2.4s, v2.4s
7329; CHECK-GI-NEXT:    ucvtf v4.4s, v1.4s
7330; CHECK-GI-NEXT:    ucvtf v3.4s, v3.4s
7331; CHECK-GI-NEXT:    fcvtn v0.4h, v0.4s
7332; CHECK-GI-NEXT:    fcvtn v1.4h, v2.4s
7333; CHECK-GI-NEXT:    fcvtn2 v0.8h, v4.4s
7334; CHECK-GI-NEXT:    fcvtn2 v1.8h, v3.4s
7335; CHECK-GI-NEXT:    ret
7336entry:
7337  %c = uitofp <16 x i32> %a to <16 x half>
7338  ret <16 x half> %c
7339}
7340
7341define <32 x half> @stofp_v32i32_v32f16(<32 x i32> %a) {
7342; CHECK-LABEL: stofp_v32i32_v32f16:
7343; CHECK:       // %bb.0: // %entry
7344; CHECK-NEXT:    scvtf v0.4s, v0.4s
7345; CHECK-NEXT:    scvtf v2.4s, v2.4s
7346; CHECK-NEXT:    scvtf v4.4s, v4.4s
7347; CHECK-NEXT:    scvtf v6.4s, v6.4s
7348; CHECK-NEXT:    scvtf v16.4s, v1.4s
7349; CHECK-NEXT:    scvtf v17.4s, v3.4s
7350; CHECK-NEXT:    scvtf v5.4s, v5.4s
7351; CHECK-NEXT:    scvtf v7.4s, v7.4s
7352; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7353; CHECK-NEXT:    fcvtn v1.4h, v2.4s
7354; CHECK-NEXT:    fcvtn v2.4h, v4.4s
7355; CHECK-NEXT:    fcvtn v3.4h, v6.4s
7356; CHECK-NEXT:    fcvtn2 v0.8h, v16.4s
7357; CHECK-NEXT:    fcvtn2 v1.8h, v17.4s
7358; CHECK-NEXT:    fcvtn2 v2.8h, v5.4s
7359; CHECK-NEXT:    fcvtn2 v3.8h, v7.4s
7360; CHECK-NEXT:    ret
7361entry:
7362  %c = sitofp <32 x i32> %a to <32 x half>
7363  ret <32 x half> %c
7364}
7365
7366define <32 x half> @utofp_v32i32_v32f16(<32 x i32> %a) {
7367; CHECK-LABEL: utofp_v32i32_v32f16:
7368; CHECK:       // %bb.0: // %entry
7369; CHECK-NEXT:    ucvtf v0.4s, v0.4s
7370; CHECK-NEXT:    ucvtf v2.4s, v2.4s
7371; CHECK-NEXT:    ucvtf v4.4s, v4.4s
7372; CHECK-NEXT:    ucvtf v6.4s, v6.4s
7373; CHECK-NEXT:    ucvtf v16.4s, v1.4s
7374; CHECK-NEXT:    ucvtf v17.4s, v3.4s
7375; CHECK-NEXT:    ucvtf v5.4s, v5.4s
7376; CHECK-NEXT:    ucvtf v7.4s, v7.4s
7377; CHECK-NEXT:    fcvtn v0.4h, v0.4s
7378; CHECK-NEXT:    fcvtn v1.4h, v2.4s
7379; CHECK-NEXT:    fcvtn v2.4h, v4.4s
7380; CHECK-NEXT:    fcvtn v3.4h, v6.4s
7381; CHECK-NEXT:    fcvtn2 v0.8h, v16.4s
7382; CHECK-NEXT:    fcvtn2 v1.8h, v17.4s
7383; CHECK-NEXT:    fcvtn2 v2.8h, v5.4s
7384; CHECK-NEXT:    fcvtn2 v3.8h, v7.4s
7385; CHECK-NEXT:    ret
7386entry:
7387  %c = uitofp <32 x i32> %a to <32 x half>
7388  ret <32 x half> %c
7389}
7390
7391define <2 x half> @stofp_v2i16_v2f16(<2 x i16> %a) {
7392; CHECK-SD-NOFP16-LABEL: stofp_v2i16_v2f16:
7393; CHECK-SD-NOFP16:       // %bb.0: // %entry
7394; CHECK-SD-NOFP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7395; CHECK-SD-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
7396; CHECK-SD-NOFP16-NEXT:    scvtf v0.4s, v0.4s
7397; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7398; CHECK-SD-NOFP16-NEXT:    ret
7399;
7400; CHECK-SD-FP16-LABEL: stofp_v2i16_v2f16:
7401; CHECK-SD-FP16:       // %bb.0: // %entry
7402; CHECK-SD-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7403; CHECK-SD-FP16-NEXT:    scvtf v0.4h, v0.4h
7404; CHECK-SD-FP16-NEXT:    ret
7405;
7406; CHECK-GI-NOFP16-LABEL: stofp_v2i16_v2f16:
7407; CHECK-GI-NOFP16:       // %bb.0: // %entry
7408; CHECK-GI-NOFP16-NEXT:    shl v0.2s, v0.2s, #16
7409; CHECK-GI-NOFP16-NEXT:    sshr v0.2s, v0.2s, #16
7410; CHECK-GI-NOFP16-NEXT:    scvtf v0.2s, v0.2s
7411; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
7412; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
7413; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7414; CHECK-GI-NOFP16-NEXT:    ret
7415;
7416; CHECK-GI-FP16-LABEL: stofp_v2i16_v2f16:
7417; CHECK-GI-FP16:       // %bb.0: // %entry
7418; CHECK-GI-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7419; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
7420; CHECK-GI-FP16-NEXT:    ret
7421entry:
7422  %c = sitofp <2 x i16> %a to <2 x half>
7423  ret <2 x half> %c
7424}
7425
7426define <2 x half> @utofp_v2i16_v2f16(<2 x i16> %a) {
7427; CHECK-SD-NOFP16-LABEL: utofp_v2i16_v2f16:
7428; CHECK-SD-NOFP16:       // %bb.0: // %entry
7429; CHECK-SD-NOFP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7430; CHECK-SD-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
7431; CHECK-SD-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
7432; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7433; CHECK-SD-NOFP16-NEXT:    ret
7434;
7435; CHECK-SD-FP16-LABEL: utofp_v2i16_v2f16:
7436; CHECK-SD-FP16:       // %bb.0: // %entry
7437; CHECK-SD-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7438; CHECK-SD-FP16-NEXT:    ucvtf v0.4h, v0.4h
7439; CHECK-SD-FP16-NEXT:    ret
7440;
7441; CHECK-GI-NOFP16-LABEL: utofp_v2i16_v2f16:
7442; CHECK-GI-NOFP16:       // %bb.0: // %entry
7443; CHECK-GI-NOFP16-NEXT:    movi d1, #0x00ffff0000ffff
7444; CHECK-GI-NOFP16-NEXT:    and v0.8b, v0.8b, v1.8b
7445; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2s, v0.2s
7446; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
7447; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
7448; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7449; CHECK-GI-NOFP16-NEXT:    ret
7450;
7451; CHECK-GI-FP16-LABEL: utofp_v2i16_v2f16:
7452; CHECK-GI-FP16:       // %bb.0: // %entry
7453; CHECK-GI-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7454; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
7455; CHECK-GI-FP16-NEXT:    ret
7456entry:
7457  %c = uitofp <2 x i16> %a to <2 x half>
7458  ret <2 x half> %c
7459}
7460
7461define <3 x half> @stofp_v3i16_v3f16(<3 x i16> %a) {
7462; CHECK-SD-NOFP16-LABEL: stofp_v3i16_v3f16:
7463; CHECK-SD-NOFP16:       // %bb.0: // %entry
7464; CHECK-SD-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
7465; CHECK-SD-NOFP16-NEXT:    scvtf v0.4s, v0.4s
7466; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7467; CHECK-SD-NOFP16-NEXT:    ret
7468;
7469; CHECK-SD-FP16-LABEL: stofp_v3i16_v3f16:
7470; CHECK-SD-FP16:       // %bb.0: // %entry
7471; CHECK-SD-FP16-NEXT:    scvtf v0.4h, v0.4h
7472; CHECK-SD-FP16-NEXT:    ret
7473;
7474; CHECK-GI-NOFP16-LABEL: stofp_v3i16_v3f16:
7475; CHECK-GI-NOFP16:       // %bb.0: // %entry
7476; CHECK-GI-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
7477; CHECK-GI-NOFP16-NEXT:    scvtf v0.4s, v0.4s
7478; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7479; CHECK-GI-NOFP16-NEXT:    ret
7480;
7481; CHECK-GI-FP16-LABEL: stofp_v3i16_v3f16:
7482; CHECK-GI-FP16:       // %bb.0: // %entry
7483; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
7484; CHECK-GI-FP16-NEXT:    ret
7485entry:
7486  %c = sitofp <3 x i16> %a to <3 x half>
7487  ret <3 x half> %c
7488}
7489
7490define <3 x half> @utofp_v3i16_v3f16(<3 x i16> %a) {
7491; CHECK-SD-NOFP16-LABEL: utofp_v3i16_v3f16:
7492; CHECK-SD-NOFP16:       // %bb.0: // %entry
7493; CHECK-SD-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
7494; CHECK-SD-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
7495; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7496; CHECK-SD-NOFP16-NEXT:    ret
7497;
7498; CHECK-SD-FP16-LABEL: utofp_v3i16_v3f16:
7499; CHECK-SD-FP16:       // %bb.0: // %entry
7500; CHECK-SD-FP16-NEXT:    ucvtf v0.4h, v0.4h
7501; CHECK-SD-FP16-NEXT:    ret
7502;
7503; CHECK-GI-NOFP16-LABEL: utofp_v3i16_v3f16:
7504; CHECK-GI-NOFP16:       // %bb.0: // %entry
7505; CHECK-GI-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
7506; CHECK-GI-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
7507; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7508; CHECK-GI-NOFP16-NEXT:    ret
7509;
7510; CHECK-GI-FP16-LABEL: utofp_v3i16_v3f16:
7511; CHECK-GI-FP16:       // %bb.0: // %entry
7512; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
7513; CHECK-GI-FP16-NEXT:    ret
7514entry:
7515  %c = uitofp <3 x i16> %a to <3 x half>
7516  ret <3 x half> %c
7517}
7518
7519define <4 x half> @stofp_v4i16_v4f16(<4 x i16> %a) {
7520; CHECK-SD-NOFP16-LABEL: stofp_v4i16_v4f16:
7521; CHECK-SD-NOFP16:       // %bb.0: // %entry
7522; CHECK-SD-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
7523; CHECK-SD-NOFP16-NEXT:    scvtf v0.4s, v0.4s
7524; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7525; CHECK-SD-NOFP16-NEXT:    ret
7526;
7527; CHECK-SD-FP16-LABEL: stofp_v4i16_v4f16:
7528; CHECK-SD-FP16:       // %bb.0: // %entry
7529; CHECK-SD-FP16-NEXT:    scvtf v0.4h, v0.4h
7530; CHECK-SD-FP16-NEXT:    ret
7531;
7532; CHECK-GI-NOFP16-LABEL: stofp_v4i16_v4f16:
7533; CHECK-GI-NOFP16:       // %bb.0: // %entry
7534; CHECK-GI-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
7535; CHECK-GI-NOFP16-NEXT:    scvtf v0.4s, v0.4s
7536; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7537; CHECK-GI-NOFP16-NEXT:    ret
7538;
7539; CHECK-GI-FP16-LABEL: stofp_v4i16_v4f16:
7540; CHECK-GI-FP16:       // %bb.0: // %entry
7541; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
7542; CHECK-GI-FP16-NEXT:    ret
7543entry:
7544  %c = sitofp <4 x i16> %a to <4 x half>
7545  ret <4 x half> %c
7546}
7547
7548define <4 x half> @utofp_v4i16_v4f16(<4 x i16> %a) {
7549; CHECK-SD-NOFP16-LABEL: utofp_v4i16_v4f16:
7550; CHECK-SD-NOFP16:       // %bb.0: // %entry
7551; CHECK-SD-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
7552; CHECK-SD-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
7553; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7554; CHECK-SD-NOFP16-NEXT:    ret
7555;
7556; CHECK-SD-FP16-LABEL: utofp_v4i16_v4f16:
7557; CHECK-SD-FP16:       // %bb.0: // %entry
7558; CHECK-SD-FP16-NEXT:    ucvtf v0.4h, v0.4h
7559; CHECK-SD-FP16-NEXT:    ret
7560;
7561; CHECK-GI-NOFP16-LABEL: utofp_v4i16_v4f16:
7562; CHECK-GI-NOFP16:       // %bb.0: // %entry
7563; CHECK-GI-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
7564; CHECK-GI-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
7565; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
7566; CHECK-GI-NOFP16-NEXT:    ret
7567;
7568; CHECK-GI-FP16-LABEL: utofp_v4i16_v4f16:
7569; CHECK-GI-FP16:       // %bb.0: // %entry
7570; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
7571; CHECK-GI-FP16-NEXT:    ret
7572entry:
7573  %c = uitofp <4 x i16> %a to <4 x half>
7574  ret <4 x half> %c
7575}
7576
7577define <8 x half> @stofp_v8i16_v8f16(<8 x i16> %a) {
7578; CHECK-SD-NOFP16-LABEL: stofp_v8i16_v8f16:
7579; CHECK-SD-NOFP16:       // %bb.0: // %entry
7580; CHECK-SD-NOFP16-NEXT:    sshll v1.4s, v0.4h, #0
7581; CHECK-SD-NOFP16-NEXT:    sshll2 v2.4s, v0.8h, #0
7582; CHECK-SD-NOFP16-NEXT:    scvtf v1.4s, v1.4s
7583; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7584; CHECK-SD-NOFP16-NEXT:    scvtf v1.4s, v2.4s
7585; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
7586; CHECK-SD-NOFP16-NEXT:    ret
7587;
7588; CHECK-SD-FP16-LABEL: stofp_v8i16_v8f16:
7589; CHECK-SD-FP16:       // %bb.0: // %entry
7590; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v0.8h
7591; CHECK-SD-FP16-NEXT:    ret
7592;
7593; CHECK-GI-NOFP16-LABEL: stofp_v8i16_v8f16:
7594; CHECK-GI-NOFP16:       // %bb.0: // %entry
7595; CHECK-GI-NOFP16-NEXT:    sshll v1.4s, v0.4h, #0
7596; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
7597; CHECK-GI-NOFP16-NEXT:    scvtf v1.4s, v1.4s
7598; CHECK-GI-NOFP16-NEXT:    scvtf v2.4s, v0.4s
7599; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7600; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
7601; CHECK-GI-NOFP16-NEXT:    ret
7602;
7603; CHECK-GI-FP16-LABEL: stofp_v8i16_v8f16:
7604; CHECK-GI-FP16:       // %bb.0: // %entry
7605; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v0.8h
7606; CHECK-GI-FP16-NEXT:    ret
7607entry:
7608  %c = sitofp <8 x i16> %a to <8 x half>
7609  ret <8 x half> %c
7610}
7611
7612define <8 x half> @utofp_v8i16_v8f16(<8 x i16> %a) {
7613; CHECK-SD-NOFP16-LABEL: utofp_v8i16_v8f16:
7614; CHECK-SD-NOFP16:       // %bb.0: // %entry
7615; CHECK-SD-NOFP16-NEXT:    ushll v1.4s, v0.4h, #0
7616; CHECK-SD-NOFP16-NEXT:    ushll2 v2.4s, v0.8h, #0
7617; CHECK-SD-NOFP16-NEXT:    ucvtf v1.4s, v1.4s
7618; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7619; CHECK-SD-NOFP16-NEXT:    ucvtf v1.4s, v2.4s
7620; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
7621; CHECK-SD-NOFP16-NEXT:    ret
7622;
7623; CHECK-SD-FP16-LABEL: utofp_v8i16_v8f16:
7624; CHECK-SD-FP16:       // %bb.0: // %entry
7625; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v0.8h
7626; CHECK-SD-FP16-NEXT:    ret
7627;
7628; CHECK-GI-NOFP16-LABEL: utofp_v8i16_v8f16:
7629; CHECK-GI-NOFP16:       // %bb.0: // %entry
7630; CHECK-GI-NOFP16-NEXT:    ushll v1.4s, v0.4h, #0
7631; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
7632; CHECK-GI-NOFP16-NEXT:    ucvtf v1.4s, v1.4s
7633; CHECK-GI-NOFP16-NEXT:    ucvtf v2.4s, v0.4s
7634; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7635; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
7636; CHECK-GI-NOFP16-NEXT:    ret
7637;
7638; CHECK-GI-FP16-LABEL: utofp_v8i16_v8f16:
7639; CHECK-GI-FP16:       // %bb.0: // %entry
7640; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v0.8h
7641; CHECK-GI-FP16-NEXT:    ret
7642entry:
7643  %c = uitofp <8 x i16> %a to <8 x half>
7644  ret <8 x half> %c
7645}
7646
7647define <16 x half> @stofp_v16i16_v16f16(<16 x i16> %a) {
7648; CHECK-SD-NOFP16-LABEL: stofp_v16i16_v16f16:
7649; CHECK-SD-NOFP16:       // %bb.0: // %entry
7650; CHECK-SD-NOFP16-NEXT:    sshll v2.4s, v0.4h, #0
7651; CHECK-SD-NOFP16-NEXT:    sshll v3.4s, v1.4h, #0
7652; CHECK-SD-NOFP16-NEXT:    sshll2 v4.4s, v0.8h, #0
7653; CHECK-SD-NOFP16-NEXT:    sshll2 v5.4s, v1.8h, #0
7654; CHECK-SD-NOFP16-NEXT:    scvtf v2.4s, v2.4s
7655; CHECK-SD-NOFP16-NEXT:    scvtf v3.4s, v3.4s
7656; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
7657; CHECK-SD-NOFP16-NEXT:    scvtf v2.4s, v4.4s
7658; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
7659; CHECK-SD-NOFP16-NEXT:    scvtf v3.4s, v5.4s
7660; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
7661; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
7662; CHECK-SD-NOFP16-NEXT:    ret
7663;
7664; CHECK-SD-FP16-LABEL: stofp_v16i16_v16f16:
7665; CHECK-SD-FP16:       // %bb.0: // %entry
7666; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v0.8h
7667; CHECK-SD-FP16-NEXT:    scvtf v1.8h, v1.8h
7668; CHECK-SD-FP16-NEXT:    ret
7669;
7670; CHECK-GI-NOFP16-LABEL: stofp_v16i16_v16f16:
7671; CHECK-GI-NOFP16:       // %bb.0: // %entry
7672; CHECK-GI-NOFP16-NEXT:    sshll v2.4s, v0.4h, #0
7673; CHECK-GI-NOFP16-NEXT:    sshll v3.4s, v1.4h, #0
7674; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
7675; CHECK-GI-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
7676; CHECK-GI-NOFP16-NEXT:    scvtf v2.4s, v2.4s
7677; CHECK-GI-NOFP16-NEXT:    scvtf v3.4s, v3.4s
7678; CHECK-GI-NOFP16-NEXT:    scvtf v4.4s, v0.4s
7679; CHECK-GI-NOFP16-NEXT:    scvtf v5.4s, v1.4s
7680; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
7681; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
7682; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
7683; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
7684; CHECK-GI-NOFP16-NEXT:    ret
7685;
7686; CHECK-GI-FP16-LABEL: stofp_v16i16_v16f16:
7687; CHECK-GI-FP16:       // %bb.0: // %entry
7688; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v0.8h
7689; CHECK-GI-FP16-NEXT:    scvtf v1.8h, v1.8h
7690; CHECK-GI-FP16-NEXT:    ret
7691entry:
7692  %c = sitofp <16 x i16> %a to <16 x half>
7693  ret <16 x half> %c
7694}
7695
7696define <16 x half> @utofp_v16i16_v16f16(<16 x i16> %a) {
7697; CHECK-SD-NOFP16-LABEL: utofp_v16i16_v16f16:
7698; CHECK-SD-NOFP16:       // %bb.0: // %entry
7699; CHECK-SD-NOFP16-NEXT:    ushll v2.4s, v0.4h, #0
7700; CHECK-SD-NOFP16-NEXT:    ushll v3.4s, v1.4h, #0
7701; CHECK-SD-NOFP16-NEXT:    ushll2 v4.4s, v0.8h, #0
7702; CHECK-SD-NOFP16-NEXT:    ushll2 v5.4s, v1.8h, #0
7703; CHECK-SD-NOFP16-NEXT:    ucvtf v2.4s, v2.4s
7704; CHECK-SD-NOFP16-NEXT:    ucvtf v3.4s, v3.4s
7705; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
7706; CHECK-SD-NOFP16-NEXT:    ucvtf v2.4s, v4.4s
7707; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
7708; CHECK-SD-NOFP16-NEXT:    ucvtf v3.4s, v5.4s
7709; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
7710; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v3.4s
7711; CHECK-SD-NOFP16-NEXT:    ret
7712;
7713; CHECK-SD-FP16-LABEL: utofp_v16i16_v16f16:
7714; CHECK-SD-FP16:       // %bb.0: // %entry
7715; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v0.8h
7716; CHECK-SD-FP16-NEXT:    ucvtf v1.8h, v1.8h
7717; CHECK-SD-FP16-NEXT:    ret
7718;
7719; CHECK-GI-NOFP16-LABEL: utofp_v16i16_v16f16:
7720; CHECK-GI-NOFP16:       // %bb.0: // %entry
7721; CHECK-GI-NOFP16-NEXT:    ushll v2.4s, v0.4h, #0
7722; CHECK-GI-NOFP16-NEXT:    ushll v3.4s, v1.4h, #0
7723; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
7724; CHECK-GI-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
7725; CHECK-GI-NOFP16-NEXT:    ucvtf v2.4s, v2.4s
7726; CHECK-GI-NOFP16-NEXT:    ucvtf v3.4s, v3.4s
7727; CHECK-GI-NOFP16-NEXT:    ucvtf v4.4s, v0.4s
7728; CHECK-GI-NOFP16-NEXT:    ucvtf v5.4s, v1.4s
7729; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
7730; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
7731; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
7732; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
7733; CHECK-GI-NOFP16-NEXT:    ret
7734;
7735; CHECK-GI-FP16-LABEL: utofp_v16i16_v16f16:
7736; CHECK-GI-FP16:       // %bb.0: // %entry
7737; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v0.8h
7738; CHECK-GI-FP16-NEXT:    ucvtf v1.8h, v1.8h
7739; CHECK-GI-FP16-NEXT:    ret
7740entry:
7741  %c = uitofp <16 x i16> %a to <16 x half>
7742  ret <16 x half> %c
7743}
7744
7745define <32 x half> @stofp_v32i16_v32f16(<32 x i16> %a) {
7746; CHECK-SD-NOFP16-LABEL: stofp_v32i16_v32f16:
7747; CHECK-SD-NOFP16:       // %bb.0: // %entry
7748; CHECK-SD-NOFP16-NEXT:    sshll v4.4s, v0.4h, #0
7749; CHECK-SD-NOFP16-NEXT:    sshll v5.4s, v1.4h, #0
7750; CHECK-SD-NOFP16-NEXT:    sshll v6.4s, v2.4h, #0
7751; CHECK-SD-NOFP16-NEXT:    sshll v7.4s, v3.4h, #0
7752; CHECK-SD-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
7753; CHECK-SD-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
7754; CHECK-SD-NOFP16-NEXT:    sshll2 v2.4s, v2.8h, #0
7755; CHECK-SD-NOFP16-NEXT:    sshll2 v3.4s, v3.8h, #0
7756; CHECK-SD-NOFP16-NEXT:    scvtf v4.4s, v4.4s
7757; CHECK-SD-NOFP16-NEXT:    scvtf v5.4s, v5.4s
7758; CHECK-SD-NOFP16-NEXT:    scvtf v6.4s, v6.4s
7759; CHECK-SD-NOFP16-NEXT:    scvtf v7.4s, v7.4s
7760; CHECK-SD-NOFP16-NEXT:    scvtf v16.4s, v0.4s
7761; CHECK-SD-NOFP16-NEXT:    scvtf v17.4s, v1.4s
7762; CHECK-SD-NOFP16-NEXT:    scvtf v18.4s, v2.4s
7763; CHECK-SD-NOFP16-NEXT:    scvtf v19.4s, v3.4s
7764; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
7765; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
7766; CHECK-SD-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
7767; CHECK-SD-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
7768; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
7769; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
7770; CHECK-SD-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
7771; CHECK-SD-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
7772; CHECK-SD-NOFP16-NEXT:    ret
7773;
7774; CHECK-SD-FP16-LABEL: stofp_v32i16_v32f16:
7775; CHECK-SD-FP16:       // %bb.0: // %entry
7776; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v0.8h
7777; CHECK-SD-FP16-NEXT:    scvtf v1.8h, v1.8h
7778; CHECK-SD-FP16-NEXT:    scvtf v2.8h, v2.8h
7779; CHECK-SD-FP16-NEXT:    scvtf v3.8h, v3.8h
7780; CHECK-SD-FP16-NEXT:    ret
7781;
7782; CHECK-GI-NOFP16-LABEL: stofp_v32i16_v32f16:
7783; CHECK-GI-NOFP16:       // %bb.0: // %entry
7784; CHECK-GI-NOFP16-NEXT:    sshll v4.4s, v0.4h, #0
7785; CHECK-GI-NOFP16-NEXT:    sshll v5.4s, v1.4h, #0
7786; CHECK-GI-NOFP16-NEXT:    sshll v6.4s, v2.4h, #0
7787; CHECK-GI-NOFP16-NEXT:    sshll v7.4s, v3.4h, #0
7788; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
7789; CHECK-GI-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
7790; CHECK-GI-NOFP16-NEXT:    sshll2 v2.4s, v2.8h, #0
7791; CHECK-GI-NOFP16-NEXT:    sshll2 v3.4s, v3.8h, #0
7792; CHECK-GI-NOFP16-NEXT:    scvtf v4.4s, v4.4s
7793; CHECK-GI-NOFP16-NEXT:    scvtf v5.4s, v5.4s
7794; CHECK-GI-NOFP16-NEXT:    scvtf v6.4s, v6.4s
7795; CHECK-GI-NOFP16-NEXT:    scvtf v7.4s, v7.4s
7796; CHECK-GI-NOFP16-NEXT:    scvtf v16.4s, v0.4s
7797; CHECK-GI-NOFP16-NEXT:    scvtf v17.4s, v1.4s
7798; CHECK-GI-NOFP16-NEXT:    scvtf v18.4s, v2.4s
7799; CHECK-GI-NOFP16-NEXT:    scvtf v19.4s, v3.4s
7800; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
7801; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
7802; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
7803; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
7804; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
7805; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
7806; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
7807; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
7808; CHECK-GI-NOFP16-NEXT:    ret
7809;
7810; CHECK-GI-FP16-LABEL: stofp_v32i16_v32f16:
7811; CHECK-GI-FP16:       // %bb.0: // %entry
7812; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v0.8h
7813; CHECK-GI-FP16-NEXT:    scvtf v1.8h, v1.8h
7814; CHECK-GI-FP16-NEXT:    scvtf v2.8h, v2.8h
7815; CHECK-GI-FP16-NEXT:    scvtf v3.8h, v3.8h
7816; CHECK-GI-FP16-NEXT:    ret
7817entry:
7818  %c = sitofp <32 x i16> %a to <32 x half>
7819  ret <32 x half> %c
7820}
7821
7822define <32 x half> @utofp_v32i16_v32f16(<32 x i16> %a) {
7823; CHECK-SD-NOFP16-LABEL: utofp_v32i16_v32f16:
7824; CHECK-SD-NOFP16:       // %bb.0: // %entry
7825; CHECK-SD-NOFP16-NEXT:    ushll v4.4s, v0.4h, #0
7826; CHECK-SD-NOFP16-NEXT:    ushll v5.4s, v1.4h, #0
7827; CHECK-SD-NOFP16-NEXT:    ushll v6.4s, v2.4h, #0
7828; CHECK-SD-NOFP16-NEXT:    ushll v7.4s, v3.4h, #0
7829; CHECK-SD-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
7830; CHECK-SD-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
7831; CHECK-SD-NOFP16-NEXT:    ushll2 v2.4s, v2.8h, #0
7832; CHECK-SD-NOFP16-NEXT:    ushll2 v3.4s, v3.8h, #0
7833; CHECK-SD-NOFP16-NEXT:    ucvtf v4.4s, v4.4s
7834; CHECK-SD-NOFP16-NEXT:    ucvtf v5.4s, v5.4s
7835; CHECK-SD-NOFP16-NEXT:    ucvtf v6.4s, v6.4s
7836; CHECK-SD-NOFP16-NEXT:    ucvtf v7.4s, v7.4s
7837; CHECK-SD-NOFP16-NEXT:    ucvtf v16.4s, v0.4s
7838; CHECK-SD-NOFP16-NEXT:    ucvtf v17.4s, v1.4s
7839; CHECK-SD-NOFP16-NEXT:    ucvtf v18.4s, v2.4s
7840; CHECK-SD-NOFP16-NEXT:    ucvtf v19.4s, v3.4s
7841; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
7842; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
7843; CHECK-SD-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
7844; CHECK-SD-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
7845; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
7846; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
7847; CHECK-SD-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
7848; CHECK-SD-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
7849; CHECK-SD-NOFP16-NEXT:    ret
7850;
7851; CHECK-SD-FP16-LABEL: utofp_v32i16_v32f16:
7852; CHECK-SD-FP16:       // %bb.0: // %entry
7853; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v0.8h
7854; CHECK-SD-FP16-NEXT:    ucvtf v1.8h, v1.8h
7855; CHECK-SD-FP16-NEXT:    ucvtf v2.8h, v2.8h
7856; CHECK-SD-FP16-NEXT:    ucvtf v3.8h, v3.8h
7857; CHECK-SD-FP16-NEXT:    ret
7858;
7859; CHECK-GI-NOFP16-LABEL: utofp_v32i16_v32f16:
7860; CHECK-GI-NOFP16:       // %bb.0: // %entry
7861; CHECK-GI-NOFP16-NEXT:    ushll v4.4s, v0.4h, #0
7862; CHECK-GI-NOFP16-NEXT:    ushll v5.4s, v1.4h, #0
7863; CHECK-GI-NOFP16-NEXT:    ushll v6.4s, v2.4h, #0
7864; CHECK-GI-NOFP16-NEXT:    ushll v7.4s, v3.4h, #0
7865; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
7866; CHECK-GI-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
7867; CHECK-GI-NOFP16-NEXT:    ushll2 v2.4s, v2.8h, #0
7868; CHECK-GI-NOFP16-NEXT:    ushll2 v3.4s, v3.8h, #0
7869; CHECK-GI-NOFP16-NEXT:    ucvtf v4.4s, v4.4s
7870; CHECK-GI-NOFP16-NEXT:    ucvtf v5.4s, v5.4s
7871; CHECK-GI-NOFP16-NEXT:    ucvtf v6.4s, v6.4s
7872; CHECK-GI-NOFP16-NEXT:    ucvtf v7.4s, v7.4s
7873; CHECK-GI-NOFP16-NEXT:    ucvtf v16.4s, v0.4s
7874; CHECK-GI-NOFP16-NEXT:    ucvtf v17.4s, v1.4s
7875; CHECK-GI-NOFP16-NEXT:    ucvtf v18.4s, v2.4s
7876; CHECK-GI-NOFP16-NEXT:    ucvtf v19.4s, v3.4s
7877; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
7878; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
7879; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
7880; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
7881; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
7882; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
7883; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
7884; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
7885; CHECK-GI-NOFP16-NEXT:    ret
7886;
7887; CHECK-GI-FP16-LABEL: utofp_v32i16_v32f16:
7888; CHECK-GI-FP16:       // %bb.0: // %entry
7889; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v0.8h
7890; CHECK-GI-FP16-NEXT:    ucvtf v1.8h, v1.8h
7891; CHECK-GI-FP16-NEXT:    ucvtf v2.8h, v2.8h
7892; CHECK-GI-FP16-NEXT:    ucvtf v3.8h, v3.8h
7893; CHECK-GI-FP16-NEXT:    ret
7894entry:
7895  %c = uitofp <32 x i16> %a to <32 x half>
7896  ret <32 x half> %c
7897}
7898
7899define <2 x half> @stofp_v2i8_v2f16(<2 x i8> %a) {
7900; CHECK-SD-NOFP16-LABEL: stofp_v2i8_v2f16:
7901; CHECK-SD-NOFP16:       // %bb.0: // %entry
7902; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
7903; CHECK-SD-NOFP16-NEXT:    mov w8, v0.s[1]
7904; CHECK-SD-NOFP16-NEXT:    fmov w9, s0
7905; CHECK-SD-NOFP16-NEXT:    sxtb w9, w9
7906; CHECK-SD-NOFP16-NEXT:    sxtb w8, w8
7907; CHECK-SD-NOFP16-NEXT:    scvtf s1, w9
7908; CHECK-SD-NOFP16-NEXT:    scvtf s0, w8
7909; CHECK-SD-NOFP16-NEXT:    fcvt h2, s0
7910; CHECK-SD-NOFP16-NEXT:    fcvt h0, s1
7911; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
7912; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
7913; CHECK-SD-NOFP16-NEXT:    ret
7914;
7915; CHECK-SD-FP16-LABEL: stofp_v2i8_v2f16:
7916; CHECK-SD-FP16:       // %bb.0: // %entry
7917; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
7918; CHECK-SD-FP16-NEXT:    mov w8, v0.s[1]
7919; CHECK-SD-FP16-NEXT:    fmov w9, s0
7920; CHECK-SD-FP16-NEXT:    sxtb w9, w9
7921; CHECK-SD-FP16-NEXT:    sxtb w8, w8
7922; CHECK-SD-FP16-NEXT:    scvtf h0, w9
7923; CHECK-SD-FP16-NEXT:    scvtf h1, w8
7924; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
7925; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
7926; CHECK-SD-FP16-NEXT:    ret
7927;
7928; CHECK-GI-NOFP16-LABEL: stofp_v2i8_v2f16:
7929; CHECK-GI-NOFP16:       // %bb.0: // %entry
7930; CHECK-GI-NOFP16-NEXT:    shl v0.2s, v0.2s, #24
7931; CHECK-GI-NOFP16-NEXT:    sshr v0.2s, v0.2s, #24
7932; CHECK-GI-NOFP16-NEXT:    scvtf v0.2s, v0.2s
7933; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
7934; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
7935; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7936; CHECK-GI-NOFP16-NEXT:    ret
7937;
7938; CHECK-GI-FP16-LABEL: stofp_v2i8_v2f16:
7939; CHECK-GI-FP16:       // %bb.0: // %entry
7940; CHECK-GI-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7941; CHECK-GI-FP16-NEXT:    shl v0.4h, v0.4h, #8
7942; CHECK-GI-FP16-NEXT:    sshr v0.4h, v0.4h, #8
7943; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
7944; CHECK-GI-FP16-NEXT:    ret
7945entry:
7946  %c = sitofp <2 x i8> %a to <2 x half>
7947  ret <2 x half> %c
7948}
7949
7950define <2 x half> @utofp_v2i8_v2f16(<2 x i8> %a) {
7951; CHECK-SD-NOFP16-LABEL: utofp_v2i8_v2f16:
7952; CHECK-SD-NOFP16:       // %bb.0: // %entry
7953; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 def $q0
7954; CHECK-SD-NOFP16-NEXT:    mov w8, v0.s[1]
7955; CHECK-SD-NOFP16-NEXT:    fmov w9, s0
7956; CHECK-SD-NOFP16-NEXT:    and w9, w9, #0xff
7957; CHECK-SD-NOFP16-NEXT:    and w8, w8, #0xff
7958; CHECK-SD-NOFP16-NEXT:    ucvtf s1, w9
7959; CHECK-SD-NOFP16-NEXT:    ucvtf s0, w8
7960; CHECK-SD-NOFP16-NEXT:    fcvt h2, s0
7961; CHECK-SD-NOFP16-NEXT:    fcvt h0, s1
7962; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], v2.h[0]
7963; CHECK-SD-NOFP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
7964; CHECK-SD-NOFP16-NEXT:    ret
7965;
7966; CHECK-SD-FP16-LABEL: utofp_v2i8_v2f16:
7967; CHECK-SD-FP16:       // %bb.0: // %entry
7968; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 def $q0
7969; CHECK-SD-FP16-NEXT:    mov w8, v0.s[1]
7970; CHECK-SD-FP16-NEXT:    fmov w9, s0
7971; CHECK-SD-FP16-NEXT:    and w9, w9, #0xff
7972; CHECK-SD-FP16-NEXT:    and w8, w8, #0xff
7973; CHECK-SD-FP16-NEXT:    ucvtf h0, w9
7974; CHECK-SD-FP16-NEXT:    ucvtf h1, w8
7975; CHECK-SD-FP16-NEXT:    mov v0.h[1], v1.h[0]
7976; CHECK-SD-FP16-NEXT:    // kill: def $d0 killed $d0 killed $q0
7977; CHECK-SD-FP16-NEXT:    ret
7978;
7979; CHECK-GI-NOFP16-LABEL: utofp_v2i8_v2f16:
7980; CHECK-GI-NOFP16:       // %bb.0: // %entry
7981; CHECK-GI-NOFP16-NEXT:    movi d1, #0x0000ff000000ff
7982; CHECK-GI-NOFP16-NEXT:    and v0.8b, v0.8b, v1.8b
7983; CHECK-GI-NOFP16-NEXT:    ucvtf v0.2s, v0.2s
7984; CHECK-GI-NOFP16-NEXT:    mov v1.s[0], v0.s[0]
7985; CHECK-GI-NOFP16-NEXT:    mov v1.s[1], v0.s[1]
7986; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
7987; CHECK-GI-NOFP16-NEXT:    ret
7988;
7989; CHECK-GI-FP16-LABEL: utofp_v2i8_v2f16:
7990; CHECK-GI-FP16:       // %bb.0: // %entry
7991; CHECK-GI-FP16-NEXT:    movi d1, #0x0000ff000000ff
7992; CHECK-GI-FP16-NEXT:    and v0.8b, v0.8b, v1.8b
7993; CHECK-GI-FP16-NEXT:    uzp1 v0.4h, v0.4h, v0.4h
7994; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
7995; CHECK-GI-FP16-NEXT:    ret
7996entry:
7997  %c = uitofp <2 x i8> %a to <2 x half>
7998  ret <2 x half> %c
7999}
8000
8001define <3 x half> @stofp_v3i8_v3f16(<3 x i8> %a) {
8002; CHECK-SD-NOFP16-LABEL: stofp_v3i8_v3f16:
8003; CHECK-SD-NOFP16:       // %bb.0: // %entry
8004; CHECK-SD-NOFP16-NEXT:    fmov s0, w0
8005; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], w1
8006; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], w2
8007; CHECK-SD-NOFP16-NEXT:    shl v0.4h, v0.4h, #8
8008; CHECK-SD-NOFP16-NEXT:    sshr v0.4h, v0.4h, #8
8009; CHECK-SD-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
8010; CHECK-SD-NOFP16-NEXT:    scvtf v0.4s, v0.4s
8011; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8012; CHECK-SD-NOFP16-NEXT:    ret
8013;
8014; CHECK-SD-FP16-LABEL: stofp_v3i8_v3f16:
8015; CHECK-SD-FP16:       // %bb.0: // %entry
8016; CHECK-SD-FP16-NEXT:    fmov s0, w0
8017; CHECK-SD-FP16-NEXT:    mov v0.h[1], w1
8018; CHECK-SD-FP16-NEXT:    mov v0.h[2], w2
8019; CHECK-SD-FP16-NEXT:    shl v0.4h, v0.4h, #8
8020; CHECK-SD-FP16-NEXT:    sshr v0.4h, v0.4h, #8
8021; CHECK-SD-FP16-NEXT:    scvtf v0.4h, v0.4h
8022; CHECK-SD-FP16-NEXT:    ret
8023;
8024; CHECK-GI-NOFP16-LABEL: stofp_v3i8_v3f16:
8025; CHECK-GI-NOFP16:       // %bb.0: // %entry
8026; CHECK-GI-NOFP16-NEXT:    fmov s0, w0
8027; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], w1
8028; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], w2
8029; CHECK-GI-NOFP16-NEXT:    shl v0.4h, v0.4h, #8
8030; CHECK-GI-NOFP16-NEXT:    sshr v0.4h, v0.4h, #8
8031; CHECK-GI-NOFP16-NEXT:    mov v1.h[0], v0.h[2]
8032; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v0.h[3]
8033; CHECK-GI-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
8034; CHECK-GI-NOFP16-NEXT:    sshll v1.4s, v1.4h, #0
8035; CHECK-GI-NOFP16-NEXT:    mov v0.d[1], v1.d[0]
8036; CHECK-GI-NOFP16-NEXT:    scvtf v0.4s, v0.4s
8037; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8038; CHECK-GI-NOFP16-NEXT:    ret
8039;
8040; CHECK-GI-FP16-LABEL: stofp_v3i8_v3f16:
8041; CHECK-GI-FP16:       // %bb.0: // %entry
8042; CHECK-GI-FP16-NEXT:    fmov s0, w0
8043; CHECK-GI-FP16-NEXT:    mov v0.b[1], w1
8044; CHECK-GI-FP16-NEXT:    mov v0.b[2], w2
8045; CHECK-GI-FP16-NEXT:    sshll v0.8h, v0.8b, #0
8046; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
8047; CHECK-GI-FP16-NEXT:    ret
8048entry:
8049  %c = sitofp <3 x i8> %a to <3 x half>
8050  ret <3 x half> %c
8051}
8052
8053define <3 x half> @utofp_v3i8_v3f16(<3 x i8> %a) {
8054; CHECK-SD-NOFP16-LABEL: utofp_v3i8_v3f16:
8055; CHECK-SD-NOFP16:       // %bb.0: // %entry
8056; CHECK-SD-NOFP16-NEXT:    fmov s0, w0
8057; CHECK-SD-NOFP16-NEXT:    mov v0.h[1], w1
8058; CHECK-SD-NOFP16-NEXT:    mov v0.h[2], w2
8059; CHECK-SD-NOFP16-NEXT:    bic v0.4h, #255, lsl #8
8060; CHECK-SD-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
8061; CHECK-SD-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
8062; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8063; CHECK-SD-NOFP16-NEXT:    ret
8064;
8065; CHECK-SD-FP16-LABEL: utofp_v3i8_v3f16:
8066; CHECK-SD-FP16:       // %bb.0: // %entry
8067; CHECK-SD-FP16-NEXT:    fmov s0, w0
8068; CHECK-SD-FP16-NEXT:    mov v0.h[1], w1
8069; CHECK-SD-FP16-NEXT:    mov v0.h[2], w2
8070; CHECK-SD-FP16-NEXT:    bic v0.4h, #255, lsl #8
8071; CHECK-SD-FP16-NEXT:    ucvtf v0.4h, v0.4h
8072; CHECK-SD-FP16-NEXT:    ret
8073;
8074; CHECK-GI-NOFP16-LABEL: utofp_v3i8_v3f16:
8075; CHECK-GI-NOFP16:       // %bb.0: // %entry
8076; CHECK-GI-NOFP16-NEXT:    fmov s0, w0
8077; CHECK-GI-NOFP16-NEXT:    movi d1, #0xff00ff00ff00ff
8078; CHECK-GI-NOFP16-NEXT:    mov v0.h[1], w1
8079; CHECK-GI-NOFP16-NEXT:    mov v0.h[2], w2
8080; CHECK-GI-NOFP16-NEXT:    and v0.8b, v0.8b, v1.8b
8081; CHECK-GI-NOFP16-NEXT:    mov v1.h[0], v0.h[2]
8082; CHECK-GI-NOFP16-NEXT:    mov v1.h[1], v0.h[3]
8083; CHECK-GI-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
8084; CHECK-GI-NOFP16-NEXT:    ushll v1.4s, v1.4h, #0
8085; CHECK-GI-NOFP16-NEXT:    mov v0.d[1], v1.d[0]
8086; CHECK-GI-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
8087; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8088; CHECK-GI-NOFP16-NEXT:    ret
8089;
8090; CHECK-GI-FP16-LABEL: utofp_v3i8_v3f16:
8091; CHECK-GI-FP16:       // %bb.0: // %entry
8092; CHECK-GI-FP16-NEXT:    fmov s0, w0
8093; CHECK-GI-FP16-NEXT:    mov v0.b[1], w1
8094; CHECK-GI-FP16-NEXT:    mov v0.b[2], w2
8095; CHECK-GI-FP16-NEXT:    ushll v0.8h, v0.8b, #0
8096; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
8097; CHECK-GI-FP16-NEXT:    ret
8098entry:
8099  %c = uitofp <3 x i8> %a to <3 x half>
8100  ret <3 x half> %c
8101}
8102
8103define <4 x half> @stofp_v4i8_v4f16(<4 x i8> %a) {
8104; CHECK-SD-NOFP16-LABEL: stofp_v4i8_v4f16:
8105; CHECK-SD-NOFP16:       // %bb.0: // %entry
8106; CHECK-SD-NOFP16-NEXT:    shl v0.4h, v0.4h, #8
8107; CHECK-SD-NOFP16-NEXT:    sshr v0.4h, v0.4h, #8
8108; CHECK-SD-NOFP16-NEXT:    sshll v0.4s, v0.4h, #0
8109; CHECK-SD-NOFP16-NEXT:    scvtf v0.4s, v0.4s
8110; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8111; CHECK-SD-NOFP16-NEXT:    ret
8112;
8113; CHECK-SD-FP16-LABEL: stofp_v4i8_v4f16:
8114; CHECK-SD-FP16:       // %bb.0: // %entry
8115; CHECK-SD-FP16-NEXT:    shl v0.4h, v0.4h, #8
8116; CHECK-SD-FP16-NEXT:    sshr v0.4h, v0.4h, #8
8117; CHECK-SD-FP16-NEXT:    scvtf v0.4h, v0.4h
8118; CHECK-SD-FP16-NEXT:    ret
8119;
8120; CHECK-GI-NOFP16-LABEL: stofp_v4i8_v4f16:
8121; CHECK-GI-NOFP16:       // %bb.0: // %entry
8122; CHECK-GI-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
8123; CHECK-GI-NOFP16-NEXT:    shl v0.4s, v0.4s, #24
8124; CHECK-GI-NOFP16-NEXT:    sshr v0.4s, v0.4s, #24
8125; CHECK-GI-NOFP16-NEXT:    scvtf v0.4s, v0.4s
8126; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8127; CHECK-GI-NOFP16-NEXT:    ret
8128;
8129; CHECK-GI-FP16-LABEL: stofp_v4i8_v4f16:
8130; CHECK-GI-FP16:       // %bb.0: // %entry
8131; CHECK-GI-FP16-NEXT:    shl v0.4h, v0.4h, #8
8132; CHECK-GI-FP16-NEXT:    sshr v0.4h, v0.4h, #8
8133; CHECK-GI-FP16-NEXT:    scvtf v0.4h, v0.4h
8134; CHECK-GI-FP16-NEXT:    ret
8135entry:
8136  %c = sitofp <4 x i8> %a to <4 x half>
8137  ret <4 x half> %c
8138}
8139
8140define <4 x half> @utofp_v4i8_v4f16(<4 x i8> %a) {
8141; CHECK-SD-NOFP16-LABEL: utofp_v4i8_v4f16:
8142; CHECK-SD-NOFP16:       // %bb.0: // %entry
8143; CHECK-SD-NOFP16-NEXT:    bic v0.4h, #255, lsl #8
8144; CHECK-SD-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
8145; CHECK-SD-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
8146; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8147; CHECK-SD-NOFP16-NEXT:    ret
8148;
8149; CHECK-SD-FP16-LABEL: utofp_v4i8_v4f16:
8150; CHECK-SD-FP16:       // %bb.0: // %entry
8151; CHECK-SD-FP16-NEXT:    bic v0.4h, #255, lsl #8
8152; CHECK-SD-FP16-NEXT:    ucvtf v0.4h, v0.4h
8153; CHECK-SD-FP16-NEXT:    ret
8154;
8155; CHECK-GI-NOFP16-LABEL: utofp_v4i8_v4f16:
8156; CHECK-GI-NOFP16:       // %bb.0: // %entry
8157; CHECK-GI-NOFP16-NEXT:    movi v1.2d, #0x0000ff000000ff
8158; CHECK-GI-NOFP16-NEXT:    ushll v0.4s, v0.4h, #0
8159; CHECK-GI-NOFP16-NEXT:    and v0.16b, v0.16b, v1.16b
8160; CHECK-GI-NOFP16-NEXT:    ucvtf v0.4s, v0.4s
8161; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v0.4s
8162; CHECK-GI-NOFP16-NEXT:    ret
8163;
8164; CHECK-GI-FP16-LABEL: utofp_v4i8_v4f16:
8165; CHECK-GI-FP16:       // %bb.0: // %entry
8166; CHECK-GI-FP16-NEXT:    movi d1, #0xff00ff00ff00ff
8167; CHECK-GI-FP16-NEXT:    and v0.8b, v0.8b, v1.8b
8168; CHECK-GI-FP16-NEXT:    ucvtf v0.4h, v0.4h
8169; CHECK-GI-FP16-NEXT:    ret
8170entry:
8171  %c = uitofp <4 x i8> %a to <4 x half>
8172  ret <4 x half> %c
8173}
8174
8175define <8 x half> @stofp_v8i8_v8f16(<8 x i8> %a) {
8176; CHECK-SD-NOFP16-LABEL: stofp_v8i8_v8f16:
8177; CHECK-SD-NOFP16:       // %bb.0: // %entry
8178; CHECK-SD-NOFP16-NEXT:    sshll v0.8h, v0.8b, #0
8179; CHECK-SD-NOFP16-NEXT:    sshll v1.4s, v0.4h, #0
8180; CHECK-SD-NOFP16-NEXT:    sshll2 v2.4s, v0.8h, #0
8181; CHECK-SD-NOFP16-NEXT:    scvtf v1.4s, v1.4s
8182; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
8183; CHECK-SD-NOFP16-NEXT:    scvtf v1.4s, v2.4s
8184; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
8185; CHECK-SD-NOFP16-NEXT:    ret
8186;
8187; CHECK-SD-FP16-LABEL: stofp_v8i8_v8f16:
8188; CHECK-SD-FP16:       // %bb.0: // %entry
8189; CHECK-SD-FP16-NEXT:    sshll v0.8h, v0.8b, #0
8190; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v0.8h
8191; CHECK-SD-FP16-NEXT:    ret
8192;
8193; CHECK-GI-NOFP16-LABEL: stofp_v8i8_v8f16:
8194; CHECK-GI-NOFP16:       // %bb.0: // %entry
8195; CHECK-GI-NOFP16-NEXT:    sshll v0.8h, v0.8b, #0
8196; CHECK-GI-NOFP16-NEXT:    sshll v1.4s, v0.4h, #0
8197; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
8198; CHECK-GI-NOFP16-NEXT:    scvtf v1.4s, v1.4s
8199; CHECK-GI-NOFP16-NEXT:    scvtf v2.4s, v0.4s
8200; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
8201; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
8202; CHECK-GI-NOFP16-NEXT:    ret
8203;
8204; CHECK-GI-FP16-LABEL: stofp_v8i8_v8f16:
8205; CHECK-GI-FP16:       // %bb.0: // %entry
8206; CHECK-GI-FP16-NEXT:    sshll v0.8h, v0.8b, #0
8207; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v0.8h
8208; CHECK-GI-FP16-NEXT:    ret
8209entry:
8210  %c = sitofp <8 x i8> %a to <8 x half>
8211  ret <8 x half> %c
8212}
8213
8214define <8 x half> @utofp_v8i8_v8f16(<8 x i8> %a) {
8215; CHECK-SD-NOFP16-LABEL: utofp_v8i8_v8f16:
8216; CHECK-SD-NOFP16:       // %bb.0: // %entry
8217; CHECK-SD-NOFP16-NEXT:    ushll v0.8h, v0.8b, #0
8218; CHECK-SD-NOFP16-NEXT:    ushll v1.4s, v0.4h, #0
8219; CHECK-SD-NOFP16-NEXT:    ushll2 v2.4s, v0.8h, #0
8220; CHECK-SD-NOFP16-NEXT:    ucvtf v1.4s, v1.4s
8221; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
8222; CHECK-SD-NOFP16-NEXT:    ucvtf v1.4s, v2.4s
8223; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v1.4s
8224; CHECK-SD-NOFP16-NEXT:    ret
8225;
8226; CHECK-SD-FP16-LABEL: utofp_v8i8_v8f16:
8227; CHECK-SD-FP16:       // %bb.0: // %entry
8228; CHECK-SD-FP16-NEXT:    ushll v0.8h, v0.8b, #0
8229; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v0.8h
8230; CHECK-SD-FP16-NEXT:    ret
8231;
8232; CHECK-GI-NOFP16-LABEL: utofp_v8i8_v8f16:
8233; CHECK-GI-NOFP16:       // %bb.0: // %entry
8234; CHECK-GI-NOFP16-NEXT:    ushll v0.8h, v0.8b, #0
8235; CHECK-GI-NOFP16-NEXT:    ushll v1.4s, v0.4h, #0
8236; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
8237; CHECK-GI-NOFP16-NEXT:    ucvtf v1.4s, v1.4s
8238; CHECK-GI-NOFP16-NEXT:    ucvtf v2.4s, v0.4s
8239; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v1.4s
8240; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v2.4s
8241; CHECK-GI-NOFP16-NEXT:    ret
8242;
8243; CHECK-GI-FP16-LABEL: utofp_v8i8_v8f16:
8244; CHECK-GI-FP16:       // %bb.0: // %entry
8245; CHECK-GI-FP16-NEXT:    ushll v0.8h, v0.8b, #0
8246; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v0.8h
8247; CHECK-GI-FP16-NEXT:    ret
8248entry:
8249  %c = uitofp <8 x i8> %a to <8 x half>
8250  ret <8 x half> %c
8251}
8252
8253define <16 x half> @stofp_v16i8_v16f16(<16 x i8> %a) {
8254; CHECK-SD-NOFP16-LABEL: stofp_v16i8_v16f16:
8255; CHECK-SD-NOFP16:       // %bb.0: // %entry
8256; CHECK-SD-NOFP16-NEXT:    sshll2 v1.8h, v0.16b, #0
8257; CHECK-SD-NOFP16-NEXT:    sshll v0.8h, v0.8b, #0
8258; CHECK-SD-NOFP16-NEXT:    sshll v2.4s, v1.4h, #0
8259; CHECK-SD-NOFP16-NEXT:    sshll v3.4s, v0.4h, #0
8260; CHECK-SD-NOFP16-NEXT:    sshll2 v4.4s, v1.8h, #0
8261; CHECK-SD-NOFP16-NEXT:    sshll2 v5.4s, v0.8h, #0
8262; CHECK-SD-NOFP16-NEXT:    scvtf v2.4s, v2.4s
8263; CHECK-SD-NOFP16-NEXT:    scvtf v3.4s, v3.4s
8264; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v2.4s
8265; CHECK-SD-NOFP16-NEXT:    scvtf v2.4s, v4.4s
8266; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v3.4s
8267; CHECK-SD-NOFP16-NEXT:    scvtf v3.4s, v5.4s
8268; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v2.4s
8269; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v3.4s
8270; CHECK-SD-NOFP16-NEXT:    ret
8271;
8272; CHECK-SD-FP16-LABEL: stofp_v16i8_v16f16:
8273; CHECK-SD-FP16:       // %bb.0: // %entry
8274; CHECK-SD-FP16-NEXT:    sshll2 v1.8h, v0.16b, #0
8275; CHECK-SD-FP16-NEXT:    sshll v0.8h, v0.8b, #0
8276; CHECK-SD-FP16-NEXT:    scvtf v1.8h, v1.8h
8277; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v0.8h
8278; CHECK-SD-FP16-NEXT:    ret
8279;
8280; CHECK-GI-NOFP16-LABEL: stofp_v16i8_v16f16:
8281; CHECK-GI-NOFP16:       // %bb.0: // %entry
8282; CHECK-GI-NOFP16-NEXT:    sshll v1.8h, v0.8b, #0
8283; CHECK-GI-NOFP16-NEXT:    sshll2 v0.8h, v0.16b, #0
8284; CHECK-GI-NOFP16-NEXT:    sshll v2.4s, v1.4h, #0
8285; CHECK-GI-NOFP16-NEXT:    sshll v3.4s, v0.4h, #0
8286; CHECK-GI-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
8287; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
8288; CHECK-GI-NOFP16-NEXT:    scvtf v2.4s, v2.4s
8289; CHECK-GI-NOFP16-NEXT:    scvtf v3.4s, v3.4s
8290; CHECK-GI-NOFP16-NEXT:    scvtf v4.4s, v1.4s
8291; CHECK-GI-NOFP16-NEXT:    scvtf v5.4s, v0.4s
8292; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
8293; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
8294; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
8295; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
8296; CHECK-GI-NOFP16-NEXT:    ret
8297;
8298; CHECK-GI-FP16-LABEL: stofp_v16i8_v16f16:
8299; CHECK-GI-FP16:       // %bb.0: // %entry
8300; CHECK-GI-FP16-NEXT:    sshll v1.8h, v0.8b, #0
8301; CHECK-GI-FP16-NEXT:    sshll2 v2.8h, v0.16b, #0
8302; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v1.8h
8303; CHECK-GI-FP16-NEXT:    scvtf v1.8h, v2.8h
8304; CHECK-GI-FP16-NEXT:    ret
8305entry:
8306  %c = sitofp <16 x i8> %a to <16 x half>
8307  ret <16 x half> %c
8308}
8309
8310define <16 x half> @utofp_v16i8_v16f16(<16 x i8> %a) {
8311; CHECK-SD-NOFP16-LABEL: utofp_v16i8_v16f16:
8312; CHECK-SD-NOFP16:       // %bb.0: // %entry
8313; CHECK-SD-NOFP16-NEXT:    ushll2 v1.8h, v0.16b, #0
8314; CHECK-SD-NOFP16-NEXT:    ushll v0.8h, v0.8b, #0
8315; CHECK-SD-NOFP16-NEXT:    ushll v2.4s, v1.4h, #0
8316; CHECK-SD-NOFP16-NEXT:    ushll v3.4s, v0.4h, #0
8317; CHECK-SD-NOFP16-NEXT:    ushll2 v4.4s, v1.8h, #0
8318; CHECK-SD-NOFP16-NEXT:    ushll2 v5.4s, v0.8h, #0
8319; CHECK-SD-NOFP16-NEXT:    ucvtf v2.4s, v2.4s
8320; CHECK-SD-NOFP16-NEXT:    ucvtf v3.4s, v3.4s
8321; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v2.4s
8322; CHECK-SD-NOFP16-NEXT:    ucvtf v2.4s, v4.4s
8323; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v3.4s
8324; CHECK-SD-NOFP16-NEXT:    ucvtf v3.4s, v5.4s
8325; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v2.4s
8326; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v3.4s
8327; CHECK-SD-NOFP16-NEXT:    ret
8328;
8329; CHECK-SD-FP16-LABEL: utofp_v16i8_v16f16:
8330; CHECK-SD-FP16:       // %bb.0: // %entry
8331; CHECK-SD-FP16-NEXT:    ushll2 v1.8h, v0.16b, #0
8332; CHECK-SD-FP16-NEXT:    ushll v0.8h, v0.8b, #0
8333; CHECK-SD-FP16-NEXT:    ucvtf v1.8h, v1.8h
8334; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v0.8h
8335; CHECK-SD-FP16-NEXT:    ret
8336;
8337; CHECK-GI-NOFP16-LABEL: utofp_v16i8_v16f16:
8338; CHECK-GI-NOFP16:       // %bb.0: // %entry
8339; CHECK-GI-NOFP16-NEXT:    ushll v1.8h, v0.8b, #0
8340; CHECK-GI-NOFP16-NEXT:    ushll2 v0.8h, v0.16b, #0
8341; CHECK-GI-NOFP16-NEXT:    ushll v2.4s, v1.4h, #0
8342; CHECK-GI-NOFP16-NEXT:    ushll v3.4s, v0.4h, #0
8343; CHECK-GI-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
8344; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
8345; CHECK-GI-NOFP16-NEXT:    ucvtf v2.4s, v2.4s
8346; CHECK-GI-NOFP16-NEXT:    ucvtf v3.4s, v3.4s
8347; CHECK-GI-NOFP16-NEXT:    ucvtf v4.4s, v1.4s
8348; CHECK-GI-NOFP16-NEXT:    ucvtf v5.4s, v0.4s
8349; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v2.4s
8350; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v3.4s
8351; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v4.4s
8352; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v5.4s
8353; CHECK-GI-NOFP16-NEXT:    ret
8354;
8355; CHECK-GI-FP16-LABEL: utofp_v16i8_v16f16:
8356; CHECK-GI-FP16:       // %bb.0: // %entry
8357; CHECK-GI-FP16-NEXT:    ushll v1.8h, v0.8b, #0
8358; CHECK-GI-FP16-NEXT:    ushll2 v2.8h, v0.16b, #0
8359; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v1.8h
8360; CHECK-GI-FP16-NEXT:    ucvtf v1.8h, v2.8h
8361; CHECK-GI-FP16-NEXT:    ret
8362entry:
8363  %c = uitofp <16 x i8> %a to <16 x half>
8364  ret <16 x half> %c
8365}
8366
8367define <32 x half> @stofp_v32i8_v32f16(<32 x i8> %a) {
8368; CHECK-SD-NOFP16-LABEL: stofp_v32i8_v32f16:
8369; CHECK-SD-NOFP16:       // %bb.0: // %entry
8370; CHECK-SD-NOFP16-NEXT:    sshll v2.8h, v0.8b, #0
8371; CHECK-SD-NOFP16-NEXT:    sshll2 v0.8h, v0.16b, #0
8372; CHECK-SD-NOFP16-NEXT:    sshll2 v3.8h, v1.16b, #0
8373; CHECK-SD-NOFP16-NEXT:    sshll v1.8h, v1.8b, #0
8374; CHECK-SD-NOFP16-NEXT:    sshll v4.4s, v2.4h, #0
8375; CHECK-SD-NOFP16-NEXT:    sshll v5.4s, v0.4h, #0
8376; CHECK-SD-NOFP16-NEXT:    sshll v6.4s, v3.4h, #0
8377; CHECK-SD-NOFP16-NEXT:    sshll v7.4s, v1.4h, #0
8378; CHECK-SD-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
8379; CHECK-SD-NOFP16-NEXT:    sshll2 v3.4s, v3.8h, #0
8380; CHECK-SD-NOFP16-NEXT:    sshll2 v2.4s, v2.8h, #0
8381; CHECK-SD-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
8382; CHECK-SD-NOFP16-NEXT:    scvtf v4.4s, v4.4s
8383; CHECK-SD-NOFP16-NEXT:    scvtf v5.4s, v5.4s
8384; CHECK-SD-NOFP16-NEXT:    scvtf v6.4s, v6.4s
8385; CHECK-SD-NOFP16-NEXT:    scvtf v7.4s, v7.4s
8386; CHECK-SD-NOFP16-NEXT:    scvtf v16.4s, v0.4s
8387; CHECK-SD-NOFP16-NEXT:    scvtf v17.4s, v3.4s
8388; CHECK-SD-NOFP16-NEXT:    scvtf v18.4s, v2.4s
8389; CHECK-SD-NOFP16-NEXT:    scvtf v19.4s, v1.4s
8390; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
8391; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
8392; CHECK-SD-NOFP16-NEXT:    fcvtn v3.4h, v6.4s
8393; CHECK-SD-NOFP16-NEXT:    fcvtn v2.4h, v7.4s
8394; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v18.4s
8395; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v16.4s
8396; CHECK-SD-NOFP16-NEXT:    fcvtn2 v3.8h, v17.4s
8397; CHECK-SD-NOFP16-NEXT:    fcvtn2 v2.8h, v19.4s
8398; CHECK-SD-NOFP16-NEXT:    ret
8399;
8400; CHECK-SD-FP16-LABEL: stofp_v32i8_v32f16:
8401; CHECK-SD-FP16:       // %bb.0: // %entry
8402; CHECK-SD-FP16-NEXT:    sshll v2.8h, v0.8b, #0
8403; CHECK-SD-FP16-NEXT:    sshll2 v3.8h, v0.16b, #0
8404; CHECK-SD-FP16-NEXT:    sshll2 v4.8h, v1.16b, #0
8405; CHECK-SD-FP16-NEXT:    sshll v5.8h, v1.8b, #0
8406; CHECK-SD-FP16-NEXT:    scvtf v0.8h, v2.8h
8407; CHECK-SD-FP16-NEXT:    scvtf v1.8h, v3.8h
8408; CHECK-SD-FP16-NEXT:    scvtf v3.8h, v4.8h
8409; CHECK-SD-FP16-NEXT:    scvtf v2.8h, v5.8h
8410; CHECK-SD-FP16-NEXT:    ret
8411;
8412; CHECK-GI-NOFP16-LABEL: stofp_v32i8_v32f16:
8413; CHECK-GI-NOFP16:       // %bb.0: // %entry
8414; CHECK-GI-NOFP16-NEXT:    sshll v2.8h, v0.8b, #0
8415; CHECK-GI-NOFP16-NEXT:    sshll2 v0.8h, v0.16b, #0
8416; CHECK-GI-NOFP16-NEXT:    sshll v3.8h, v1.8b, #0
8417; CHECK-GI-NOFP16-NEXT:    sshll2 v1.8h, v1.16b, #0
8418; CHECK-GI-NOFP16-NEXT:    sshll v4.4s, v2.4h, #0
8419; CHECK-GI-NOFP16-NEXT:    sshll v5.4s, v0.4h, #0
8420; CHECK-GI-NOFP16-NEXT:    sshll v6.4s, v3.4h, #0
8421; CHECK-GI-NOFP16-NEXT:    sshll v7.4s, v1.4h, #0
8422; CHECK-GI-NOFP16-NEXT:    sshll2 v2.4s, v2.8h, #0
8423; CHECK-GI-NOFP16-NEXT:    sshll2 v0.4s, v0.8h, #0
8424; CHECK-GI-NOFP16-NEXT:    sshll2 v3.4s, v3.8h, #0
8425; CHECK-GI-NOFP16-NEXT:    sshll2 v1.4s, v1.8h, #0
8426; CHECK-GI-NOFP16-NEXT:    scvtf v4.4s, v4.4s
8427; CHECK-GI-NOFP16-NEXT:    scvtf v5.4s, v5.4s
8428; CHECK-GI-NOFP16-NEXT:    scvtf v6.4s, v6.4s
8429; CHECK-GI-NOFP16-NEXT:    scvtf v7.4s, v7.4s
8430; CHECK-GI-NOFP16-NEXT:    scvtf v16.4s, v2.4s
8431; CHECK-GI-NOFP16-NEXT:    scvtf v17.4s, v0.4s
8432; CHECK-GI-NOFP16-NEXT:    scvtf v18.4s, v3.4s
8433; CHECK-GI-NOFP16-NEXT:    scvtf v19.4s, v1.4s
8434; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
8435; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
8436; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
8437; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
8438; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
8439; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
8440; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
8441; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
8442; CHECK-GI-NOFP16-NEXT:    ret
8443;
8444; CHECK-GI-FP16-LABEL: stofp_v32i8_v32f16:
8445; CHECK-GI-FP16:       // %bb.0: // %entry
8446; CHECK-GI-FP16-NEXT:    sshll v2.8h, v0.8b, #0
8447; CHECK-GI-FP16-NEXT:    sshll2 v3.8h, v0.16b, #0
8448; CHECK-GI-FP16-NEXT:    sshll v4.8h, v1.8b, #0
8449; CHECK-GI-FP16-NEXT:    sshll2 v5.8h, v1.16b, #0
8450; CHECK-GI-FP16-NEXT:    scvtf v0.8h, v2.8h
8451; CHECK-GI-FP16-NEXT:    scvtf v1.8h, v3.8h
8452; CHECK-GI-FP16-NEXT:    scvtf v2.8h, v4.8h
8453; CHECK-GI-FP16-NEXT:    scvtf v3.8h, v5.8h
8454; CHECK-GI-FP16-NEXT:    ret
8455entry:
8456  %c = sitofp <32 x i8> %a to <32 x half>
8457  ret <32 x half> %c
8458}
8459
8460define <32 x half> @utofp_v32i8_v32f16(<32 x i8> %a) {
8461; CHECK-SD-NOFP16-LABEL: utofp_v32i8_v32f16:
8462; CHECK-SD-NOFP16:       // %bb.0: // %entry
8463; CHECK-SD-NOFP16-NEXT:    ushll v2.8h, v0.8b, #0
8464; CHECK-SD-NOFP16-NEXT:    ushll2 v0.8h, v0.16b, #0
8465; CHECK-SD-NOFP16-NEXT:    ushll2 v3.8h, v1.16b, #0
8466; CHECK-SD-NOFP16-NEXT:    ushll v1.8h, v1.8b, #0
8467; CHECK-SD-NOFP16-NEXT:    ushll v4.4s, v2.4h, #0
8468; CHECK-SD-NOFP16-NEXT:    ushll v5.4s, v0.4h, #0
8469; CHECK-SD-NOFP16-NEXT:    ushll v6.4s, v3.4h, #0
8470; CHECK-SD-NOFP16-NEXT:    ushll v7.4s, v1.4h, #0
8471; CHECK-SD-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
8472; CHECK-SD-NOFP16-NEXT:    ushll2 v3.4s, v3.8h, #0
8473; CHECK-SD-NOFP16-NEXT:    ushll2 v2.4s, v2.8h, #0
8474; CHECK-SD-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
8475; CHECK-SD-NOFP16-NEXT:    ucvtf v4.4s, v4.4s
8476; CHECK-SD-NOFP16-NEXT:    ucvtf v5.4s, v5.4s
8477; CHECK-SD-NOFP16-NEXT:    ucvtf v6.4s, v6.4s
8478; CHECK-SD-NOFP16-NEXT:    ucvtf v7.4s, v7.4s
8479; CHECK-SD-NOFP16-NEXT:    ucvtf v16.4s, v0.4s
8480; CHECK-SD-NOFP16-NEXT:    ucvtf v17.4s, v3.4s
8481; CHECK-SD-NOFP16-NEXT:    ucvtf v18.4s, v2.4s
8482; CHECK-SD-NOFP16-NEXT:    ucvtf v19.4s, v1.4s
8483; CHECK-SD-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
8484; CHECK-SD-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
8485; CHECK-SD-NOFP16-NEXT:    fcvtn v3.4h, v6.4s
8486; CHECK-SD-NOFP16-NEXT:    fcvtn v2.4h, v7.4s
8487; CHECK-SD-NOFP16-NEXT:    fcvtn2 v0.8h, v18.4s
8488; CHECK-SD-NOFP16-NEXT:    fcvtn2 v1.8h, v16.4s
8489; CHECK-SD-NOFP16-NEXT:    fcvtn2 v3.8h, v17.4s
8490; CHECK-SD-NOFP16-NEXT:    fcvtn2 v2.8h, v19.4s
8491; CHECK-SD-NOFP16-NEXT:    ret
8492;
8493; CHECK-SD-FP16-LABEL: utofp_v32i8_v32f16:
8494; CHECK-SD-FP16:       // %bb.0: // %entry
8495; CHECK-SD-FP16-NEXT:    ushll v2.8h, v0.8b, #0
8496; CHECK-SD-FP16-NEXT:    ushll2 v3.8h, v0.16b, #0
8497; CHECK-SD-FP16-NEXT:    ushll2 v4.8h, v1.16b, #0
8498; CHECK-SD-FP16-NEXT:    ushll v5.8h, v1.8b, #0
8499; CHECK-SD-FP16-NEXT:    ucvtf v0.8h, v2.8h
8500; CHECK-SD-FP16-NEXT:    ucvtf v1.8h, v3.8h
8501; CHECK-SD-FP16-NEXT:    ucvtf v3.8h, v4.8h
8502; CHECK-SD-FP16-NEXT:    ucvtf v2.8h, v5.8h
8503; CHECK-SD-FP16-NEXT:    ret
8504;
8505; CHECK-GI-NOFP16-LABEL: utofp_v32i8_v32f16:
8506; CHECK-GI-NOFP16:       // %bb.0: // %entry
8507; CHECK-GI-NOFP16-NEXT:    ushll v2.8h, v0.8b, #0
8508; CHECK-GI-NOFP16-NEXT:    ushll2 v0.8h, v0.16b, #0
8509; CHECK-GI-NOFP16-NEXT:    ushll v3.8h, v1.8b, #0
8510; CHECK-GI-NOFP16-NEXT:    ushll2 v1.8h, v1.16b, #0
8511; CHECK-GI-NOFP16-NEXT:    ushll v4.4s, v2.4h, #0
8512; CHECK-GI-NOFP16-NEXT:    ushll v5.4s, v0.4h, #0
8513; CHECK-GI-NOFP16-NEXT:    ushll v6.4s, v3.4h, #0
8514; CHECK-GI-NOFP16-NEXT:    ushll v7.4s, v1.4h, #0
8515; CHECK-GI-NOFP16-NEXT:    ushll2 v2.4s, v2.8h, #0
8516; CHECK-GI-NOFP16-NEXT:    ushll2 v0.4s, v0.8h, #0
8517; CHECK-GI-NOFP16-NEXT:    ushll2 v3.4s, v3.8h, #0
8518; CHECK-GI-NOFP16-NEXT:    ushll2 v1.4s, v1.8h, #0
8519; CHECK-GI-NOFP16-NEXT:    ucvtf v4.4s, v4.4s
8520; CHECK-GI-NOFP16-NEXT:    ucvtf v5.4s, v5.4s
8521; CHECK-GI-NOFP16-NEXT:    ucvtf v6.4s, v6.4s
8522; CHECK-GI-NOFP16-NEXT:    ucvtf v7.4s, v7.4s
8523; CHECK-GI-NOFP16-NEXT:    ucvtf v16.4s, v2.4s
8524; CHECK-GI-NOFP16-NEXT:    ucvtf v17.4s, v0.4s
8525; CHECK-GI-NOFP16-NEXT:    ucvtf v18.4s, v3.4s
8526; CHECK-GI-NOFP16-NEXT:    ucvtf v19.4s, v1.4s
8527; CHECK-GI-NOFP16-NEXT:    fcvtn v0.4h, v4.4s
8528; CHECK-GI-NOFP16-NEXT:    fcvtn v1.4h, v5.4s
8529; CHECK-GI-NOFP16-NEXT:    fcvtn v2.4h, v6.4s
8530; CHECK-GI-NOFP16-NEXT:    fcvtn v3.4h, v7.4s
8531; CHECK-GI-NOFP16-NEXT:    fcvtn2 v0.8h, v16.4s
8532; CHECK-GI-NOFP16-NEXT:    fcvtn2 v1.8h, v17.4s
8533; CHECK-GI-NOFP16-NEXT:    fcvtn2 v2.8h, v18.4s
8534; CHECK-GI-NOFP16-NEXT:    fcvtn2 v3.8h, v19.4s
8535; CHECK-GI-NOFP16-NEXT:    ret
8536;
8537; CHECK-GI-FP16-LABEL: utofp_v32i8_v32f16:
8538; CHECK-GI-FP16:       // %bb.0: // %entry
8539; CHECK-GI-FP16-NEXT:    ushll v2.8h, v0.8b, #0
8540; CHECK-GI-FP16-NEXT:    ushll2 v3.8h, v0.16b, #0
8541; CHECK-GI-FP16-NEXT:    ushll v4.8h, v1.8b, #0
8542; CHECK-GI-FP16-NEXT:    ushll2 v5.8h, v1.16b, #0
8543; CHECK-GI-FP16-NEXT:    ucvtf v0.8h, v2.8h
8544; CHECK-GI-FP16-NEXT:    ucvtf v1.8h, v3.8h
8545; CHECK-GI-FP16-NEXT:    ucvtf v2.8h, v4.8h
8546; CHECK-GI-FP16-NEXT:    ucvtf v3.8h, v5.8h
8547; CHECK-GI-FP16-NEXT:    ret
8548entry:
8549  %c = uitofp <32 x i8> %a to <32 x half>
8550  ret <32 x half> %c
8551}
8552