xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-int-to-fp.ll (revision ca98a3d9bbc254cbb7f028866a7d2077b7994ee8)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s
3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
4
5target triple = "aarch64-unknown-linux-gnu"
6
7;
8; UCVTF H -> H
9;
10
11define <4 x half> @ucvtf_v4i16_v4f16(<4 x i16> %op1) {
12; CHECK-LABEL: ucvtf_v4i16_v4f16:
13; CHECK:       // %bb.0:
14; CHECK-NEXT:    ptrue p0.h, vl4
15; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.h
17; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
18; CHECK-NEXT:    ret
19;
20; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f16:
21; NONEON-NOSVE:       // %bb.0:
22; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
23; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
24; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
25; NONEON-NOSVE-NEXT:    ucvtf s0, w8
26; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
27; NONEON-NOSVE-NEXT:    fcvt h0, s0
28; NONEON-NOSVE-NEXT:    str h0, [sp, #14]
29; NONEON-NOSVE-NEXT:    ucvtf s0, w8
30; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
31; NONEON-NOSVE-NEXT:    fcvt h0, s0
32; NONEON-NOSVE-NEXT:    str h0, [sp, #12]
33; NONEON-NOSVE-NEXT:    ucvtf s0, w8
34; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
35; NONEON-NOSVE-NEXT:    fcvt h0, s0
36; NONEON-NOSVE-NEXT:    str h0, [sp, #10]
37; NONEON-NOSVE-NEXT:    ucvtf s0, w8
38; NONEON-NOSVE-NEXT:    fcvt h0, s0
39; NONEON-NOSVE-NEXT:    str h0, [sp, #8]
40; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
41; NONEON-NOSVE-NEXT:    add sp, sp, #16
42; NONEON-NOSVE-NEXT:    ret
43  %res = uitofp <4 x i16> %op1 to <4 x half>
44  ret <4 x half> %res
45}
46
47define void @ucvtf_v8i16_v8f16(ptr %a, ptr %b) {
48; CHECK-LABEL: ucvtf_v8i16_v8f16:
49; CHECK:       // %bb.0:
50; CHECK-NEXT:    ptrue p0.h, vl8
51; CHECK-NEXT:    ldr q0, [x0]
52; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.h
53; CHECK-NEXT:    str q0, [x1]
54; CHECK-NEXT:    ret
55;
56; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f16:
57; NONEON-NOSVE:       // %bb.0:
58; NONEON-NOSVE-NEXT:    ldr q0, [x0]
59; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
60; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
61; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
62; NONEON-NOSVE-NEXT:    ucvtf s0, w8
63; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
64; NONEON-NOSVE-NEXT:    fcvt h0, s0
65; NONEON-NOSVE-NEXT:    str h0, [sp, #30]
66; NONEON-NOSVE-NEXT:    ucvtf s0, w8
67; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
68; NONEON-NOSVE-NEXT:    fcvt h0, s0
69; NONEON-NOSVE-NEXT:    str h0, [sp, #28]
70; NONEON-NOSVE-NEXT:    ucvtf s0, w8
71; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
72; NONEON-NOSVE-NEXT:    fcvt h0, s0
73; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
74; NONEON-NOSVE-NEXT:    ucvtf s0, w8
75; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
76; NONEON-NOSVE-NEXT:    fcvt h0, s0
77; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
78; NONEON-NOSVE-NEXT:    ucvtf s0, w8
79; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
80; NONEON-NOSVE-NEXT:    fcvt h0, s0
81; NONEON-NOSVE-NEXT:    str h0, [sp, #22]
82; NONEON-NOSVE-NEXT:    ucvtf s0, w8
83; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
84; NONEON-NOSVE-NEXT:    fcvt h0, s0
85; NONEON-NOSVE-NEXT:    str h0, [sp, #20]
86; NONEON-NOSVE-NEXT:    ucvtf s0, w8
87; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
88; NONEON-NOSVE-NEXT:    fcvt h0, s0
89; NONEON-NOSVE-NEXT:    str h0, [sp, #18]
90; NONEON-NOSVE-NEXT:    ucvtf s0, w8
91; NONEON-NOSVE-NEXT:    fcvt h0, s0
92; NONEON-NOSVE-NEXT:    str h0, [sp, #16]
93; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
94; NONEON-NOSVE-NEXT:    str q0, [x1]
95; NONEON-NOSVE-NEXT:    add sp, sp, #32
96; NONEON-NOSVE-NEXT:    ret
97  %op1 = load <8 x i16>, ptr %a
98  %res = uitofp <8 x i16> %op1 to <8 x half>
99  store <8 x half> %res, ptr %b
100  ret void
101}
102
103define void @ucvtf_v16i16_v16f16(ptr %a, ptr %b) {
104; CHECK-LABEL: ucvtf_v16i16_v16f16:
105; CHECK:       // %bb.0:
106; CHECK-NEXT:    ldp q0, q1, [x0]
107; CHECK-NEXT:    ptrue p0.h, vl8
108; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.h
109; CHECK-NEXT:    ucvtf z1.h, p0/m, z1.h
110; CHECK-NEXT:    stp q0, q1, [x1]
111; CHECK-NEXT:    ret
112;
113; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f16:
114; NONEON-NOSVE:       // %bb.0:
115; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
116; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
117; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
118; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
119; NONEON-NOSVE-NEXT:    ucvtf s0, w8
120; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
121; NONEON-NOSVE-NEXT:    fcvt h0, s0
122; NONEON-NOSVE-NEXT:    str h0, [sp, #62]
123; NONEON-NOSVE-NEXT:    ucvtf s0, w8
124; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
125; NONEON-NOSVE-NEXT:    fcvt h0, s0
126; NONEON-NOSVE-NEXT:    str h0, [sp, #60]
127; NONEON-NOSVE-NEXT:    ucvtf s0, w8
128; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
129; NONEON-NOSVE-NEXT:    fcvt h0, s0
130; NONEON-NOSVE-NEXT:    str h0, [sp, #58]
131; NONEON-NOSVE-NEXT:    ucvtf s0, w8
132; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
133; NONEON-NOSVE-NEXT:    fcvt h0, s0
134; NONEON-NOSVE-NEXT:    str h0, [sp, #56]
135; NONEON-NOSVE-NEXT:    ucvtf s0, w8
136; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
137; NONEON-NOSVE-NEXT:    fcvt h0, s0
138; NONEON-NOSVE-NEXT:    str h0, [sp, #54]
139; NONEON-NOSVE-NEXT:    ucvtf s0, w8
140; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
141; NONEON-NOSVE-NEXT:    fcvt h0, s0
142; NONEON-NOSVE-NEXT:    str h0, [sp, #52]
143; NONEON-NOSVE-NEXT:    ucvtf s0, w8
144; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
145; NONEON-NOSVE-NEXT:    fcvt h0, s0
146; NONEON-NOSVE-NEXT:    str h0, [sp, #50]
147; NONEON-NOSVE-NEXT:    ucvtf s0, w8
148; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
149; NONEON-NOSVE-NEXT:    fcvt h0, s0
150; NONEON-NOSVE-NEXT:    str h0, [sp, #48]
151; NONEON-NOSVE-NEXT:    ucvtf s0, w8
152; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
153; NONEON-NOSVE-NEXT:    fcvt h0, s0
154; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
155; NONEON-NOSVE-NEXT:    ucvtf s0, w8
156; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
157; NONEON-NOSVE-NEXT:    fcvt h0, s0
158; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
159; NONEON-NOSVE-NEXT:    ucvtf s0, w8
160; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
161; NONEON-NOSVE-NEXT:    fcvt h0, s0
162; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
163; NONEON-NOSVE-NEXT:    ucvtf s0, w8
164; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #6]
165; NONEON-NOSVE-NEXT:    fcvt h0, s0
166; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
167; NONEON-NOSVE-NEXT:    ucvtf s0, w8
168; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
169; NONEON-NOSVE-NEXT:    fcvt h0, s0
170; NONEON-NOSVE-NEXT:    str h0, [sp, #38]
171; NONEON-NOSVE-NEXT:    ucvtf s0, w8
172; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #2]
173; NONEON-NOSVE-NEXT:    fcvt h0, s0
174; NONEON-NOSVE-NEXT:    str h0, [sp, #36]
175; NONEON-NOSVE-NEXT:    ucvtf s0, w8
176; NONEON-NOSVE-NEXT:    ldrh w8, [sp]
177; NONEON-NOSVE-NEXT:    fcvt h0, s0
178; NONEON-NOSVE-NEXT:    str h0, [sp, #34]
179; NONEON-NOSVE-NEXT:    ucvtf s0, w8
180; NONEON-NOSVE-NEXT:    fcvt h0, s0
181; NONEON-NOSVE-NEXT:    str h0, [sp, #32]
182; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
183; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
184; NONEON-NOSVE-NEXT:    add sp, sp, #64
185; NONEON-NOSVE-NEXT:    ret
186  %op1 = load <16 x i16>, ptr %a
187  %res = uitofp <16 x i16> %op1 to <16 x half>
188  store <16 x half> %res, ptr %b
189  ret void
190}
191
192;
193; UCVTF H -> S
194;
195
196define <2 x float> @ucvtf_v2i16_v2f32(<2 x i16> %op1) {
197; CHECK-LABEL: ucvtf_v2i16_v2f32:
198; CHECK:       // %bb.0:
199; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
200; CHECK-NEXT:    ptrue p0.s, vl2
201; CHECK-NEXT:    and z0.s, z0.s, #0xffff
202; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
203; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
204; CHECK-NEXT:    ret
205;
206; NONEON-NOSVE-LABEL: ucvtf_v2i16_v2f32:
207; NONEON-NOSVE:       // %bb.0:
208; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
209; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
210; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
211; NONEON-NOSVE-NEXT:    ldrh w9, [sp]
212; NONEON-NOSVE-NEXT:    ucvtf s0, w8
213; NONEON-NOSVE-NEXT:    ucvtf s1, w9
214; NONEON-NOSVE-NEXT:    stp s1, s0, [sp, #8]
215; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
216; NONEON-NOSVE-NEXT:    add sp, sp, #16
217; NONEON-NOSVE-NEXT:    ret
218  %res = uitofp <2 x i16> %op1 to <2 x float>
219  ret <2 x float> %res
220}
221
222define <4 x float> @ucvtf_v4i16_v4f32(<4 x i16> %op1) {
223; CHECK-LABEL: ucvtf_v4i16_v4f32:
224; CHECK:       // %bb.0:
225; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
226; CHECK-NEXT:    ptrue p0.s, vl4
227; CHECK-NEXT:    uunpklo z0.s, z0.h
228; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
229; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
230; CHECK-NEXT:    ret
231;
232; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f32:
233; NONEON-NOSVE:       // %bb.0:
234; NONEON-NOSVE-NEXT:    sub sp, sp, #32
235; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
236; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
237; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #14]
238; NONEON-NOSVE-NEXT:    ucvtf s1, w8
239; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
240; NONEON-NOSVE-NEXT:    ucvtf s0, w8
241; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #10]
242; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
243; NONEON-NOSVE-NEXT:    ucvtf s1, w8
244; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
245; NONEON-NOSVE-NEXT:    ucvtf s0, w8
246; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
247; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
248; NONEON-NOSVE-NEXT:    add sp, sp, #32
249; NONEON-NOSVE-NEXT:    ret
250  %res = uitofp <4 x i16> %op1 to <4 x float>
251  ret <4 x float> %res
252}
253
254define void @ucvtf_v8i16_v8f32(ptr %a, ptr %b) {
255; CHECK-LABEL: ucvtf_v8i16_v8f32:
256; CHECK:       // %bb.0:
257; CHECK-NEXT:    ldr q0, [x0]
258; CHECK-NEXT:    ptrue p0.s, vl4
259; CHECK-NEXT:    uunpklo z1.s, z0.h
260; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
261; CHECK-NEXT:    uunpklo z0.s, z0.h
262; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.s
263; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
264; CHECK-NEXT:    stp q1, q0, [x1]
265; CHECK-NEXT:    ret
266;
267; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f32:
268; NONEON-NOSVE:       // %bb.0:
269; NONEON-NOSVE-NEXT:    ldr q0, [x0]
270; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
271; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
272; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
273; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
274; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #30]
275; NONEON-NOSVE-NEXT:    ucvtf s1, w8
276; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
277; NONEON-NOSVE-NEXT:    ucvtf s0, w8
278; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #26]
279; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
280; NONEON-NOSVE-NEXT:    ucvtf s1, w8
281; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
282; NONEON-NOSVE-NEXT:    ucvtf s0, w8
283; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #22]
284; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
285; NONEON-NOSVE-NEXT:    ucvtf s1, w8
286; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
287; NONEON-NOSVE-NEXT:    ucvtf s0, w8
288; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #18]
289; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
290; NONEON-NOSVE-NEXT:    ucvtf s1, w8
291; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
292; NONEON-NOSVE-NEXT:    ucvtf s0, w8
293; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
294; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
295; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
296; NONEON-NOSVE-NEXT:    add sp, sp, #64
297; NONEON-NOSVE-NEXT:    ret
298  %op1 = load <8 x i16>, ptr %a
299  %res = uitofp <8 x i16> %op1 to <8 x float>
300  store <8 x float> %res, ptr %b
301  ret void
302}
303
304define void @ucvtf_v16i16_v16f32(ptr %a, ptr %b) {
305; CHECK-LABEL: ucvtf_v16i16_v16f32:
306; CHECK:       // %bb.0:
307; CHECK-NEXT:    ldp q1, q0, [x0]
308; CHECK-NEXT:    ptrue p0.s, vl4
309; CHECK-NEXT:    uunpklo z2.s, z0.h
310; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
311; CHECK-NEXT:    uunpklo z3.s, z1.h
312; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
313; CHECK-NEXT:    uunpklo z0.s, z0.h
314; CHECK-NEXT:    uunpklo z1.s, z1.h
315; CHECK-NEXT:    ucvtf z2.s, p0/m, z2.s
316; CHECK-NEXT:    ucvtf z3.s, p0/m, z3.s
317; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
318; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.s
319; CHECK-NEXT:    stp q2, q0, [x1, #32]
320; CHECK-NEXT:    stp q3, q1, [x1]
321; CHECK-NEXT:    ret
322;
323; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f32:
324; NONEON-NOSVE:       // %bb.0:
325; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
326; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
327; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
328; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
329; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
330; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
331; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #46]
332; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
333; NONEON-NOSVE-NEXT:    ucvtf s1, w8
334; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #44]
335; NONEON-NOSVE-NEXT:    ucvtf s0, w8
336; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #42]
337; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
338; NONEON-NOSVE-NEXT:    ucvtf s1, w8
339; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #40]
340; NONEON-NOSVE-NEXT:    ucvtf s0, w8
341; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #38]
342; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
343; NONEON-NOSVE-NEXT:    ucvtf s1, w8
344; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #36]
345; NONEON-NOSVE-NEXT:    ucvtf s0, w8
346; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #34]
347; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
348; NONEON-NOSVE-NEXT:    ucvtf s1, w8
349; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #32]
350; NONEON-NOSVE-NEXT:    ucvtf s0, w8
351; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #62]
352; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #64]
353; NONEON-NOSVE-NEXT:    ucvtf s1, w8
354; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
355; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
356; NONEON-NOSVE-NEXT:    ucvtf s0, w8
357; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #58]
358; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #120]
359; NONEON-NOSVE-NEXT:    ucvtf s1, w8
360; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
361; NONEON-NOSVE-NEXT:    ucvtf s0, w8
362; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #54]
363; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #112]
364; NONEON-NOSVE-NEXT:    ucvtf s1, w8
365; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
366; NONEON-NOSVE-NEXT:    ucvtf s0, w8
367; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #50]
368; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #104]
369; NONEON-NOSVE-NEXT:    ucvtf s1, w8
370; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
371; NONEON-NOSVE-NEXT:    ucvtf s0, w8
372; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #96]
373; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
374; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
375; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
376; NONEON-NOSVE-NEXT:    add sp, sp, #128
377; NONEON-NOSVE-NEXT:    ret
378  %op1 = load <16 x i16>, ptr %a
379  %res = uitofp <16 x i16> %op1 to <16 x float>
380  store <16 x float> %res, ptr %b
381  ret void
382}
383
384;
385; UCVTF H -> D
386;
387
388define <1 x double> @ucvtf_v1i16_v1f64(<1 x i16> %op1) {
389; CHECK-LABEL: ucvtf_v1i16_v1f64:
390; CHECK:       // %bb.0:
391; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
392; CHECK-NEXT:    fmov w8, s0
393; CHECK-NEXT:    and w8, w8, #0xffff
394; CHECK-NEXT:    ucvtf d0, w8
395; CHECK-NEXT:    ret
396;
397; NONEON-NOSVE-LABEL: ucvtf_v1i16_v1f64:
398; NONEON-NOSVE:       // %bb.0:
399; NONEON-NOSVE-NEXT:    sub sp, sp, #16
400; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
401; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
402; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
403; NONEON-NOSVE-NEXT:    ucvtf d0, w8
404; NONEON-NOSVE-NEXT:    str d0, [sp]
405; NONEON-NOSVE-NEXT:    ldr d0, [sp], #16
406; NONEON-NOSVE-NEXT:    ret
407  %res = uitofp <1 x i16> %op1 to <1 x double>
408  ret <1 x double> %res
409}
410
411define <2 x double> @ucvtf_v2i16_v2f64(<2 x i16> %op1) {
412; CHECK-LABEL: ucvtf_v2i16_v2f64:
413; CHECK:       // %bb.0:
414; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
415; CHECK-NEXT:    ptrue p0.d, vl2
416; CHECK-NEXT:    and z0.s, z0.s, #0xffff
417; CHECK-NEXT:    uunpklo z0.d, z0.s
418; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
419; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
420; CHECK-NEXT:    ret
421;
422; NONEON-NOSVE-LABEL: ucvtf_v2i16_v2f64:
423; NONEON-NOSVE:       // %bb.0:
424; NONEON-NOSVE-NEXT:    sub sp, sp, #32
425; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
426; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
427; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
428; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #8]
429; NONEON-NOSVE-NEXT:    ucvtf d0, w8
430; NONEON-NOSVE-NEXT:    ucvtf d1, w9
431; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]
432; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
433; NONEON-NOSVE-NEXT:    add sp, sp, #32
434; NONEON-NOSVE-NEXT:    ret
435  %res = uitofp <2 x i16> %op1 to <2 x double>
436  ret <2 x double> %res
437}
438
439define void @ucvtf_v4i16_v4f64(ptr %a, ptr %b) {
440; CHECK-LABEL: ucvtf_v4i16_v4f64:
441; CHECK:       // %bb.0:
442; CHECK-NEXT:    ldr d0, [x0]
443; CHECK-NEXT:    ptrue p0.d, vl2
444; CHECK-NEXT:    uunpklo z0.s, z0.h
445; CHECK-NEXT:    uunpklo z1.d, z0.s
446; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
447; CHECK-NEXT:    uunpklo z0.d, z0.s
448; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
449; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
450; CHECK-NEXT:    stp q1, q0, [x1]
451; CHECK-NEXT:    ret
452;
453; NONEON-NOSVE-LABEL: ucvtf_v4i16_v4f64:
454; NONEON-NOSVE:       // %bb.0:
455; NONEON-NOSVE-NEXT:    sub sp, sp, #80
456; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
457; NONEON-NOSVE-NEXT:    ldr d0, [x0]
458; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
459; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #10]
460; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
461; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
462; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #14]
463; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
464; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
465; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
466; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
467; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
468; NONEON-NOSVE-NEXT:    ucvtf d1, w9
469; NONEON-NOSVE-NEXT:    ucvtf d0, w8
470; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
471; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
472; NONEON-NOSVE-NEXT:    ucvtf d1, w9
473; NONEON-NOSVE-NEXT:    ucvtf d0, w8
474; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
475; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
476; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
477; NONEON-NOSVE-NEXT:    add sp, sp, #80
478; NONEON-NOSVE-NEXT:    ret
479  %op1 = load <4 x i16>, ptr %a
480  %res = uitofp <4 x i16> %op1 to <4 x double>
481  store <4 x double> %res, ptr %b
482  ret void
483}
484
485define void @ucvtf_v8i16_v8f64(ptr %a, ptr %b) {
486; CHECK-LABEL: ucvtf_v8i16_v8f64:
487; CHECK:       // %bb.0:
488; CHECK-NEXT:    ldr q0, [x0]
489; CHECK-NEXT:    ptrue p0.d, vl2
490; CHECK-NEXT:    uunpklo z1.s, z0.h
491; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
492; CHECK-NEXT:    uunpklo z0.s, z0.h
493; CHECK-NEXT:    uunpklo z2.d, z1.s
494; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
495; CHECK-NEXT:    uunpklo z3.d, z0.s
496; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
497; CHECK-NEXT:    uunpklo z1.d, z1.s
498; CHECK-NEXT:    ucvtf z2.d, p0/m, z2.d
499; CHECK-NEXT:    uunpklo z0.d, z0.s
500; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
501; CHECK-NEXT:    ucvtf z3.d, p0/m, z3.d
502; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
503; CHECK-NEXT:    stp q2, q1, [x1]
504; CHECK-NEXT:    stp q3, q0, [x1, #32]
505; CHECK-NEXT:    ret
506;
507; NONEON-NOSVE-LABEL: ucvtf_v8i16_v8f64:
508; NONEON-NOSVE:       // %bb.0:
509; NONEON-NOSVE-NEXT:    sub sp, sp, #160
510; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
511; NONEON-NOSVE-NEXT:    ldr q0, [x0]
512; NONEON-NOSVE-NEXT:    str q0, [sp]
513; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
514; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
515; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #26]
516; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #24]
517; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
518; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #30]
519; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #28]
520; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
521; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #18]
522; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
523; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
524; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
525; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #22]
526; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #20]
527; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
528; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
529; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
530; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]
531; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
532; NONEON-NOSVE-NEXT:    ucvtf d1, w9
533; NONEON-NOSVE-NEXT:    ucvtf d0, w8
534; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #80]
535; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #144]
536; NONEON-NOSVE-NEXT:    ucvtf d1, w9
537; NONEON-NOSVE-NEXT:    ucvtf d0, w8
538; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #72]
539; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #128]
540; NONEON-NOSVE-NEXT:    ucvtf d1, w9
541; NONEON-NOSVE-NEXT:    ucvtf d0, w8
542; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #64]
543; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
544; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
545; NONEON-NOSVE-NEXT:    ucvtf d1, w9
546; NONEON-NOSVE-NEXT:    ucvtf d0, w8
547; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
548; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
549; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
550; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
551; NONEON-NOSVE-NEXT:    add sp, sp, #160
552; NONEON-NOSVE-NEXT:    ret
553  %op1 = load <8 x i16>, ptr %a
554  %res = uitofp <8 x i16> %op1 to <8 x double>
555  store <8 x double> %res, ptr %b
556  ret void
557}
558
559define void @ucvtf_v16i16_v16f64(ptr %a, ptr %b) {
560; CHECK-LABEL: ucvtf_v16i16_v16f64:
561; CHECK:       // %bb.0:
562; CHECK-NEXT:    ldp q1, q0, [x0]
563; CHECK-NEXT:    ptrue p0.d, vl2
564; CHECK-NEXT:    mov z2.d, z0.d
565; CHECK-NEXT:    uunpklo z3.s, z1.h
566; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
567; CHECK-NEXT:    uunpklo z0.s, z0.h
568; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
569; CHECK-NEXT:    uunpklo z1.s, z1.h
570; CHECK-NEXT:    mov z5.d, z3.d
571; CHECK-NEXT:    uunpklo z4.d, z0.s
572; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
573; CHECK-NEXT:    uunpklo z2.s, z2.h
574; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #8
575; CHECK-NEXT:    mov z7.d, z1.d
576; CHECK-NEXT:    uunpklo z3.d, z3.s
577; CHECK-NEXT:    uunpklo z0.d, z0.s
578; CHECK-NEXT:    ucvtf z4.d, p0/m, z4.d
579; CHECK-NEXT:    mov z6.d, z2.d
580; CHECK-NEXT:    uunpklo z5.d, z5.s
581; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #8
582; CHECK-NEXT:    uunpklo z1.d, z1.s
583; CHECK-NEXT:    ucvtf z3.d, p0/m, z3.d
584; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
585; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #8
586; CHECK-NEXT:    uunpklo z2.d, z2.s
587; CHECK-NEXT:    uunpklo z7.d, z7.s
588; CHECK-NEXT:    ucvtf z5.d, p0/m, z5.d
589; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
590; CHECK-NEXT:    uunpklo z6.d, z6.s
591; CHECK-NEXT:    stp q4, q0, [x1, #64]
592; CHECK-NEXT:    ucvtf z2.d, p0/m, z2.d
593; CHECK-NEXT:    stp q3, q5, [x1]
594; CHECK-NEXT:    movprfx z3, z7
595; CHECK-NEXT:    ucvtf z3.d, p0/m, z7.d
596; CHECK-NEXT:    movprfx z0, z6
597; CHECK-NEXT:    ucvtf z0.d, p0/m, z6.d
598; CHECK-NEXT:    stp q1, q3, [x1, #32]
599; CHECK-NEXT:    stp q2, q0, [x1, #96]
600; CHECK-NEXT:    ret
601;
602; NONEON-NOSVE-LABEL: ucvtf_v16i16_v16f64:
603; NONEON-NOSVE:       // %bb.0:
604; NONEON-NOSVE-NEXT:    sub sp, sp, #336
605; NONEON-NOSVE-NEXT:    str x29, [sp, #320] // 8-byte Folded Spill
606; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 336
607; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
608; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
609; NONEON-NOSVE-NEXT:    ldr x29, [sp, #320] // 8-byte Folded Reload
610; NONEON-NOSVE-NEXT:    stp q0, q1, [sp]
611; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
612; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #40]
613; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
614; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #50]
615; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #48]
616; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
617; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #54]
618; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #52]
619; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #56]
620; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]
621; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #42]
622; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #40]
623; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #88]
624; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]
625; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #46]
626; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #44]
627; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]
628; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #66]
629; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #64]
630; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #152]
631; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #72]
632; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
633; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #70]
634; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #68]
635; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
636; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #58]
637; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #56]
638; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #136]
639; NONEON-NOSVE-NEXT:    ldp d2, d1, [sp, #120]
640; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
641; NONEON-NOSVE-NEXT:    ldrh w9, [sp, #62]
642; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #60]
643; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
644; NONEON-NOSVE-NEXT:    str d1, [sp, #328]
645; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #104]
646; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #160]
647; NONEON-NOSVE-NEXT:    stp d1, d2, [sp, #176]
648; NONEON-NOSVE-NEXT:    str d0, [sp, #168]
649; NONEON-NOSVE-NEXT:    ucvtf d1, w9
650; NONEON-NOSVE-NEXT:    ucvtf d0, w8
651; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #152]
652; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #240]
653; NONEON-NOSVE-NEXT:    ucvtf d1, w9
654; NONEON-NOSVE-NEXT:    ucvtf d0, w8
655; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #144]
656; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #224]
657; NONEON-NOSVE-NEXT:    ucvtf d1, w9
658; NONEON-NOSVE-NEXT:    ucvtf d0, w8
659; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #136]
660; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
661; NONEON-NOSVE-NEXT:    ucvtf d1, w9
662; NONEON-NOSVE-NEXT:    ucvtf d0, w8
663; NONEON-NOSVE-NEXT:    ldr w8, [sp, #332]
664; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #192]
665; NONEON-NOSVE-NEXT:    ucvtf d1, w8
666; NONEON-NOSVE-NEXT:    ldr w8, [sp, #328]
667; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #192]
668; NONEON-NOSVE-NEXT:    ucvtf d0, w8
669; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #184]
670; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #304]
671; NONEON-NOSVE-NEXT:    ucvtf d1, w9
672; NONEON-NOSVE-NEXT:    ucvtf d0, w8
673; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #176]
674; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #288]
675; NONEON-NOSVE-NEXT:    ucvtf d1, w9
676; NONEON-NOSVE-NEXT:    ucvtf d0, w8
677; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #168]
678; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #288]
679; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #272]
680; NONEON-NOSVE-NEXT:    ucvtf d1, w9
681; NONEON-NOSVE-NEXT:    ucvtf d0, w8
682; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #256]
683; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #224]
684; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #256]
685; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
686; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
687; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
688; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
689; NONEON-NOSVE-NEXT:    add sp, sp, #336
690; NONEON-NOSVE-NEXT:    ret
691  %op1 = load <16 x i16>, ptr %a
692  %res = uitofp <16 x i16> %op1 to <16 x double>
693  store <16 x double> %res, ptr %b
694  ret void
695}
696
697;
698; UCVTF S -> H
699;
700
701define <2 x half> @ucvtf_v2i32_v2f16(<2 x i32> %op1) {
702; CHECK-LABEL: ucvtf_v2i32_v2f16:
703; CHECK:       // %bb.0:
704; CHECK-NEXT:    ptrue p0.s, vl4
705; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
706; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
707; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
708; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
709; CHECK-NEXT:    ret
710;
711; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f16:
712; NONEON-NOSVE:       // %bb.0:
713; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
714; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
715; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
716; NONEON-NOSVE-NEXT:    str wzr, [sp, #12]
717; NONEON-NOSVE-NEXT:    ucvtf s0, w9
718; NONEON-NOSVE-NEXT:    fcvt h0, s0
719; NONEON-NOSVE-NEXT:    str h0, [sp, #10]
720; NONEON-NOSVE-NEXT:    ucvtf s0, w8
721; NONEON-NOSVE-NEXT:    fcvt h0, s0
722; NONEON-NOSVE-NEXT:    str h0, [sp, #8]
723; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
724; NONEON-NOSVE-NEXT:    add sp, sp, #16
725; NONEON-NOSVE-NEXT:    ret
726  %res = uitofp <2 x i32> %op1 to <2 x half>
727  ret <2 x half> %res
728}
729
730define <4 x half> @ucvtf_v4i32_v4f16(<4 x i32> %op1) {
731; CHECK-LABEL: ucvtf_v4i32_v4f16:
732; CHECK:       // %bb.0:
733; CHECK-NEXT:    ptrue p0.s, vl4
734; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
735; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
736; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
737; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
738; CHECK-NEXT:    ret
739;
740; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f16:
741; NONEON-NOSVE:       // %bb.0:
742; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
743; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
744; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
745; NONEON-NOSVE-NEXT:    ucvtf s0, w9
746; NONEON-NOSVE-NEXT:    fcvt h0, s0
747; NONEON-NOSVE-NEXT:    str h0, [sp, #30]
748; NONEON-NOSVE-NEXT:    ucvtf s0, w8
749; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
750; NONEON-NOSVE-NEXT:    fcvt h0, s0
751; NONEON-NOSVE-NEXT:    str h0, [sp, #28]
752; NONEON-NOSVE-NEXT:    ucvtf s0, w9
753; NONEON-NOSVE-NEXT:    fcvt h0, s0
754; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
755; NONEON-NOSVE-NEXT:    ucvtf s0, w8
756; NONEON-NOSVE-NEXT:    fcvt h0, s0
757; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
758; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
759; NONEON-NOSVE-NEXT:    add sp, sp, #32
760; NONEON-NOSVE-NEXT:    ret
761  %res = uitofp <4 x i32> %op1 to <4 x half>
762  ret <4 x half> %res
763}
764
765define <8 x half> @ucvtf_v8i32_v8f16(ptr %a) {
766; CHECK-LABEL: ucvtf_v8i32_v8f16:
767; CHECK:       // %bb.0:
768; CHECK-NEXT:    ldp q0, q1, [x0]
769; CHECK-NEXT:    ptrue p0.s, vl4
770; CHECK-NEXT:    ucvtf z1.h, p0/m, z1.s
771; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
772; CHECK-NEXT:    ptrue p0.h, vl4
773; CHECK-NEXT:    uzp1 z1.h, z1.h, z1.h
774; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
775; CHECK-NEXT:    splice z0.h, p0, z0.h, z1.h
776; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
777; CHECK-NEXT:    ret
778;
779; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f16:
780; NONEON-NOSVE:       // %bb.0:
781; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
782; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
783; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
784; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
785; NONEON-NOSVE-NEXT:    ucvtf s0, w9
786; NONEON-NOSVE-NEXT:    fcvt h0, s0
787; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
788; NONEON-NOSVE-NEXT:    ucvtf s0, w8
789; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
790; NONEON-NOSVE-NEXT:    fcvt h0, s0
791; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
792; NONEON-NOSVE-NEXT:    ucvtf s0, w9
793; NONEON-NOSVE-NEXT:    fcvt h0, s0
794; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
795; NONEON-NOSVE-NEXT:    ucvtf s0, w8
796; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
797; NONEON-NOSVE-NEXT:    fcvt h0, s0
798; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
799; NONEON-NOSVE-NEXT:    ucvtf s0, w9
800; NONEON-NOSVE-NEXT:    fcvt h0, s0
801; NONEON-NOSVE-NEXT:    str h0, [sp, #38]
802; NONEON-NOSVE-NEXT:    ucvtf s0, w8
803; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
804; NONEON-NOSVE-NEXT:    fcvt h0, s0
805; NONEON-NOSVE-NEXT:    str h0, [sp, #36]
806; NONEON-NOSVE-NEXT:    ucvtf s0, w9
807; NONEON-NOSVE-NEXT:    fcvt h0, s0
808; NONEON-NOSVE-NEXT:    str h0, [sp, #34]
809; NONEON-NOSVE-NEXT:    ucvtf s0, w8
810; NONEON-NOSVE-NEXT:    fcvt h0, s0
811; NONEON-NOSVE-NEXT:    str h0, [sp, #32]
812; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
813; NONEON-NOSVE-NEXT:    add sp, sp, #48
814; NONEON-NOSVE-NEXT:    ret
815  %op1 = load <8 x i32>, ptr %a
816  %res = uitofp <8 x i32> %op1 to <8 x half>
817  ret <8 x half> %res
818}
819
820define void @ucvtf_v16i32_v16f16(ptr %a, ptr %b) {
821; CHECK-LABEL: ucvtf_v16i32_v16f16:
822; CHECK:       // %bb.0:
823; CHECK-NEXT:    ldp q0, q1, [x0, #32]
824; CHECK-NEXT:    ptrue p0.s, vl4
825; CHECK-NEXT:    ldp q2, q3, [x0]
826; CHECK-NEXT:    ucvtf z1.h, p0/m, z1.s
827; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
828; CHECK-NEXT:    ucvtf z3.h, p0/m, z3.s
829; CHECK-NEXT:    ucvtf z2.h, p0/m, z2.s
830; CHECK-NEXT:    ptrue p0.h, vl4
831; CHECK-NEXT:    uzp1 z1.h, z1.h, z1.h
832; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
833; CHECK-NEXT:    uzp1 z3.h, z3.h, z3.h
834; CHECK-NEXT:    uzp1 z2.h, z2.h, z2.h
835; CHECK-NEXT:    splice z0.h, p0, z0.h, z1.h
836; CHECK-NEXT:    splice z2.h, p0, z2.h, z3.h
837; CHECK-NEXT:    stp q2, q0, [x1]
838; CHECK-NEXT:    ret
839;
840; NONEON-NOSVE-LABEL: ucvtf_v16i32_v16f16:
841; NONEON-NOSVE:       // %bb.0:
842; NONEON-NOSVE-NEXT:    sub sp, sp, #96
843; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
844; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
845; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0, #32]
846; NONEON-NOSVE-NEXT:    str q1, [sp]
847; NONEON-NOSVE-NEXT:    stp q3, q0, [sp, #16]
848; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
849; NONEON-NOSVE-NEXT:    str q2, [sp, #48]
850; NONEON-NOSVE-NEXT:    ucvtf s0, w9
851; NONEON-NOSVE-NEXT:    fcvt h0, s0
852; NONEON-NOSVE-NEXT:    str h0, [sp, #78]
853; NONEON-NOSVE-NEXT:    ucvtf s0, w8
854; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
855; NONEON-NOSVE-NEXT:    fcvt h0, s0
856; NONEON-NOSVE-NEXT:    str h0, [sp, #76]
857; NONEON-NOSVE-NEXT:    ucvtf s0, w9
858; NONEON-NOSVE-NEXT:    fcvt h0, s0
859; NONEON-NOSVE-NEXT:    str h0, [sp, #74]
860; NONEON-NOSVE-NEXT:    ucvtf s0, w8
861; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
862; NONEON-NOSVE-NEXT:    fcvt h0, s0
863; NONEON-NOSVE-NEXT:    str h0, [sp, #72]
864; NONEON-NOSVE-NEXT:    ucvtf s0, w9
865; NONEON-NOSVE-NEXT:    fcvt h0, s0
866; NONEON-NOSVE-NEXT:    str h0, [sp, #70]
867; NONEON-NOSVE-NEXT:    ucvtf s0, w8
868; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
869; NONEON-NOSVE-NEXT:    fcvt h0, s0
870; NONEON-NOSVE-NEXT:    str h0, [sp, #68]
871; NONEON-NOSVE-NEXT:    ucvtf s0, w9
872; NONEON-NOSVE-NEXT:    fcvt h0, s0
873; NONEON-NOSVE-NEXT:    str h0, [sp, #66]
874; NONEON-NOSVE-NEXT:    ucvtf s0, w8
875; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
876; NONEON-NOSVE-NEXT:    fcvt h0, s0
877; NONEON-NOSVE-NEXT:    str h0, [sp, #64]
878; NONEON-NOSVE-NEXT:    ucvtf s0, w9
879; NONEON-NOSVE-NEXT:    fcvt h0, s0
880; NONEON-NOSVE-NEXT:    str h0, [sp, #94]
881; NONEON-NOSVE-NEXT:    ucvtf s0, w8
882; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
883; NONEON-NOSVE-NEXT:    fcvt h0, s0
884; NONEON-NOSVE-NEXT:    str h0, [sp, #92]
885; NONEON-NOSVE-NEXT:    ucvtf s0, w9
886; NONEON-NOSVE-NEXT:    fcvt h0, s0
887; NONEON-NOSVE-NEXT:    str h0, [sp, #90]
888; NONEON-NOSVE-NEXT:    ucvtf s0, w8
889; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #56]
890; NONEON-NOSVE-NEXT:    fcvt h0, s0
891; NONEON-NOSVE-NEXT:    str h0, [sp, #88]
892; NONEON-NOSVE-NEXT:    ucvtf s0, w9
893; NONEON-NOSVE-NEXT:    fcvt h0, s0
894; NONEON-NOSVE-NEXT:    str h0, [sp, #86]
895; NONEON-NOSVE-NEXT:    ucvtf s0, w8
896; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #48]
897; NONEON-NOSVE-NEXT:    fcvt h0, s0
898; NONEON-NOSVE-NEXT:    str h0, [sp, #84]
899; NONEON-NOSVE-NEXT:    ucvtf s0, w9
900; NONEON-NOSVE-NEXT:    fcvt h0, s0
901; NONEON-NOSVE-NEXT:    str h0, [sp, #82]
902; NONEON-NOSVE-NEXT:    ucvtf s0, w8
903; NONEON-NOSVE-NEXT:    fcvt h0, s0
904; NONEON-NOSVE-NEXT:    str h0, [sp, #80]
905; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]
906; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
907; NONEON-NOSVE-NEXT:    add sp, sp, #96
908; NONEON-NOSVE-NEXT:    ret
909  %op1 = load <16 x i32>, ptr %a
910  %res = uitofp <16 x i32> %op1 to <16 x half>
911  store <16 x half> %res, ptr %b
912  ret void
913}
914
915;
916; UCVTF S -> S
917;
918
919define <2 x float> @ucvtf_v2i32_v2f32(<2 x i32> %op1) {
920; CHECK-LABEL: ucvtf_v2i32_v2f32:
921; CHECK:       // %bb.0:
922; CHECK-NEXT:    ptrue p0.s, vl2
923; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
924; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
925; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
926; CHECK-NEXT:    ret
927;
928; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f32:
929; NONEON-NOSVE:       // %bb.0:
930; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
931; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
932; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
933; NONEON-NOSVE-NEXT:    ucvtf s1, w9
934; NONEON-NOSVE-NEXT:    ucvtf s0, w8
935; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #8]
936; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
937; NONEON-NOSVE-NEXT:    add sp, sp, #16
938; NONEON-NOSVE-NEXT:    ret
939  %res = uitofp <2 x i32> %op1 to <2 x float>
940  ret <2 x float> %res
941}
942
943define <4 x float> @ucvtf_v4i32_v4f32(<4 x i32> %op1) {
944; CHECK-LABEL: ucvtf_v4i32_v4f32:
945; CHECK:       // %bb.0:
946; CHECK-NEXT:    ptrue p0.s, vl4
947; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
948; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
949; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
950; CHECK-NEXT:    ret
951;
952; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f32:
953; NONEON-NOSVE:       // %bb.0:
954; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
955; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
956; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
957; NONEON-NOSVE-NEXT:    ucvtf s1, w9
958; NONEON-NOSVE-NEXT:    ucvtf s0, w8
959; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
960; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
961; NONEON-NOSVE-NEXT:    ucvtf s1, w9
962; NONEON-NOSVE-NEXT:    ucvtf s0, w8
963; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
964; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
965; NONEON-NOSVE-NEXT:    add sp, sp, #32
966; NONEON-NOSVE-NEXT:    ret
967  %res = uitofp <4 x i32> %op1 to <4 x float>
968  ret <4 x float> %res
969}
970
971define void @ucvtf_v8i32_v8f32(ptr %a, ptr %b) {
972; CHECK-LABEL: ucvtf_v8i32_v8f32:
973; CHECK:       // %bb.0:
974; CHECK-NEXT:    ldp q0, q1, [x0]
975; CHECK-NEXT:    ptrue p0.s, vl4
976; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
977; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.s
978; CHECK-NEXT:    stp q0, q1, [x1]
979; CHECK-NEXT:    ret
980;
981; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f32:
982; NONEON-NOSVE:       // %bb.0:
983; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
984; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
985; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
986; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
987; NONEON-NOSVE-NEXT:    ucvtf s1, w9
988; NONEON-NOSVE-NEXT:    ucvtf s0, w8
989; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
990; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
991; NONEON-NOSVE-NEXT:    ucvtf s1, w9
992; NONEON-NOSVE-NEXT:    ucvtf s0, w8
993; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
994; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
995; NONEON-NOSVE-NEXT:    ucvtf s1, w9
996; NONEON-NOSVE-NEXT:    ucvtf s0, w8
997; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
998; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
999; NONEON-NOSVE-NEXT:    ucvtf s1, w9
1000; NONEON-NOSVE-NEXT:    ucvtf s0, w8
1001; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
1002; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1003; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
1004; NONEON-NOSVE-NEXT:    add sp, sp, #64
1005; NONEON-NOSVE-NEXT:    ret
1006  %op1 = load <8 x i32>, ptr %a
1007  %res = uitofp <8 x i32> %op1 to <8 x float>
1008  store <8 x float> %res, ptr %b
1009  ret void
1010}
1011
1012;
1013; UCVTF S -> D
1014;
1015
1016define <2 x double> @ucvtf_v2i32_v2f64(<2 x i32> %op1) {
1017; CHECK-LABEL: ucvtf_v2i32_v2f64:
1018; CHECK:       // %bb.0:
1019; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1020; CHECK-NEXT:    ptrue p0.d, vl2
1021; CHECK-NEXT:    uunpklo z0.d, z0.s
1022; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
1023; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1024; CHECK-NEXT:    ret
1025;
1026; NONEON-NOSVE-LABEL: ucvtf_v2i32_v2f64:
1027; NONEON-NOSVE:       // %bb.0:
1028; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1029; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1030; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
1031; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
1032; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1033; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1034; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1035; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1036; NONEON-NOSVE-NEXT:    add sp, sp, #32
1037; NONEON-NOSVE-NEXT:    ret
1038  %res = uitofp <2 x i32> %op1 to <2 x double>
1039  ret <2 x double> %res
1040}
1041
1042define void @ucvtf_v4i32_v4f64(ptr %a, ptr %b) {
1043; CHECK-LABEL: ucvtf_v4i32_v4f64:
1044; CHECK:       // %bb.0:
1045; CHECK-NEXT:    ldr q0, [x0]
1046; CHECK-NEXT:    ptrue p0.d, vl2
1047; CHECK-NEXT:    uunpklo z1.d, z0.s
1048; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1049; CHECK-NEXT:    uunpklo z0.d, z0.s
1050; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
1051; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
1052; CHECK-NEXT:    stp q1, q0, [x1]
1053; CHECK-NEXT:    ret
1054;
1055; NONEON-NOSVE-LABEL: ucvtf_v4i32_v4f64:
1056; NONEON-NOSVE:       // %bb.0:
1057; NONEON-NOSVE-NEXT:    ldr q0, [x0]
1058; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
1059; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1060; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1061; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1062; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
1063; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1064; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1065; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
1066; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
1067; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1068; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1069; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1070; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1071; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
1072; NONEON-NOSVE-NEXT:    add sp, sp, #64
1073; NONEON-NOSVE-NEXT:    ret
1074  %op1 = load <4 x i32>, ptr %a
1075  %res = uitofp <4 x i32> %op1 to <4 x double>
1076  store <4 x double> %res, ptr %b
1077  ret void
1078}
1079
1080define void @ucvtf_v8i32_v8f64(ptr %a, ptr %b) {
1081; CHECK-LABEL: ucvtf_v8i32_v8f64:
1082; CHECK:       // %bb.0:
1083; CHECK-NEXT:    ldp q1, q0, [x0]
1084; CHECK-NEXT:    ptrue p0.d, vl2
1085; CHECK-NEXT:    uunpklo z2.d, z0.s
1086; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1087; CHECK-NEXT:    uunpklo z3.d, z1.s
1088; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1089; CHECK-NEXT:    uunpklo z0.d, z0.s
1090; CHECK-NEXT:    uunpklo z1.d, z1.s
1091; CHECK-NEXT:    ucvtf z2.d, p0/m, z2.d
1092; CHECK-NEXT:    ucvtf z3.d, p0/m, z3.d
1093; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
1094; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
1095; CHECK-NEXT:    stp q2, q0, [x1, #32]
1096; CHECK-NEXT:    stp q3, q1, [x1]
1097; CHECK-NEXT:    ret
1098;
1099; NONEON-NOSVE-LABEL: ucvtf_v8i32_v8f64:
1100; NONEON-NOSVE:       // %bb.0:
1101; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
1102; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
1103; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
1104; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1105; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1106; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
1107; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
1108; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
1109; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1110; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1111; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
1112; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
1113; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1114; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1115; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #56]
1116; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
1117; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1118; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1119; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #48]
1120; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
1121; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
1122; NONEON-NOSVE-NEXT:    ucvtf d1, w9
1123; NONEON-NOSVE-NEXT:    ucvtf d0, w8
1124; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
1125; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
1126; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
1127; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
1128; NONEON-NOSVE-NEXT:    add sp, sp, #128
1129; NONEON-NOSVE-NEXT:    ret
1130  %op1 = load <8 x i32>, ptr %a
1131  %res = uitofp <8 x i32> %op1 to <8 x double>
1132  store <8 x double> %res, ptr %b
1133  ret void
1134}
1135
1136;
1137; UCVTF D -> H
1138;
1139
1140define <2 x half> @ucvtf_v2i64_v2f16(<2 x i64> %op1) {
1141; CHECK-LABEL: ucvtf_v2i64_v2f16:
1142; CHECK:       // %bb.0:
1143; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1144; CHECK-NEXT:    mov z1.d, z0.d[1]
1145; CHECK-NEXT:    ptrue p0.d
1146; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.d
1147; CHECK-NEXT:    ucvtf z1.h, p0/m, z1.d
1148; CHECK-NEXT:    zip1 z0.h, z0.h, z1.h
1149; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1150; CHECK-NEXT:    ret
1151;
1152; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f16:
1153; NONEON-NOSVE:       // %bb.0:
1154; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1155; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1156; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1157; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1158; NONEON-NOSVE-NEXT:    fcvt h0, s0
1159; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
1160; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1161; NONEON-NOSVE-NEXT:    fcvt h0, s0
1162; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
1163; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1164; NONEON-NOSVE-NEXT:    add sp, sp, #32
1165; NONEON-NOSVE-NEXT:    ret
1166  %res = uitofp <2 x i64> %op1 to <2 x half>
1167  ret <2 x half> %res
1168}
1169
1170define <4 x half> @ucvtf_v4i64_v4f16(ptr %a) {
1171; CHECK-LABEL: ucvtf_v4i64_v4f16:
1172; CHECK:       // %bb.0:
1173; CHECK-NEXT:    ldp q0, q1, [x0]
1174; CHECK-NEXT:    ptrue p0.d, vl2
1175; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.d
1176; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
1177; CHECK-NEXT:    ptrue p0.s, vl2
1178; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
1179; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1180; CHECK-NEXT:    splice z0.s, p0, z0.s, z1.s
1181; CHECK-NEXT:    ptrue p0.s
1182; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
1183; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
1184; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1185; CHECK-NEXT:    ret
1186;
1187; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f16:
1188; NONEON-NOSVE:       // %bb.0:
1189; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1190; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1191; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1192; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
1193; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1194; NONEON-NOSVE-NEXT:    fcvt h0, s0
1195; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
1196; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1197; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1198; NONEON-NOSVE-NEXT:    fcvt h0, s0
1199; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
1200; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1201; NONEON-NOSVE-NEXT:    fcvt h0, s0
1202; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
1203; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1204; NONEON-NOSVE-NEXT:    fcvt h0, s0
1205; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
1206; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]
1207; NONEON-NOSVE-NEXT:    add sp, sp, #48
1208; NONEON-NOSVE-NEXT:    ret
1209  %op1 = load <4 x i64>, ptr %a
1210  %res = uitofp <4 x i64> %op1 to <4 x half>
1211  ret <4 x half> %res
1212}
1213
1214define <8 x half> @ucvtf_v8i64_v8f16(ptr %a) {
1215; CHECK-LABEL: ucvtf_v8i64_v8f16:
1216; CHECK:       // %bb.0:
1217; CHECK-NEXT:    ldp q1, q0, [x0, #32]
1218; CHECK-NEXT:    ptrue p0.d, vl2
1219; CHECK-NEXT:    ldp q2, q3, [x0]
1220; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
1221; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.d
1222; CHECK-NEXT:    ucvtf z3.s, p0/m, z3.d
1223; CHECK-NEXT:    ucvtf z2.s, p0/m, z2.d
1224; CHECK-NEXT:    ptrue p0.s, vl2
1225; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1226; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
1227; CHECK-NEXT:    uzp1 z3.s, z3.s, z3.s
1228; CHECK-NEXT:    uzp1 z2.s, z2.s, z2.s
1229; CHECK-NEXT:    splice z1.s, p0, z1.s, z0.s
1230; CHECK-NEXT:    splice z2.s, p0, z2.s, z3.s
1231; CHECK-NEXT:    ptrue p0.s
1232; CHECK-NEXT:    movprfx z0, z1
1233; CHECK-NEXT:    fcvt z0.h, p0/m, z1.s
1234; CHECK-NEXT:    movprfx z1, z2
1235; CHECK-NEXT:    fcvt z1.h, p0/m, z2.s
1236; CHECK-NEXT:    ptrue p0.h, vl4
1237; CHECK-NEXT:    uzp1 z2.h, z0.h, z0.h
1238; CHECK-NEXT:    uzp1 z0.h, z1.h, z1.h
1239; CHECK-NEXT:    splice z0.h, p0, z0.h, z2.h
1240; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1241; CHECK-NEXT:    ret
1242;
1243; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f16:
1244; NONEON-NOSVE:       // %bb.0:
1245; NONEON-NOSVE-NEXT:    sub sp, sp, #80
1246; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
1247; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]
1248; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]
1249; NONEON-NOSVE-NEXT:    str q1, [sp, #48]
1250; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #16]
1251; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
1252; NONEON-NOSVE-NEXT:    str q2, [sp]
1253; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1254; NONEON-NOSVE-NEXT:    fcvt h0, s0
1255; NONEON-NOSVE-NEXT:    str h0, [sp, #78]
1256; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1257; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #48]
1258; NONEON-NOSVE-NEXT:    fcvt h0, s0
1259; NONEON-NOSVE-NEXT:    str h0, [sp, #76]
1260; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1261; NONEON-NOSVE-NEXT:    fcvt h0, s0
1262; NONEON-NOSVE-NEXT:    str h0, [sp, #74]
1263; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1264; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #32]
1265; NONEON-NOSVE-NEXT:    fcvt h0, s0
1266; NONEON-NOSVE-NEXT:    str h0, [sp, #72]
1267; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1268; NONEON-NOSVE-NEXT:    fcvt h0, s0
1269; NONEON-NOSVE-NEXT:    str h0, [sp, #70]
1270; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1271; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1272; NONEON-NOSVE-NEXT:    fcvt h0, s0
1273; NONEON-NOSVE-NEXT:    str h0, [sp, #68]
1274; NONEON-NOSVE-NEXT:    ucvtf s0, x9
1275; NONEON-NOSVE-NEXT:    fcvt h0, s0
1276; NONEON-NOSVE-NEXT:    str h0, [sp, #66]
1277; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1278; NONEON-NOSVE-NEXT:    fcvt h0, s0
1279; NONEON-NOSVE-NEXT:    str h0, [sp, #64]
1280; NONEON-NOSVE-NEXT:    ldr q0, [sp, #64]
1281; NONEON-NOSVE-NEXT:    add sp, sp, #80
1282; NONEON-NOSVE-NEXT:    ret
1283  %op1 = load <8 x i64>, ptr %a
1284  %res = uitofp <8 x i64> %op1 to <8 x half>
1285  ret <8 x half> %res
1286}
1287
1288;
1289; UCVTF D -> S
1290;
1291
1292define <2 x float> @ucvtf_v2i64_v2f32(<2 x i64> %op1) {
1293; CHECK-LABEL: ucvtf_v2i64_v2f32:
1294; CHECK:       // %bb.0:
1295; CHECK-NEXT:    ptrue p0.d, vl2
1296; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1297; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
1298; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1299; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1300; CHECK-NEXT:    ret
1301;
1302; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f32:
1303; NONEON-NOSVE:       // %bb.0:
1304; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1305; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1306; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1307; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1308; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1309; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
1310; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1311; NONEON-NOSVE-NEXT:    add sp, sp, #32
1312; NONEON-NOSVE-NEXT:    ret
1313  %res = uitofp <2 x i64> %op1 to <2 x float>
1314  ret <2 x float> %res
1315}
1316
1317define <4 x float> @ucvtf_v4i64_v4f32(ptr %a) {
1318; CHECK-LABEL: ucvtf_v4i64_v4f32:
1319; CHECK:       // %bb.0:
1320; CHECK-NEXT:    ldp q0, q1, [x0]
1321; CHECK-NEXT:    ptrue p0.d, vl2
1322; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.d
1323; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
1324; CHECK-NEXT:    ptrue p0.s, vl2
1325; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
1326; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1327; CHECK-NEXT:    splice z0.s, p0, z0.s, z1.s
1328; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1329; CHECK-NEXT:    ret
1330;
1331; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f32:
1332; NONEON-NOSVE:       // %bb.0:
1333; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1334; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1335; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1336; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
1337; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1338; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1339; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1340; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
1341; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1342; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1343; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
1344; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1345; NONEON-NOSVE-NEXT:    add sp, sp, #48
1346; NONEON-NOSVE-NEXT:    ret
1347  %op1 = load <4 x i64>, ptr %a
1348  %res = uitofp <4 x i64> %op1 to <4 x float>
1349  ret <4 x float> %res
1350}
1351
1352define void @ucvtf_v8i64_v8f32(ptr %a, ptr %b) {
1353; CHECK-LABEL: ucvtf_v8i64_v8f32:
1354; CHECK:       // %bb.0:
1355; CHECK-NEXT:    ldp q0, q1, [x0, #32]
1356; CHECK-NEXT:    ptrue p0.d, vl2
1357; CHECK-NEXT:    ldp q2, q3, [x0]
1358; CHECK-NEXT:    ucvtf z1.s, p0/m, z1.d
1359; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
1360; CHECK-NEXT:    ucvtf z3.s, p0/m, z3.d
1361; CHECK-NEXT:    ucvtf z2.s, p0/m, z2.d
1362; CHECK-NEXT:    ptrue p0.s, vl2
1363; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
1364; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
1365; CHECK-NEXT:    uzp1 z3.s, z3.s, z3.s
1366; CHECK-NEXT:    uzp1 z2.s, z2.s, z2.s
1367; CHECK-NEXT:    splice z0.s, p0, z0.s, z1.s
1368; CHECK-NEXT:    splice z2.s, p0, z2.s, z3.s
1369; CHECK-NEXT:    stp q2, q0, [x1]
1370; CHECK-NEXT:    ret
1371;
1372; NONEON-NOSVE-LABEL: ucvtf_v8i64_v8f32:
1373; NONEON-NOSVE:       // %bb.0:
1374; NONEON-NOSVE-NEXT:    sub sp, sp, #96
1375; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 96
1376; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1377; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0, #32]
1378; NONEON-NOSVE-NEXT:    str q1, [sp]
1379; NONEON-NOSVE-NEXT:    stp q3, q0, [sp, #16]
1380; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #32]
1381; NONEON-NOSVE-NEXT:    str q2, [sp, #48]
1382; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1383; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1384; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1385; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
1386; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1387; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1388; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
1389; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #64]
1390; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1391; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1392; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #48]
1393; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
1394; NONEON-NOSVE-NEXT:    ucvtf s1, x9
1395; NONEON-NOSVE-NEXT:    ucvtf s0, x8
1396; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
1397; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #64]
1398; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
1399; NONEON-NOSVE-NEXT:    add sp, sp, #96
1400; NONEON-NOSVE-NEXT:    ret
1401  %op1 = load <8 x i64>, ptr %a
1402  %res = uitofp <8 x i64> %op1 to <8 x float>
1403  store <8 x float> %res, ptr %b
1404  ret void
1405}
1406
1407;
1408; UCVTF D -> D
1409;
1410
1411define <2 x double> @ucvtf_v2i64_v2f64(<2 x i64> %op1) {
1412; CHECK-LABEL: ucvtf_v2i64_v2f64:
1413; CHECK:       // %bb.0:
1414; CHECK-NEXT:    ptrue p0.d, vl2
1415; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1416; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
1417; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1418; CHECK-NEXT:    ret
1419;
1420; NONEON-NOSVE-LABEL: ucvtf_v2i64_v2f64:
1421; NONEON-NOSVE:       // %bb.0:
1422; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1423; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1424; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1425; NONEON-NOSVE-NEXT:    ucvtf d1, x9
1426; NONEON-NOSVE-NEXT:    ucvtf d0, x8
1427; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1428; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1429; NONEON-NOSVE-NEXT:    add sp, sp, #32
1430; NONEON-NOSVE-NEXT:    ret
1431  %res = uitofp <2 x i64> %op1 to <2 x double>
1432  ret <2 x double> %res
1433}
1434
1435define void @ucvtf_v4i64_v4f64(ptr %a, ptr %b) {
1436; CHECK-LABEL: ucvtf_v4i64_v4f64:
1437; CHECK:       // %bb.0:
1438; CHECK-NEXT:    ldp q0, q1, [x0]
1439; CHECK-NEXT:    ptrue p0.d, vl2
1440; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
1441; CHECK-NEXT:    ucvtf z1.d, p0/m, z1.d
1442; CHECK-NEXT:    stp q0, q1, [x1]
1443; CHECK-NEXT:    ret
1444;
1445; NONEON-NOSVE-LABEL: ucvtf_v4i64_v4f64:
1446; NONEON-NOSVE:       // %bb.0:
1447; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1448; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1449; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1450; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
1451; NONEON-NOSVE-NEXT:    ucvtf d1, x9
1452; NONEON-NOSVE-NEXT:    ucvtf d0, x8
1453; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
1454; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
1455; NONEON-NOSVE-NEXT:    ucvtf d1, x9
1456; NONEON-NOSVE-NEXT:    ucvtf d0, x8
1457; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1458; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1459; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
1460; NONEON-NOSVE-NEXT:    add sp, sp, #64
1461; NONEON-NOSVE-NEXT:    ret
1462  %op1 = load <4 x i64>, ptr %a
1463  %res = uitofp <4 x i64> %op1 to <4 x double>
1464  store <4 x double> %res, ptr %b
1465  ret void
1466}
1467
1468;
1469; SCVTF H -> H
1470;
1471
1472define <4 x half> @scvtf_v4i16_v4f16(<4 x i16> %op1) {
1473; CHECK-LABEL: scvtf_v4i16_v4f16:
1474; CHECK:       // %bb.0:
1475; CHECK-NEXT:    ptrue p0.h, vl4
1476; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1477; CHECK-NEXT:    scvtf z0.h, p0/m, z0.h
1478; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1479; CHECK-NEXT:    ret
1480;
1481; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f16:
1482; NONEON-NOSVE:       // %bb.0:
1483; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
1484; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1485; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #6]
1486; NONEON-NOSVE-NEXT:    scvtf s0, w8
1487; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
1488; NONEON-NOSVE-NEXT:    fcvt h0, s0
1489; NONEON-NOSVE-NEXT:    str h0, [sp, #14]
1490; NONEON-NOSVE-NEXT:    scvtf s0, w8
1491; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #2]
1492; NONEON-NOSVE-NEXT:    fcvt h0, s0
1493; NONEON-NOSVE-NEXT:    str h0, [sp, #12]
1494; NONEON-NOSVE-NEXT:    scvtf s0, w8
1495; NONEON-NOSVE-NEXT:    ldrsh w8, [sp]
1496; NONEON-NOSVE-NEXT:    fcvt h0, s0
1497; NONEON-NOSVE-NEXT:    str h0, [sp, #10]
1498; NONEON-NOSVE-NEXT:    scvtf s0, w8
1499; NONEON-NOSVE-NEXT:    fcvt h0, s0
1500; NONEON-NOSVE-NEXT:    str h0, [sp, #8]
1501; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1502; NONEON-NOSVE-NEXT:    add sp, sp, #16
1503; NONEON-NOSVE-NEXT:    ret
1504  %res = sitofp <4 x i16> %op1 to <4 x half>
1505  ret <4 x half> %res
1506}
1507
1508define void @scvtf_v8i16_v8f16(ptr %a, ptr %b) {
1509; CHECK-LABEL: scvtf_v8i16_v8f16:
1510; CHECK:       // %bb.0:
1511; CHECK-NEXT:    ptrue p0.h, vl8
1512; CHECK-NEXT:    ldr q0, [x0]
1513; CHECK-NEXT:    scvtf z0.h, p0/m, z0.h
1514; CHECK-NEXT:    str q0, [x1]
1515; CHECK-NEXT:    ret
1516;
1517; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f16:
1518; NONEON-NOSVE:       // %bb.0:
1519; NONEON-NOSVE-NEXT:    ldr q0, [x0]
1520; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1521; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1522; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #14]
1523; NONEON-NOSVE-NEXT:    scvtf s0, w8
1524; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1525; NONEON-NOSVE-NEXT:    fcvt h0, s0
1526; NONEON-NOSVE-NEXT:    str h0, [sp, #30]
1527; NONEON-NOSVE-NEXT:    scvtf s0, w8
1528; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #10]
1529; NONEON-NOSVE-NEXT:    fcvt h0, s0
1530; NONEON-NOSVE-NEXT:    str h0, [sp, #28]
1531; NONEON-NOSVE-NEXT:    scvtf s0, w8
1532; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1533; NONEON-NOSVE-NEXT:    fcvt h0, s0
1534; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
1535; NONEON-NOSVE-NEXT:    scvtf s0, w8
1536; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #6]
1537; NONEON-NOSVE-NEXT:    fcvt h0, s0
1538; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
1539; NONEON-NOSVE-NEXT:    scvtf s0, w8
1540; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
1541; NONEON-NOSVE-NEXT:    fcvt h0, s0
1542; NONEON-NOSVE-NEXT:    str h0, [sp, #22]
1543; NONEON-NOSVE-NEXT:    scvtf s0, w8
1544; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #2]
1545; NONEON-NOSVE-NEXT:    fcvt h0, s0
1546; NONEON-NOSVE-NEXT:    str h0, [sp, #20]
1547; NONEON-NOSVE-NEXT:    scvtf s0, w8
1548; NONEON-NOSVE-NEXT:    ldrsh w8, [sp]
1549; NONEON-NOSVE-NEXT:    fcvt h0, s0
1550; NONEON-NOSVE-NEXT:    str h0, [sp, #18]
1551; NONEON-NOSVE-NEXT:    scvtf s0, w8
1552; NONEON-NOSVE-NEXT:    fcvt h0, s0
1553; NONEON-NOSVE-NEXT:    str h0, [sp, #16]
1554; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1555; NONEON-NOSVE-NEXT:    str q0, [x1]
1556; NONEON-NOSVE-NEXT:    add sp, sp, #32
1557; NONEON-NOSVE-NEXT:    ret
1558  %op1 = load <8 x i16>, ptr %a
1559  %res = sitofp <8 x i16> %op1 to <8 x half>
1560  store <8 x half> %res, ptr %b
1561  ret void
1562}
1563
1564define void @scvtf_v16i16_v16f16(ptr %a, ptr %b) {
1565; CHECK-LABEL: scvtf_v16i16_v16f16:
1566; CHECK:       // %bb.0:
1567; CHECK-NEXT:    ldp q0, q1, [x0]
1568; CHECK-NEXT:    ptrue p0.h, vl8
1569; CHECK-NEXT:    scvtf z0.h, p0/m, z0.h
1570; CHECK-NEXT:    scvtf z1.h, p0/m, z1.h
1571; CHECK-NEXT:    stp q0, q1, [x1]
1572; CHECK-NEXT:    ret
1573;
1574; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f16:
1575; NONEON-NOSVE:       // %bb.0:
1576; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1577; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
1578; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1579; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
1580; NONEON-NOSVE-NEXT:    scvtf s0, w8
1581; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1582; NONEON-NOSVE-NEXT:    fcvt h0, s0
1583; NONEON-NOSVE-NEXT:    str h0, [sp, #62]
1584; NONEON-NOSVE-NEXT:    scvtf s0, w8
1585; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
1586; NONEON-NOSVE-NEXT:    fcvt h0, s0
1587; NONEON-NOSVE-NEXT:    str h0, [sp, #60]
1588; NONEON-NOSVE-NEXT:    scvtf s0, w8
1589; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1590; NONEON-NOSVE-NEXT:    fcvt h0, s0
1591; NONEON-NOSVE-NEXT:    str h0, [sp, #58]
1592; NONEON-NOSVE-NEXT:    scvtf s0, w8
1593; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
1594; NONEON-NOSVE-NEXT:    fcvt h0, s0
1595; NONEON-NOSVE-NEXT:    str h0, [sp, #56]
1596; NONEON-NOSVE-NEXT:    scvtf s0, w8
1597; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1598; NONEON-NOSVE-NEXT:    fcvt h0, s0
1599; NONEON-NOSVE-NEXT:    str h0, [sp, #54]
1600; NONEON-NOSVE-NEXT:    scvtf s0, w8
1601; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
1602; NONEON-NOSVE-NEXT:    fcvt h0, s0
1603; NONEON-NOSVE-NEXT:    str h0, [sp, #52]
1604; NONEON-NOSVE-NEXT:    scvtf s0, w8
1605; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1606; NONEON-NOSVE-NEXT:    fcvt h0, s0
1607; NONEON-NOSVE-NEXT:    str h0, [sp, #50]
1608; NONEON-NOSVE-NEXT:    scvtf s0, w8
1609; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #14]
1610; NONEON-NOSVE-NEXT:    fcvt h0, s0
1611; NONEON-NOSVE-NEXT:    str h0, [sp, #48]
1612; NONEON-NOSVE-NEXT:    scvtf s0, w8
1613; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1614; NONEON-NOSVE-NEXT:    fcvt h0, s0
1615; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
1616; NONEON-NOSVE-NEXT:    scvtf s0, w8
1617; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #10]
1618; NONEON-NOSVE-NEXT:    fcvt h0, s0
1619; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
1620; NONEON-NOSVE-NEXT:    scvtf s0, w8
1621; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1622; NONEON-NOSVE-NEXT:    fcvt h0, s0
1623; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
1624; NONEON-NOSVE-NEXT:    scvtf s0, w8
1625; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #6]
1626; NONEON-NOSVE-NEXT:    fcvt h0, s0
1627; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
1628; NONEON-NOSVE-NEXT:    scvtf s0, w8
1629; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
1630; NONEON-NOSVE-NEXT:    fcvt h0, s0
1631; NONEON-NOSVE-NEXT:    str h0, [sp, #38]
1632; NONEON-NOSVE-NEXT:    scvtf s0, w8
1633; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #2]
1634; NONEON-NOSVE-NEXT:    fcvt h0, s0
1635; NONEON-NOSVE-NEXT:    str h0, [sp, #36]
1636; NONEON-NOSVE-NEXT:    scvtf s0, w8
1637; NONEON-NOSVE-NEXT:    ldrsh w8, [sp]
1638; NONEON-NOSVE-NEXT:    fcvt h0, s0
1639; NONEON-NOSVE-NEXT:    str h0, [sp, #34]
1640; NONEON-NOSVE-NEXT:    scvtf s0, w8
1641; NONEON-NOSVE-NEXT:    fcvt h0, s0
1642; NONEON-NOSVE-NEXT:    str h0, [sp, #32]
1643; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1644; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
1645; NONEON-NOSVE-NEXT:    add sp, sp, #64
1646; NONEON-NOSVE-NEXT:    ret
1647  %op1 = load <16 x i16>, ptr %a
1648  %res = sitofp <16 x i16> %op1 to <16 x half>
1649  store <16 x half> %res, ptr %b
1650  ret void
1651}
1652
1653; SCVTF H -> S
1654;
1655
1656define <2 x float> @scvtf_v2i16_v2f32(<2 x i16> %op1) {
1657; CHECK-LABEL: scvtf_v2i16_v2f32:
1658; CHECK:       // %bb.0:
1659; CHECK-NEXT:    ptrue p0.s, vl2
1660; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1661; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
1662; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
1663; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
1664; CHECK-NEXT:    ret
1665;
1666; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f32:
1667; NONEON-NOSVE:       // %bb.0:
1668; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
1669; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
1670; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #4]
1671; NONEON-NOSVE-NEXT:    ldrsh w9, [sp]
1672; NONEON-NOSVE-NEXT:    scvtf s0, w8
1673; NONEON-NOSVE-NEXT:    scvtf s1, w9
1674; NONEON-NOSVE-NEXT:    stp s1, s0, [sp, #8]
1675; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1676; NONEON-NOSVE-NEXT:    add sp, sp, #16
1677; NONEON-NOSVE-NEXT:    ret
1678  %res = sitofp <2 x i16> %op1 to <2 x float>
1679  ret <2 x float> %res
1680}
1681
1682define <4 x float> @scvtf_v4i16_v4f32(<4 x i16> %op1) {
1683; CHECK-LABEL: scvtf_v4i16_v4f32:
1684; CHECK:       // %bb.0:
1685; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1686; CHECK-NEXT:    ptrue p0.s, vl4
1687; CHECK-NEXT:    sunpklo z0.s, z0.h
1688; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
1689; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1690; CHECK-NEXT:    ret
1691;
1692; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f32:
1693; NONEON-NOSVE:       // %bb.0:
1694; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1695; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1696; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
1697; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #14]
1698; NONEON-NOSVE-NEXT:    scvtf s1, w8
1699; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1700; NONEON-NOSVE-NEXT:    scvtf s0, w8
1701; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #10]
1702; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
1703; NONEON-NOSVE-NEXT:    scvtf s1, w8
1704; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1705; NONEON-NOSVE-NEXT:    scvtf s0, w8
1706; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
1707; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1708; NONEON-NOSVE-NEXT:    add sp, sp, #32
1709; NONEON-NOSVE-NEXT:    ret
1710  %res = sitofp <4 x i16> %op1 to <4 x float>
1711  ret <4 x float> %res
1712}
1713
1714define void @scvtf_v8i16_v8f32(ptr %a, ptr %b) {
1715; CHECK-LABEL: scvtf_v8i16_v8f32:
1716; CHECK:       // %bb.0:
1717; CHECK-NEXT:    ldr q0, [x0]
1718; CHECK-NEXT:    ptrue p0.s, vl4
1719; CHECK-NEXT:    sunpklo z1.s, z0.h
1720; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1721; CHECK-NEXT:    sunpklo z0.s, z0.h
1722; CHECK-NEXT:    scvtf z1.s, p0/m, z1.s
1723; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
1724; CHECK-NEXT:    stp q1, q0, [x1]
1725; CHECK-NEXT:    ret
1726;
1727; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f32:
1728; NONEON-NOSVE:       // %bb.0:
1729; NONEON-NOSVE-NEXT:    ldr q0, [x0]
1730; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
1731; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
1732; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1733; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1734; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #30]
1735; NONEON-NOSVE-NEXT:    scvtf s1, w8
1736; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1737; NONEON-NOSVE-NEXT:    scvtf s0, w8
1738; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #26]
1739; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
1740; NONEON-NOSVE-NEXT:    scvtf s1, w8
1741; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1742; NONEON-NOSVE-NEXT:    scvtf s0, w8
1743; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #22]
1744; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
1745; NONEON-NOSVE-NEXT:    scvtf s1, w8
1746; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1747; NONEON-NOSVE-NEXT:    scvtf s0, w8
1748; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #18]
1749; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
1750; NONEON-NOSVE-NEXT:    scvtf s1, w8
1751; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1752; NONEON-NOSVE-NEXT:    scvtf s0, w8
1753; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
1754; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
1755; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
1756; NONEON-NOSVE-NEXT:    add sp, sp, #64
1757; NONEON-NOSVE-NEXT:    ret
1758  %op1 = load <8 x i16>, ptr %a
1759  %res = sitofp <8 x i16> %op1 to <8 x float>
1760  store <8 x float> %res, ptr %b
1761  ret void
1762}
1763
1764define void @scvtf_v16i16_v16f32(ptr %a, ptr %b) {
1765; CHECK-LABEL: scvtf_v16i16_v16f32:
1766; CHECK:       // %bb.0:
1767; CHECK-NEXT:    ldp q1, q0, [x0]
1768; CHECK-NEXT:    ptrue p0.s, vl4
1769; CHECK-NEXT:    sunpklo z2.s, z0.h
1770; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1771; CHECK-NEXT:    sunpklo z3.s, z1.h
1772; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1773; CHECK-NEXT:    sunpklo z0.s, z0.h
1774; CHECK-NEXT:    sunpklo z1.s, z1.h
1775; CHECK-NEXT:    scvtf z2.s, p0/m, z2.s
1776; CHECK-NEXT:    scvtf z3.s, p0/m, z3.s
1777; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
1778; CHECK-NEXT:    scvtf z1.s, p0/m, z1.s
1779; CHECK-NEXT:    stp q2, q0, [x1, #32]
1780; CHECK-NEXT:    stp q3, q1, [x1]
1781; CHECK-NEXT:    ret
1782;
1783; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f32:
1784; NONEON-NOSVE:       // %bb.0:
1785; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
1786; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
1787; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
1788; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1789; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1790; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
1791; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #46]
1792; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
1793; NONEON-NOSVE-NEXT:    scvtf s1, w8
1794; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #44]
1795; NONEON-NOSVE-NEXT:    scvtf s0, w8
1796; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #42]
1797; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
1798; NONEON-NOSVE-NEXT:    scvtf s1, w8
1799; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #40]
1800; NONEON-NOSVE-NEXT:    scvtf s0, w8
1801; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #38]
1802; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
1803; NONEON-NOSVE-NEXT:    scvtf s1, w8
1804; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #36]
1805; NONEON-NOSVE-NEXT:    scvtf s0, w8
1806; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #34]
1807; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
1808; NONEON-NOSVE-NEXT:    scvtf s1, w8
1809; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #32]
1810; NONEON-NOSVE-NEXT:    scvtf s0, w8
1811; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #62]
1812; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #64]
1813; NONEON-NOSVE-NEXT:    scvtf s1, w8
1814; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #60]
1815; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
1816; NONEON-NOSVE-NEXT:    scvtf s0, w8
1817; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #58]
1818; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #120]
1819; NONEON-NOSVE-NEXT:    scvtf s1, w8
1820; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #56]
1821; NONEON-NOSVE-NEXT:    scvtf s0, w8
1822; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #54]
1823; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #112]
1824; NONEON-NOSVE-NEXT:    scvtf s1, w8
1825; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #52]
1826; NONEON-NOSVE-NEXT:    scvtf s0, w8
1827; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #50]
1828; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #104]
1829; NONEON-NOSVE-NEXT:    scvtf s1, w8
1830; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #48]
1831; NONEON-NOSVE-NEXT:    scvtf s0, w8
1832; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #96]
1833; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
1834; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
1835; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
1836; NONEON-NOSVE-NEXT:    add sp, sp, #128
1837; NONEON-NOSVE-NEXT:    ret
1838  %op1 = load <16 x i16>, ptr %a
1839  %res = sitofp <16 x i16> %op1 to <16 x float>
1840  store <16 x float> %res, ptr %b
1841  ret void
1842}
1843
1844;
1845; SCVTF H -> D
1846;
1847
1848define <2 x double> @scvtf_v2i16_v2f64(<2 x i16> %op1) {
1849; CHECK-LABEL: scvtf_v2i16_v2f64:
1850; CHECK:       // %bb.0:
1851; CHECK-NEXT:    ptrue p0.s, vl2
1852; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1853; CHECK-NEXT:    sxth z0.s, p0/m, z0.s
1854; CHECK-NEXT:    ptrue p0.d, vl2
1855; CHECK-NEXT:    sunpklo z0.d, z0.s
1856; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
1857; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
1858; CHECK-NEXT:    ret
1859;
1860; NONEON-NOSVE-LABEL: scvtf_v2i16_v2f64:
1861; NONEON-NOSVE:       // %bb.0:
1862; NONEON-NOSVE-NEXT:    sub sp, sp, #32
1863; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1864; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
1865; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1866; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #8]
1867; NONEON-NOSVE-NEXT:    scvtf d0, w8
1868; NONEON-NOSVE-NEXT:    scvtf d1, w9
1869; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #16]
1870; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
1871; NONEON-NOSVE-NEXT:    add sp, sp, #32
1872; NONEON-NOSVE-NEXT:    ret
1873  %res = sitofp <2 x i16> %op1 to <2 x double>
1874  ret <2 x double> %res
1875}
1876
1877define void @scvtf_v4i16_v4f64(ptr %a, ptr %b) {
1878; CHECK-LABEL: scvtf_v4i16_v4f64:
1879; CHECK:       // %bb.0:
1880; CHECK-NEXT:    ldr d0, [x0]
1881; CHECK-NEXT:    ptrue p0.d, vl2
1882; CHECK-NEXT:    sunpklo z0.s, z0.h
1883; CHECK-NEXT:    sunpklo z1.d, z0.s
1884; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1885; CHECK-NEXT:    sunpklo z0.d, z0.s
1886; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
1887; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
1888; CHECK-NEXT:    stp q1, q0, [x1]
1889; CHECK-NEXT:    ret
1890;
1891; NONEON-NOSVE-LABEL: scvtf_v4i16_v4f64:
1892; NONEON-NOSVE:       // %bb.0:
1893; NONEON-NOSVE-NEXT:    sub sp, sp, #80
1894; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
1895; NONEON-NOSVE-NEXT:    ldr d0, [x0]
1896; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
1897; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #10]
1898; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #8]
1899; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #24]
1900; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #14]
1901; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #12]
1902; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #16]
1903; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
1904; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
1905; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
1906; NONEON-NOSVE-NEXT:    scvtf d1, w9
1907; NONEON-NOSVE-NEXT:    scvtf d0, w8
1908; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
1909; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
1910; NONEON-NOSVE-NEXT:    scvtf d1, w9
1911; NONEON-NOSVE-NEXT:    scvtf d0, w8
1912; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
1913; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
1914; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
1915; NONEON-NOSVE-NEXT:    add sp, sp, #80
1916; NONEON-NOSVE-NEXT:    ret
1917  %op1 = load <4 x i16>, ptr %a
1918  %res = sitofp <4 x i16> %op1 to <4 x double>
1919  store <4 x double> %res, ptr %b
1920  ret void
1921}
1922
1923define void @scvtf_v8i16_v8f64(ptr %a, ptr %b) {
1924; CHECK-LABEL: scvtf_v8i16_v8f64:
1925; CHECK:       // %bb.0:
1926; CHECK-NEXT:    ldr q0, [x0]
1927; CHECK-NEXT:    ptrue p0.d, vl2
1928; CHECK-NEXT:    sunpklo z1.s, z0.h
1929; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1930; CHECK-NEXT:    sunpklo z0.s, z0.h
1931; CHECK-NEXT:    sunpklo z2.d, z1.s
1932; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
1933; CHECK-NEXT:    sunpklo z3.d, z0.s
1934; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
1935; CHECK-NEXT:    sunpklo z1.d, z1.s
1936; CHECK-NEXT:    scvtf z2.d, p0/m, z2.d
1937; CHECK-NEXT:    sunpklo z0.d, z0.s
1938; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
1939; CHECK-NEXT:    scvtf z3.d, p0/m, z3.d
1940; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
1941; CHECK-NEXT:    stp q2, q1, [x1]
1942; CHECK-NEXT:    stp q3, q0, [x1, #32]
1943; CHECK-NEXT:    ret
1944;
1945; NONEON-NOSVE-LABEL: scvtf_v8i16_v8f64:
1946; NONEON-NOSVE:       // %bb.0:
1947; NONEON-NOSVE-NEXT:    sub sp, sp, #160
1948; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
1949; NONEON-NOSVE-NEXT:    ldr q0, [x0]
1950; NONEON-NOSVE-NEXT:    str q0, [sp]
1951; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
1952; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
1953; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #26]
1954; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #24]
1955; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #56]
1956; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #30]
1957; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #28]
1958; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #48]
1959; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #18]
1960; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #16]
1961; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
1962; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #40]
1963; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #22]
1964; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #20]
1965; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #32]
1966; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
1967; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
1968; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]
1969; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
1970; NONEON-NOSVE-NEXT:    scvtf d1, w9
1971; NONEON-NOSVE-NEXT:    scvtf d0, w8
1972; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #80]
1973; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #144]
1974; NONEON-NOSVE-NEXT:    scvtf d1, w9
1975; NONEON-NOSVE-NEXT:    scvtf d0, w8
1976; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #72]
1977; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #128]
1978; NONEON-NOSVE-NEXT:    scvtf d1, w9
1979; NONEON-NOSVE-NEXT:    scvtf d0, w8
1980; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #64]
1981; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
1982; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
1983; NONEON-NOSVE-NEXT:    scvtf d1, w9
1984; NONEON-NOSVE-NEXT:    scvtf d0, w8
1985; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
1986; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
1987; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
1988; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
1989; NONEON-NOSVE-NEXT:    add sp, sp, #160
1990; NONEON-NOSVE-NEXT:    ret
1991  %op1 = load <8 x i16>, ptr %a
1992  %res = sitofp <8 x i16> %op1 to <8 x double>
1993  store <8 x double> %res, ptr %b
1994  ret void
1995}
1996
1997define void @scvtf_v16i16_v16f64(ptr %a, ptr %b) {
1998; CHECK-LABEL: scvtf_v16i16_v16f64:
1999; CHECK:       // %bb.0:
2000; CHECK-NEXT:    ldp q1, q0, [x0]
2001; CHECK-NEXT:    ptrue p0.d, vl2
2002; CHECK-NEXT:    mov z2.d, z0.d
2003; CHECK-NEXT:    sunpklo z3.s, z1.h
2004; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2005; CHECK-NEXT:    sunpklo z0.s, z0.h
2006; CHECK-NEXT:    ext z2.b, z2.b, z2.b, #8
2007; CHECK-NEXT:    sunpklo z1.s, z1.h
2008; CHECK-NEXT:    mov z5.d, z3.d
2009; CHECK-NEXT:    sunpklo z4.d, z0.s
2010; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2011; CHECK-NEXT:    sunpklo z2.s, z2.h
2012; CHECK-NEXT:    ext z5.b, z5.b, z3.b, #8
2013; CHECK-NEXT:    mov z7.d, z1.d
2014; CHECK-NEXT:    sunpklo z3.d, z3.s
2015; CHECK-NEXT:    sunpklo z0.d, z0.s
2016; CHECK-NEXT:    scvtf z4.d, p0/m, z4.d
2017; CHECK-NEXT:    mov z6.d, z2.d
2018; CHECK-NEXT:    sunpklo z5.d, z5.s
2019; CHECK-NEXT:    ext z7.b, z7.b, z1.b, #8
2020; CHECK-NEXT:    sunpklo z1.d, z1.s
2021; CHECK-NEXT:    scvtf z3.d, p0/m, z3.d
2022; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2023; CHECK-NEXT:    ext z6.b, z6.b, z2.b, #8
2024; CHECK-NEXT:    sunpklo z2.d, z2.s
2025; CHECK-NEXT:    sunpklo z7.d, z7.s
2026; CHECK-NEXT:    scvtf z5.d, p0/m, z5.d
2027; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
2028; CHECK-NEXT:    sunpklo z6.d, z6.s
2029; CHECK-NEXT:    stp q4, q0, [x1, #64]
2030; CHECK-NEXT:    scvtf z2.d, p0/m, z2.d
2031; CHECK-NEXT:    stp q3, q5, [x1]
2032; CHECK-NEXT:    movprfx z3, z7
2033; CHECK-NEXT:    scvtf z3.d, p0/m, z7.d
2034; CHECK-NEXT:    movprfx z0, z6
2035; CHECK-NEXT:    scvtf z0.d, p0/m, z6.d
2036; CHECK-NEXT:    stp q1, q3, [x1, #32]
2037; CHECK-NEXT:    stp q2, q0, [x1, #96]
2038; CHECK-NEXT:    ret
2039;
2040; NONEON-NOSVE-LABEL: scvtf_v16i16_v16f64:
2041; NONEON-NOSVE:       // %bb.0:
2042; NONEON-NOSVE-NEXT:    sub sp, sp, #336
2043; NONEON-NOSVE-NEXT:    str x29, [sp, #320] // 8-byte Folded Spill
2044; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 336
2045; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
2046; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
2047; NONEON-NOSVE-NEXT:    ldr x29, [sp, #320] // 8-byte Folded Reload
2048; NONEON-NOSVE-NEXT:    stp q0, q1, [sp]
2049; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2050; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #40]
2051; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
2052; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #50]
2053; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #48]
2054; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #96]
2055; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #54]
2056; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #52]
2057; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #56]
2058; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #88]
2059; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #42]
2060; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #40]
2061; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #88]
2062; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #80]
2063; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #46]
2064; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #44]
2065; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #72]
2066; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #66]
2067; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #64]
2068; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #152]
2069; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #72]
2070; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #128]
2071; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #70]
2072; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #68]
2073; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #120]
2074; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #58]
2075; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #56]
2076; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #136]
2077; NONEON-NOSVE-NEXT:    ldp d2, d1, [sp, #120]
2078; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #112]
2079; NONEON-NOSVE-NEXT:    ldrsh w9, [sp, #62]
2080; NONEON-NOSVE-NEXT:    ldrsh w8, [sp, #60]
2081; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
2082; NONEON-NOSVE-NEXT:    str d1, [sp, #328]
2083; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #104]
2084; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #160]
2085; NONEON-NOSVE-NEXT:    stp d1, d2, [sp, #176]
2086; NONEON-NOSVE-NEXT:    str d0, [sp, #168]
2087; NONEON-NOSVE-NEXT:    scvtf d1, w9
2088; NONEON-NOSVE-NEXT:    scvtf d0, w8
2089; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #152]
2090; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #240]
2091; NONEON-NOSVE-NEXT:    scvtf d1, w9
2092; NONEON-NOSVE-NEXT:    scvtf d0, w8
2093; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #144]
2094; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #224]
2095; NONEON-NOSVE-NEXT:    scvtf d1, w9
2096; NONEON-NOSVE-NEXT:    scvtf d0, w8
2097; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #136]
2098; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
2099; NONEON-NOSVE-NEXT:    scvtf d1, w9
2100; NONEON-NOSVE-NEXT:    scvtf d0, w8
2101; NONEON-NOSVE-NEXT:    ldr w8, [sp, #332]
2102; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #192]
2103; NONEON-NOSVE-NEXT:    scvtf d1, w8
2104; NONEON-NOSVE-NEXT:    ldr w8, [sp, #328]
2105; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #192]
2106; NONEON-NOSVE-NEXT:    scvtf d0, w8
2107; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #184]
2108; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #304]
2109; NONEON-NOSVE-NEXT:    scvtf d1, w9
2110; NONEON-NOSVE-NEXT:    scvtf d0, w8
2111; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #176]
2112; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #288]
2113; NONEON-NOSVE-NEXT:    scvtf d1, w9
2114; NONEON-NOSVE-NEXT:    scvtf d0, w8
2115; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #168]
2116; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #288]
2117; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #272]
2118; NONEON-NOSVE-NEXT:    scvtf d1, w9
2119; NONEON-NOSVE-NEXT:    scvtf d0, w8
2120; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #256]
2121; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #224]
2122; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #256]
2123; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
2124; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
2125; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
2126; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
2127; NONEON-NOSVE-NEXT:    add sp, sp, #336
2128; NONEON-NOSVE-NEXT:    ret
2129  %op1 = load <16 x i16>, ptr %a
2130  %res = sitofp <16 x i16> %op1 to <16 x double>
2131  store <16 x double> %res, ptr %b
2132  ret void
2133}
2134
2135;
2136; SCVTF S -> H
2137;
2138
2139define <2 x half> @scvtf_v2i32_v2f16(<2 x i32> %op1) {
2140; CHECK-LABEL: scvtf_v2i32_v2f16:
2141; CHECK:       // %bb.0:
2142; CHECK-NEXT:    ptrue p0.s, vl4
2143; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2144; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
2145; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2146; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2147; CHECK-NEXT:    ret
2148;
2149; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f16:
2150; NONEON-NOSVE:       // %bb.0:
2151; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2152; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2153; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2154; NONEON-NOSVE-NEXT:    str wzr, [sp, #12]
2155; NONEON-NOSVE-NEXT:    scvtf s0, w9
2156; NONEON-NOSVE-NEXT:    fcvt h0, s0
2157; NONEON-NOSVE-NEXT:    str h0, [sp, #10]
2158; NONEON-NOSVE-NEXT:    scvtf s0, w8
2159; NONEON-NOSVE-NEXT:    fcvt h0, s0
2160; NONEON-NOSVE-NEXT:    str h0, [sp, #8]
2161; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2162; NONEON-NOSVE-NEXT:    add sp, sp, #16
2163; NONEON-NOSVE-NEXT:    ret
2164  %res = sitofp <2 x i32> %op1 to <2 x half>
2165  ret <2 x half> %res
2166}
2167
2168define <4 x half> @scvtf_v4i32_v4f16(<4 x i32> %op1) {
2169; CHECK-LABEL: scvtf_v4i32_v4f16:
2170; CHECK:       // %bb.0:
2171; CHECK-NEXT:    ptrue p0.s, vl4
2172; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2173; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
2174; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2175; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2176; CHECK-NEXT:    ret
2177;
2178; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f16:
2179; NONEON-NOSVE:       // %bb.0:
2180; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2181; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2182; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
2183; NONEON-NOSVE-NEXT:    scvtf s0, w9
2184; NONEON-NOSVE-NEXT:    fcvt h0, s0
2185; NONEON-NOSVE-NEXT:    str h0, [sp, #30]
2186; NONEON-NOSVE-NEXT:    scvtf s0, w8
2187; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2188; NONEON-NOSVE-NEXT:    fcvt h0, s0
2189; NONEON-NOSVE-NEXT:    str h0, [sp, #28]
2190; NONEON-NOSVE-NEXT:    scvtf s0, w9
2191; NONEON-NOSVE-NEXT:    fcvt h0, s0
2192; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
2193; NONEON-NOSVE-NEXT:    scvtf s0, w8
2194; NONEON-NOSVE-NEXT:    fcvt h0, s0
2195; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
2196; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
2197; NONEON-NOSVE-NEXT:    add sp, sp, #32
2198; NONEON-NOSVE-NEXT:    ret
2199  %res = sitofp <4 x i32> %op1 to <4 x half>
2200  ret <4 x half> %res
2201}
2202
2203define <8 x half> @scvtf_v8i32_v8f16(ptr %a) {
2204; CHECK-LABEL: scvtf_v8i32_v8f16:
2205; CHECK:       // %bb.0:
2206; CHECK-NEXT:    ldp q0, q1, [x0]
2207; CHECK-NEXT:    ptrue p0.s, vl4
2208; CHECK-NEXT:    scvtf z1.h, p0/m, z1.s
2209; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
2210; CHECK-NEXT:    ptrue p0.h, vl4
2211; CHECK-NEXT:    uzp1 z1.h, z1.h, z1.h
2212; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2213; CHECK-NEXT:    splice z0.h, p0, z0.h, z1.h
2214; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2215; CHECK-NEXT:    ret
2216;
2217; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f16:
2218; NONEON-NOSVE:       // %bb.0:
2219; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2220; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
2221; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2222; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
2223; NONEON-NOSVE-NEXT:    scvtf s0, w9
2224; NONEON-NOSVE-NEXT:    fcvt h0, s0
2225; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
2226; NONEON-NOSVE-NEXT:    scvtf s0, w8
2227; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
2228; NONEON-NOSVE-NEXT:    fcvt h0, s0
2229; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
2230; NONEON-NOSVE-NEXT:    scvtf s0, w9
2231; NONEON-NOSVE-NEXT:    fcvt h0, s0
2232; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
2233; NONEON-NOSVE-NEXT:    scvtf s0, w8
2234; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
2235; NONEON-NOSVE-NEXT:    fcvt h0, s0
2236; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
2237; NONEON-NOSVE-NEXT:    scvtf s0, w9
2238; NONEON-NOSVE-NEXT:    fcvt h0, s0
2239; NONEON-NOSVE-NEXT:    str h0, [sp, #38]
2240; NONEON-NOSVE-NEXT:    scvtf s0, w8
2241; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2242; NONEON-NOSVE-NEXT:    fcvt h0, s0
2243; NONEON-NOSVE-NEXT:    str h0, [sp, #36]
2244; NONEON-NOSVE-NEXT:    scvtf s0, w9
2245; NONEON-NOSVE-NEXT:    fcvt h0, s0
2246; NONEON-NOSVE-NEXT:    str h0, [sp, #34]
2247; NONEON-NOSVE-NEXT:    scvtf s0, w8
2248; NONEON-NOSVE-NEXT:    fcvt h0, s0
2249; NONEON-NOSVE-NEXT:    str h0, [sp, #32]
2250; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2251; NONEON-NOSVE-NEXT:    add sp, sp, #48
2252; NONEON-NOSVE-NEXT:    ret
2253  %op1 = load <8 x i32>, ptr %a
2254  %res = sitofp <8 x i32> %op1 to <8 x half>
2255  ret <8 x half> %res
2256}
2257
2258;
2259; SCVTF S -> S
2260;
2261
2262define <2 x float> @scvtf_v2i32_v2f32(<2 x i32> %op1) {
2263; CHECK-LABEL: scvtf_v2i32_v2f32:
2264; CHECK:       // %bb.0:
2265; CHECK-NEXT:    ptrue p0.s, vl2
2266; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2267; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
2268; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2269; CHECK-NEXT:    ret
2270;
2271; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f32:
2272; NONEON-NOSVE:       // %bb.0:
2273; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
2274; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
2275; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2276; NONEON-NOSVE-NEXT:    scvtf s1, w9
2277; NONEON-NOSVE-NEXT:    scvtf s0, w8
2278; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #8]
2279; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
2280; NONEON-NOSVE-NEXT:    add sp, sp, #16
2281; NONEON-NOSVE-NEXT:    ret
2282  %res = sitofp <2 x i32> %op1 to <2 x float>
2283  ret <2 x float> %res
2284}
2285
2286define <4 x float> @scvtf_v4i32_v4f32(<4 x i32> %op1) {
2287; CHECK-LABEL: scvtf_v4i32_v4f32:
2288; CHECK:       // %bb.0:
2289; CHECK-NEXT:    ptrue p0.s, vl4
2290; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2291; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
2292; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2293; CHECK-NEXT:    ret
2294;
2295; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f32:
2296; NONEON-NOSVE:       // %bb.0:
2297; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2298; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2299; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
2300; NONEON-NOSVE-NEXT:    scvtf s1, w9
2301; NONEON-NOSVE-NEXT:    scvtf s0, w8
2302; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2303; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
2304; NONEON-NOSVE-NEXT:    scvtf s1, w9
2305; NONEON-NOSVE-NEXT:    scvtf s0, w8
2306; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
2307; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2308; NONEON-NOSVE-NEXT:    add sp, sp, #32
2309; NONEON-NOSVE-NEXT:    ret
2310  %res = sitofp <4 x i32> %op1 to <4 x float>
2311  ret <4 x float> %res
2312}
2313
2314define void @scvtf_v8i32_v8f32(ptr %a, ptr %b) {
2315; CHECK-LABEL: scvtf_v8i32_v8f32:
2316; CHECK:       // %bb.0:
2317; CHECK-NEXT:    ldp q0, q1, [x0]
2318; CHECK-NEXT:    ptrue p0.s, vl4
2319; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
2320; CHECK-NEXT:    scvtf z1.s, p0/m, z1.s
2321; CHECK-NEXT:    stp q0, q1, [x1]
2322; CHECK-NEXT:    ret
2323;
2324; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f32:
2325; NONEON-NOSVE:       // %bb.0:
2326; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2327; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2328; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2329; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
2330; NONEON-NOSVE-NEXT:    scvtf s1, w9
2331; NONEON-NOSVE-NEXT:    scvtf s0, w8
2332; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
2333; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
2334; NONEON-NOSVE-NEXT:    scvtf s1, w9
2335; NONEON-NOSVE-NEXT:    scvtf s0, w8
2336; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
2337; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
2338; NONEON-NOSVE-NEXT:    scvtf s1, w9
2339; NONEON-NOSVE-NEXT:    scvtf s0, w8
2340; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp]
2341; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
2342; NONEON-NOSVE-NEXT:    scvtf s1, w9
2343; NONEON-NOSVE-NEXT:    scvtf s0, w8
2344; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
2345; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2346; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
2347; NONEON-NOSVE-NEXT:    add sp, sp, #64
2348; NONEON-NOSVE-NEXT:    ret
2349  %op1 = load <8 x i32>, ptr %a
2350  %res = sitofp <8 x i32> %op1 to <8 x float>
2351  store <8 x float> %res, ptr %b
2352  ret void
2353}
2354
2355;
2356; SCVTF S -> D
2357;
2358
2359define <2 x double> @scvtf_v2i32_v2f64(<2 x i32> %op1) {
2360; CHECK-LABEL: scvtf_v2i32_v2f64:
2361; CHECK:       // %bb.0:
2362; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
2363; CHECK-NEXT:    ptrue p0.d, vl2
2364; CHECK-NEXT:    sunpklo z0.d, z0.s
2365; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2366; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2367; CHECK-NEXT:    ret
2368;
2369; NONEON-NOSVE-LABEL: scvtf_v2i32_v2f64:
2370; NONEON-NOSVE:       // %bb.0:
2371; NONEON-NOSVE-NEXT:    sub sp, sp, #32
2372; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2373; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
2374; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
2375; NONEON-NOSVE-NEXT:    scvtf d1, w9
2376; NONEON-NOSVE-NEXT:    scvtf d0, w8
2377; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2378; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2379; NONEON-NOSVE-NEXT:    add sp, sp, #32
2380; NONEON-NOSVE-NEXT:    ret
2381  %res = sitofp <2 x i32> %op1 to <2 x double>
2382  ret <2 x double> %res
2383}
2384
2385define void @scvtf_v4i32_v4f64(ptr %a, ptr %b) {
2386; CHECK-LABEL: scvtf_v4i32_v4f64:
2387; CHECK:       // %bb.0:
2388; CHECK-NEXT:    ldr q0, [x0]
2389; CHECK-NEXT:    ptrue p0.d, vl2
2390; CHECK-NEXT:    sunpklo z1.d, z0.s
2391; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2392; CHECK-NEXT:    sunpklo z0.d, z0.s
2393; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
2394; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2395; CHECK-NEXT:    stp q1, q0, [x1]
2396; CHECK-NEXT:    ret
2397;
2398; NONEON-NOSVE-LABEL: scvtf_v4i32_v4f64:
2399; NONEON-NOSVE:       // %bb.0:
2400; NONEON-NOSVE-NEXT:    ldr q0, [x0]
2401; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
2402; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2403; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2404; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2405; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #24]
2406; NONEON-NOSVE-NEXT:    scvtf d1, w9
2407; NONEON-NOSVE-NEXT:    scvtf d0, w8
2408; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #16]
2409; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
2410; NONEON-NOSVE-NEXT:    scvtf d1, w9
2411; NONEON-NOSVE-NEXT:    scvtf d0, w8
2412; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2413; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2414; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
2415; NONEON-NOSVE-NEXT:    add sp, sp, #64
2416; NONEON-NOSVE-NEXT:    ret
2417  %op1 = load <4 x i32>, ptr %a
2418  %res = sitofp <4 x i32> %op1 to <4 x double>
2419  store <4 x double> %res, ptr %b
2420  ret void
2421}
2422
2423define void @scvtf_v8i32_v8f64(ptr %a, ptr %b) {
2424; CHECK-LABEL: scvtf_v8i32_v8f64:
2425; CHECK:       // %bb.0:
2426; CHECK-NEXT:    ldp q1, q0, [x0]
2427; CHECK-NEXT:    ptrue p0.d, vl2
2428; CHECK-NEXT:    sunpklo z2.d, z0.s
2429; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
2430; CHECK-NEXT:    sunpklo z3.d, z1.s
2431; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
2432; CHECK-NEXT:    sunpklo z0.d, z0.s
2433; CHECK-NEXT:    sunpklo z1.d, z1.s
2434; CHECK-NEXT:    scvtf z2.d, p0/m, z2.d
2435; CHECK-NEXT:    scvtf z3.d, p0/m, z3.d
2436; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2437; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
2438; CHECK-NEXT:    stp q2, q0, [x1, #32]
2439; CHECK-NEXT:    stp q3, q1, [x1]
2440; CHECK-NEXT:    ret
2441;
2442; NONEON-NOSVE-LABEL: scvtf_v8i32_v8f64:
2443; NONEON-NOSVE:       // %bb.0:
2444; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
2445; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
2446; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
2447; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
2448; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2449; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
2450; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #40]
2451; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
2452; NONEON-NOSVE-NEXT:    scvtf d1, w9
2453; NONEON-NOSVE-NEXT:    scvtf d0, w8
2454; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #32]
2455; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
2456; NONEON-NOSVE-NEXT:    scvtf d1, w9
2457; NONEON-NOSVE-NEXT:    scvtf d0, w8
2458; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #56]
2459; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
2460; NONEON-NOSVE-NEXT:    scvtf d1, w9
2461; NONEON-NOSVE-NEXT:    scvtf d0, w8
2462; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #48]
2463; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
2464; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
2465; NONEON-NOSVE-NEXT:    scvtf d1, w9
2466; NONEON-NOSVE-NEXT:    scvtf d0, w8
2467; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
2468; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
2469; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
2470; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
2471; NONEON-NOSVE-NEXT:    add sp, sp, #128
2472; NONEON-NOSVE-NEXT:    ret
2473  %op1 = load <8 x i32>, ptr %a
2474  %res = sitofp <8 x i32> %op1 to <8 x double>
2475  store <8 x double> %res, ptr %b
2476  ret void
2477}
2478
2479define void @scvtf_v16i32_v16f64(ptr %a, ptr %b) {
2480; CHECK-LABEL: scvtf_v16i32_v16f64:
2481; CHECK:       // %bb.0:
2482; CHECK-NEXT:    ldp q1, q0, [x0, #32]
2483; CHECK-NEXT:    ptrue p0.d, vl2
2484; CHECK-NEXT:    ldp q5, q4, [x0]
2485; CHECK-NEXT:    mov z2.d, z0.d
2486; CHECK-NEXT:    mov z3.d, z1.d
2487; CHECK-NEXT:    mov z6.d, z4.d
2488; CHECK-NEXT:    mov z7.d, z5.d
2489; CHECK-NEXT:    ext z2.b, z2.b, z0.b, #8
2490; CHECK-NEXT:    ext z3.b, z3.b, z1.b, #8
2491; CHECK-NEXT:    sunpklo z0.d, z0.s
2492; CHECK-NEXT:    sunpklo z1.d, z1.s
2493; CHECK-NEXT:    ext z6.b, z6.b, z4.b, #8
2494; CHECK-NEXT:    ext z7.b, z7.b, z5.b, #8
2495; CHECK-NEXT:    sunpklo z4.d, z4.s
2496; CHECK-NEXT:    sunpklo z5.d, z5.s
2497; CHECK-NEXT:    sunpklo z2.d, z2.s
2498; CHECK-NEXT:    sunpklo z3.d, z3.s
2499; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2500; CHECK-NEXT:    sunpklo z6.d, z6.s
2501; CHECK-NEXT:    sunpklo z7.d, z7.s
2502; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
2503; CHECK-NEXT:    scvtf z4.d, p0/m, z4.d
2504; CHECK-NEXT:    scvtf z2.d, p0/m, z2.d
2505; CHECK-NEXT:    scvtf z3.d, p0/m, z3.d
2506; CHECK-NEXT:    stp q1, q3, [x1, #64]
2507; CHECK-NEXT:    movprfx z1, z7
2508; CHECK-NEXT:    scvtf z1.d, p0/m, z7.d
2509; CHECK-NEXT:    stp q0, q2, [x1, #96]
2510; CHECK-NEXT:    movprfx z0, z6
2511; CHECK-NEXT:    scvtf z0.d, p0/m, z6.d
2512; CHECK-NEXT:    movprfx z2, z5
2513; CHECK-NEXT:    scvtf z2.d, p0/m, z5.d
2514; CHECK-NEXT:    stp q2, q1, [x1]
2515; CHECK-NEXT:    stp q4, q0, [x1, #32]
2516; CHECK-NEXT:    ret
2517;
2518; NONEON-NOSVE-LABEL: scvtf_v16i32_v16f64:
2519; NONEON-NOSVE:       // %bb.0:
2520; NONEON-NOSVE-NEXT:    sub sp, sp, #272
2521; NONEON-NOSVE-NEXT:    str x29, [sp, #256] // 8-byte Folded Spill
2522; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 272
2523; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
2524; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
2525; NONEON-NOSVE-NEXT:    ldr x29, [sp, #256] // 8-byte Folded Reload
2526; NONEON-NOSVE-NEXT:    ldp q3, q2, [x0, #32]
2527; NONEON-NOSVE-NEXT:    str q1, [sp, #32]
2528; NONEON-NOSVE-NEXT:    stp q0, q2, [sp]
2529; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp]
2530; NONEON-NOSVE-NEXT:    str q3, [sp, #64]
2531; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #48]
2532; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
2533; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #48]
2534; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #104]
2535; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #64]
2536; NONEON-NOSVE-NEXT:    str d0, [sp, #264]
2537; NONEON-NOSVE-NEXT:    ldp d0, d2, [sp, #16]
2538; NONEON-NOSVE-NEXT:    stp d2, d0, [sp, #88]
2539; NONEON-NOSVE-NEXT:    scvtf d0, w8
2540; NONEON-NOSVE-NEXT:    scvtf d2, w9
2541; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #56]
2542; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #120]
2543; NONEON-NOSVE-NEXT:    scvtf d0, w9
2544; NONEON-NOSVE-NEXT:    str d0, [sp, #152]
2545; NONEON-NOSVE-NEXT:    scvtf d0, w8
2546; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #104]
2547; NONEON-NOSVE-NEXT:    stp d2, d0, [sp, #136]
2548; NONEON-NOSVE-NEXT:    scvtf d1, w9
2549; NONEON-NOSVE-NEXT:    scvtf d0, w8
2550; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #112]
2551; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #192]
2552; NONEON-NOSVE-NEXT:    scvtf d1, w9
2553; NONEON-NOSVE-NEXT:    scvtf d0, w8
2554; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #120]
2555; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
2556; NONEON-NOSVE-NEXT:    scvtf d1, w9
2557; NONEON-NOSVE-NEXT:    scvtf d0, w8
2558; NONEON-NOSVE-NEXT:    ldr w8, [sp, #268]
2559; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #224]
2560; NONEON-NOSVE-NEXT:    scvtf d1, w8
2561; NONEON-NOSVE-NEXT:    ldr w8, [sp, #264]
2562; NONEON-NOSVE-NEXT:    ldp q4, q6, [sp, #208]
2563; NONEON-NOSVE-NEXT:    scvtf d0, w8
2564; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #88]
2565; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #240]
2566; NONEON-NOSVE-NEXT:    scvtf d1, w9
2567; NONEON-NOSVE-NEXT:    scvtf d0, w8
2568; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #96]
2569; NONEON-NOSVE-NEXT:    ldr q7, [sp, #240]
2570; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #160]
2571; NONEON-NOSVE-NEXT:    scvtf d1, w9
2572; NONEON-NOSVE-NEXT:    scvtf d0, w8
2573; NONEON-NOSVE-NEXT:    ldr q5, [sp, #160]
2574; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #176]
2575; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #128]
2576; NONEON-NOSVE-NEXT:    ldp q2, q3, [sp, #176]
2577; NONEON-NOSVE-NEXT:    stp q7, q6, [x1, #64]
2578; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
2579; NONEON-NOSVE-NEXT:    stp q4, q3, [x1, #32]
2580; NONEON-NOSVE-NEXT:    stp q2, q5, [x1, #96]
2581; NONEON-NOSVE-NEXT:    add sp, sp, #272
2582; NONEON-NOSVE-NEXT:    ret
2583  %op1 = load <16 x i32>, ptr %a
2584  %res = sitofp <16 x i32> %op1 to <16 x double>
2585  store <16 x double> %res, ptr %b
2586  ret void
2587}
2588
2589;
2590; SCVTF D -> H
2591;
2592
2593define <2 x half> @scvtf_v2i64_v2f16(<2 x i64> %op1) {
2594; CHECK-LABEL: scvtf_v2i64_v2f16:
2595; CHECK:       // %bb.0:
2596; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2597; CHECK-NEXT:    mov z1.d, z0.d[1]
2598; CHECK-NEXT:    ptrue p0.d
2599; CHECK-NEXT:    scvtf z0.h, p0/m, z0.d
2600; CHECK-NEXT:    scvtf z1.h, p0/m, z1.d
2601; CHECK-NEXT:    zip1 z0.h, z0.h, z1.h
2602; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2603; CHECK-NEXT:    ret
2604;
2605; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f16:
2606; NONEON-NOSVE:       // %bb.0:
2607; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2608; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2609; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2610; NONEON-NOSVE-NEXT:    scvtf s0, x9
2611; NONEON-NOSVE-NEXT:    fcvt h0, s0
2612; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
2613; NONEON-NOSVE-NEXT:    scvtf s0, x8
2614; NONEON-NOSVE-NEXT:    fcvt h0, s0
2615; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
2616; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
2617; NONEON-NOSVE-NEXT:    add sp, sp, #32
2618; NONEON-NOSVE-NEXT:    ret
2619  %res = sitofp <2 x i64> %op1 to <2 x half>
2620  ret <2 x half> %res
2621}
2622
2623define <4 x half> @scvtf_v4i64_v4f16(ptr %a) {
2624; CHECK-LABEL: scvtf_v4i64_v4f16:
2625; CHECK:       // %bb.0:
2626; CHECK-NEXT:    ldp q0, q1, [x0]
2627; CHECK-NEXT:    ptrue p0.d, vl2
2628; CHECK-NEXT:    scvtf z1.s, p0/m, z1.d
2629; CHECK-NEXT:    scvtf z0.s, p0/m, z0.d
2630; CHECK-NEXT:    ptrue p0.s, vl2
2631; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
2632; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
2633; CHECK-NEXT:    splice z0.s, p0, z0.s, z1.s
2634; CHECK-NEXT:    ptrue p0.s
2635; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
2636; CHECK-NEXT:    uzp1 z0.h, z0.h, z0.h
2637; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2638; CHECK-NEXT:    ret
2639;
2640; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f16:
2641; NONEON-NOSVE:       // %bb.0:
2642; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2643; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
2644; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2645; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
2646; NONEON-NOSVE-NEXT:    scvtf s0, x9
2647; NONEON-NOSVE-NEXT:    fcvt h0, s0
2648; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
2649; NONEON-NOSVE-NEXT:    scvtf s0, x8
2650; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2651; NONEON-NOSVE-NEXT:    fcvt h0, s0
2652; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
2653; NONEON-NOSVE-NEXT:    scvtf s0, x9
2654; NONEON-NOSVE-NEXT:    fcvt h0, s0
2655; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
2656; NONEON-NOSVE-NEXT:    scvtf s0, x8
2657; NONEON-NOSVE-NEXT:    fcvt h0, s0
2658; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
2659; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]
2660; NONEON-NOSVE-NEXT:    add sp, sp, #48
2661; NONEON-NOSVE-NEXT:    ret
2662  %op1 = load <4 x i64>, ptr %a
2663  %res = sitofp <4 x i64> %op1 to <4 x half>
2664  ret <4 x half> %res
2665}
2666
2667;
2668; SCVTF D -> S
2669;
2670
2671define <2 x float> @scvtf_v2i64_v2f32(<2 x i64> %op1) {
2672; CHECK-LABEL: scvtf_v2i64_v2f32:
2673; CHECK:       // %bb.0:
2674; CHECK-NEXT:    ptrue p0.d, vl2
2675; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2676; CHECK-NEXT:    scvtf z0.s, p0/m, z0.d
2677; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
2678; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2679; CHECK-NEXT:    ret
2680;
2681; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f32:
2682; NONEON-NOSVE:       // %bb.0:
2683; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2684; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2685; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2686; NONEON-NOSVE-NEXT:    scvtf s1, x9
2687; NONEON-NOSVE-NEXT:    scvtf s0, x8
2688; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
2689; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
2690; NONEON-NOSVE-NEXT:    add sp, sp, #32
2691; NONEON-NOSVE-NEXT:    ret
2692  %res = sitofp <2 x i64> %op1 to <2 x float>
2693  ret <2 x float> %res
2694}
2695
2696define <4 x float> @scvtf_v4i64_v4f32(ptr %a) {
2697; CHECK-LABEL: scvtf_v4i64_v4f32:
2698; CHECK:       // %bb.0:
2699; CHECK-NEXT:    ldp q0, q1, [x0]
2700; CHECK-NEXT:    ptrue p0.d, vl2
2701; CHECK-NEXT:    scvtf z1.s, p0/m, z1.d
2702; CHECK-NEXT:    scvtf z0.s, p0/m, z0.d
2703; CHECK-NEXT:    ptrue p0.s, vl2
2704; CHECK-NEXT:    uzp1 z1.s, z1.s, z1.s
2705; CHECK-NEXT:    uzp1 z0.s, z0.s, z0.s
2706; CHECK-NEXT:    splice z0.s, p0, z0.s, z1.s
2707; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2708; CHECK-NEXT:    ret
2709;
2710; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f32:
2711; NONEON-NOSVE:       // %bb.0:
2712; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2713; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
2714; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
2715; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
2716; NONEON-NOSVE-NEXT:    scvtf s1, x9
2717; NONEON-NOSVE-NEXT:    scvtf s0, x8
2718; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2719; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
2720; NONEON-NOSVE-NEXT:    scvtf s1, x9
2721; NONEON-NOSVE-NEXT:    scvtf s0, x8
2722; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
2723; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
2724; NONEON-NOSVE-NEXT:    add sp, sp, #48
2725; NONEON-NOSVE-NEXT:    ret
2726  %op1 = load <4 x i64>, ptr %a
2727  %res = sitofp <4 x i64> %op1 to <4 x float>
2728  ret <4 x float> %res
2729}
2730
2731;
2732; SCVTF D -> D
2733;
2734
2735define <2 x double> @scvtf_v2i64_v2f64(<2 x i64> %op1) {
2736; CHECK-LABEL: scvtf_v2i64_v2f64:
2737; CHECK:       // %bb.0:
2738; CHECK-NEXT:    ptrue p0.d, vl2
2739; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
2740; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2741; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
2742; CHECK-NEXT:    ret
2743;
2744; NONEON-NOSVE-LABEL: scvtf_v2i64_v2f64:
2745; NONEON-NOSVE:       // %bb.0:
2746; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
2747; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
2748; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2749; NONEON-NOSVE-NEXT:    scvtf d1, x9
2750; NONEON-NOSVE-NEXT:    scvtf d0, x8
2751; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
2752; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
2753; NONEON-NOSVE-NEXT:    add sp, sp, #32
2754; NONEON-NOSVE-NEXT:    ret
2755  %res = sitofp <2 x i64> %op1 to <2 x double>
2756  ret <2 x double> %res
2757}
2758
2759define void @scvtf_v4i64_v4f64(ptr %a, ptr %b) {
2760; CHECK-LABEL: scvtf_v4i64_v4f64:
2761; CHECK:       // %bb.0:
2762; CHECK-NEXT:    ldp q0, q1, [x0]
2763; CHECK-NEXT:    ptrue p0.d, vl2
2764; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2765; CHECK-NEXT:    scvtf z1.d, p0/m, z1.d
2766; CHECK-NEXT:    stp q0, q1, [x1]
2767; CHECK-NEXT:    ret
2768;
2769; NONEON-NOSVE-LABEL: scvtf_v4i64_v4f64:
2770; NONEON-NOSVE:       // %bb.0:
2771; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
2772; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-64]!
2773; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
2774; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp, #16]
2775; NONEON-NOSVE-NEXT:    scvtf d1, x9
2776; NONEON-NOSVE-NEXT:    scvtf d0, x8
2777; NONEON-NOSVE-NEXT:    ldp x8, x9, [sp]
2778; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
2779; NONEON-NOSVE-NEXT:    scvtf d1, x9
2780; NONEON-NOSVE-NEXT:    scvtf d0, x8
2781; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
2782; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
2783; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
2784; NONEON-NOSVE-NEXT:    add sp, sp, #64
2785; NONEON-NOSVE-NEXT:    ret
2786  %op1 = load <4 x i64>, ptr %a
2787  %res = sitofp <4 x i64> %op1 to <4 x double>
2788  store <4 x double> %res, ptr %b
2789  ret void
2790}
2791
2792define half @scvtf_i16_f16(ptr %0) {
2793; CHECK-LABEL: scvtf_i16_f16:
2794; CHECK:       // %bb.0:
2795; CHECK-NEXT:    ldrsh w8, [x0]
2796; CHECK-NEXT:    ptrue p0.s
2797; CHECK-NEXT:    fmov s0, w8
2798; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
2799; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
2800; CHECK-NEXT:    ret
2801;
2802; NONEON-NOSVE-LABEL: scvtf_i16_f16:
2803; NONEON-NOSVE:       // %bb.0:
2804; NONEON-NOSVE-NEXT:    ldrsh w8, [x0]
2805; NONEON-NOSVE-NEXT:    scvtf s0, w8
2806; NONEON-NOSVE-NEXT:    fcvt h0, s0
2807; NONEON-NOSVE-NEXT:    ret
2808  %2 = load i16, ptr %0, align 64
2809  %3 = sitofp i16 %2 to half
2810  ret half %3
2811}
2812
2813define float @scvtf_i16_f32(ptr %0) {
2814; CHECK-LABEL: scvtf_i16_f32:
2815; CHECK:       // %bb.0:
2816; CHECK-NEXT:    ldrsh w8, [x0]
2817; CHECK-NEXT:    ptrue p0.s
2818; CHECK-NEXT:    fmov s0, w8
2819; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
2820; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
2821; CHECK-NEXT:    ret
2822;
2823; NONEON-NOSVE-LABEL: scvtf_i16_f32:
2824; NONEON-NOSVE:       // %bb.0:
2825; NONEON-NOSVE-NEXT:    ldrsh w8, [x0]
2826; NONEON-NOSVE-NEXT:    scvtf s0, w8
2827; NONEON-NOSVE-NEXT:    ret
2828  %2 = load i16, ptr %0, align 64
2829  %3 = sitofp i16 %2 to float
2830  ret float %3
2831}
2832
2833define double @scvtf_i16_f64(ptr %0) {
2834; CHECK-LABEL: scvtf_i16_f64:
2835; CHECK:       // %bb.0:
2836; CHECK-NEXT:    ldrsh w8, [x0]
2837; CHECK-NEXT:    scvtf d0, w8
2838; CHECK-NEXT:    ret
2839;
2840; NONEON-NOSVE-LABEL: scvtf_i16_f64:
2841; NONEON-NOSVE:       // %bb.0:
2842; NONEON-NOSVE-NEXT:    ldrsh w8, [x0]
2843; NONEON-NOSVE-NEXT:    scvtf d0, w8
2844; NONEON-NOSVE-NEXT:    ret
2845  %2 = load i16, ptr %0, align 64
2846  %3 = sitofp i16 %2 to double
2847  ret double %3
2848}
2849
2850define half @scvtf_i32_f16(ptr %0) {
2851; CHECK-LABEL: scvtf_i32_f16:
2852; CHECK:       // %bb.0:
2853; CHECK-NEXT:    ptrue p0.s
2854; CHECK-NEXT:    ldr s0, [x0]
2855; CHECK-NEXT:    scvtf z0.h, p0/m, z0.s
2856; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
2857; CHECK-NEXT:    ret
2858;
2859; NONEON-NOSVE-LABEL: scvtf_i32_f16:
2860; NONEON-NOSVE:       // %bb.0:
2861; NONEON-NOSVE-NEXT:    ldr w8, [x0]
2862; NONEON-NOSVE-NEXT:    scvtf s0, w8
2863; NONEON-NOSVE-NEXT:    fcvt h0, s0
2864; NONEON-NOSVE-NEXT:    ret
2865  %2 = load i32, ptr %0, align 64
2866  %3 = sitofp i32 %2 to half
2867  ret half %3
2868}
2869
2870define float @scvtf_i32_f32(ptr %0) {
2871; CHECK-LABEL: scvtf_i32_f32:
2872; CHECK:       // %bb.0:
2873; CHECK-NEXT:    ptrue p0.s
2874; CHECK-NEXT:    ldr s0, [x0]
2875; CHECK-NEXT:    scvtf z0.s, p0/m, z0.s
2876; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
2877; CHECK-NEXT:    ret
2878;
2879; NONEON-NOSVE-LABEL: scvtf_i32_f32:
2880; NONEON-NOSVE:       // %bb.0:
2881; NONEON-NOSVE-NEXT:    ldr w8, [x0]
2882; NONEON-NOSVE-NEXT:    scvtf s0, w8
2883; NONEON-NOSVE-NEXT:    ret
2884  %2 = load i32, ptr %0, align 64
2885  %3 = sitofp i32 %2 to float
2886  ret float %3
2887}
2888
2889define double @scvtf_i32_f64(ptr %0) {
2890; CHECK-LABEL: scvtf_i32_f64:
2891; CHECK:       // %bb.0:
2892; CHECK-NEXT:    ldr w8, [x0]
2893; CHECK-NEXT:    scvtf d0, w8
2894; CHECK-NEXT:    ret
2895;
2896; NONEON-NOSVE-LABEL: scvtf_i32_f64:
2897; NONEON-NOSVE:       // %bb.0:
2898; NONEON-NOSVE-NEXT:    ldr w8, [x0]
2899; NONEON-NOSVE-NEXT:    scvtf d0, w8
2900; NONEON-NOSVE-NEXT:    ret
2901  %2 = load i32, ptr %0, align 64
2902  %3 = sitofp i32 %2 to double
2903  ret double %3
2904}
2905
2906define half @scvtf_i64_f16(ptr %0) {
2907; CHECK-LABEL: scvtf_i64_f16:
2908; CHECK:       // %bb.0:
2909; CHECK-NEXT:    ptrue p0.d
2910; CHECK-NEXT:    ldr d0, [x0]
2911; CHECK-NEXT:    scvtf z0.h, p0/m, z0.d
2912; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
2913; CHECK-NEXT:    ret
2914;
2915; NONEON-NOSVE-LABEL: scvtf_i64_f16:
2916; NONEON-NOSVE:       // %bb.0:
2917; NONEON-NOSVE-NEXT:    ldr x8, [x0]
2918; NONEON-NOSVE-NEXT:    scvtf s0, x8
2919; NONEON-NOSVE-NEXT:    fcvt h0, s0
2920; NONEON-NOSVE-NEXT:    ret
2921  %2 = load i64, ptr %0, align 64
2922  %3 = sitofp i64 %2 to half
2923  ret half %3
2924}
2925
2926define float @scvtf_i64_f32(ptr %0) {
2927; CHECK-LABEL: scvtf_i64_f32:
2928; CHECK:       // %bb.0:
2929; CHECK-NEXT:    ptrue p0.d
2930; CHECK-NEXT:    ldr d0, [x0]
2931; CHECK-NEXT:    scvtf z0.s, p0/m, z0.d
2932; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
2933; CHECK-NEXT:    ret
2934;
2935; NONEON-NOSVE-LABEL: scvtf_i64_f32:
2936; NONEON-NOSVE:       // %bb.0:
2937; NONEON-NOSVE-NEXT:    ldr x8, [x0]
2938; NONEON-NOSVE-NEXT:    scvtf s0, x8
2939; NONEON-NOSVE-NEXT:    ret
2940  %2 = load i64, ptr %0, align 64
2941  %3 = sitofp i64 %2 to float
2942  ret float %3
2943}
2944
2945define double @scvtf_i64_f64(ptr %0) {
2946; CHECK-LABEL: scvtf_i64_f64:
2947; CHECK:       // %bb.0:
2948; CHECK-NEXT:    ptrue p0.d
2949; CHECK-NEXT:    ldr d0, [x0]
2950; CHECK-NEXT:    scvtf z0.d, p0/m, z0.d
2951; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
2952; CHECK-NEXT:    ret
2953;
2954; NONEON-NOSVE-LABEL: scvtf_i64_f64:
2955; NONEON-NOSVE:       // %bb.0:
2956; NONEON-NOSVE-NEXT:    ldr x8, [x0]
2957; NONEON-NOSVE-NEXT:    scvtf d0, x8
2958; NONEON-NOSVE-NEXT:    ret
2959  %2 = load i64, ptr %0, align 64
2960  %3 = sitofp i64 %2 to double
2961  ret double %3
2962}
2963
2964define half @ucvtf_i16_f16(ptr %0) {
2965; CHECK-LABEL: ucvtf_i16_f16:
2966; CHECK:       // %bb.0:
2967; CHECK-NEXT:    ldrh w8, [x0]
2968; CHECK-NEXT:    ptrue p0.s
2969; CHECK-NEXT:    fmov s0, w8
2970; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
2971; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
2972; CHECK-NEXT:    ret
2973;
2974; NONEON-NOSVE-LABEL: ucvtf_i16_f16:
2975; NONEON-NOSVE:       // %bb.0:
2976; NONEON-NOSVE-NEXT:    ldrh w8, [x0]
2977; NONEON-NOSVE-NEXT:    ucvtf s0, w8
2978; NONEON-NOSVE-NEXT:    fcvt h0, s0
2979; NONEON-NOSVE-NEXT:    ret
2980  %2 = load i16, ptr %0, align 64
2981  %3 = uitofp i16 %2 to half
2982  ret half %3
2983}
2984
2985define float @ucvtf_i16_f32(ptr %0) {
2986; CHECK-LABEL: ucvtf_i16_f32:
2987; CHECK:       // %bb.0:
2988; CHECK-NEXT:    ldrh w8, [x0]
2989; CHECK-NEXT:    ptrue p0.s
2990; CHECK-NEXT:    fmov s0, w8
2991; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
2992; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
2993; CHECK-NEXT:    ret
2994;
2995; NONEON-NOSVE-LABEL: ucvtf_i16_f32:
2996; NONEON-NOSVE:       // %bb.0:
2997; NONEON-NOSVE-NEXT:    ldrh w8, [x0]
2998; NONEON-NOSVE-NEXT:    ucvtf s0, w8
2999; NONEON-NOSVE-NEXT:    ret
3000  %2 = load i16, ptr %0, align 64
3001  %3 = uitofp i16 %2 to float
3002  ret float %3
3003}
3004
3005define double @ucvtf_i16_f64(ptr %0) {
3006; CHECK-LABEL: ucvtf_i16_f64:
3007; CHECK:       // %bb.0:
3008; CHECK-NEXT:    ldrh w8, [x0]
3009; CHECK-NEXT:    ucvtf d0, w8
3010; CHECK-NEXT:    ret
3011;
3012; NONEON-NOSVE-LABEL: ucvtf_i16_f64:
3013; NONEON-NOSVE:       // %bb.0:
3014; NONEON-NOSVE-NEXT:    ldrh w8, [x0]
3015; NONEON-NOSVE-NEXT:    ucvtf d0, w8
3016; NONEON-NOSVE-NEXT:    ret
3017  %2 = load i16, ptr %0, align 64
3018  %3 = uitofp i16 %2 to double
3019  ret double %3
3020}
3021
3022define half @ucvtf_i32_f16(ptr %0) {
3023; CHECK-LABEL: ucvtf_i32_f16:
3024; CHECK:       // %bb.0:
3025; CHECK-NEXT:    ptrue p0.s
3026; CHECK-NEXT:    ldr s0, [x0]
3027; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.s
3028; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
3029; CHECK-NEXT:    ret
3030;
3031; NONEON-NOSVE-LABEL: ucvtf_i32_f16:
3032; NONEON-NOSVE:       // %bb.0:
3033; NONEON-NOSVE-NEXT:    ldr w8, [x0]
3034; NONEON-NOSVE-NEXT:    ucvtf s0, w8
3035; NONEON-NOSVE-NEXT:    fcvt h0, s0
3036; NONEON-NOSVE-NEXT:    ret
3037  %2 = load i32, ptr %0, align 64
3038  %3 = uitofp i32 %2 to half
3039  ret half %3
3040}
3041
3042define float @ucvtf_i32_f32(ptr %0) {
3043; CHECK-LABEL: ucvtf_i32_f32:
3044; CHECK:       // %bb.0:
3045; CHECK-NEXT:    ptrue p0.s
3046; CHECK-NEXT:    ldr s0, [x0]
3047; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.s
3048; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
3049; CHECK-NEXT:    ret
3050;
3051; NONEON-NOSVE-LABEL: ucvtf_i32_f32:
3052; NONEON-NOSVE:       // %bb.0:
3053; NONEON-NOSVE-NEXT:    ldr w8, [x0]
3054; NONEON-NOSVE-NEXT:    ucvtf s0, w8
3055; NONEON-NOSVE-NEXT:    ret
3056  %2 = load i32, ptr %0, align 64
3057  %3 = uitofp i32 %2 to float
3058  ret float %3
3059}
3060
3061define double @ucvtf_i32_f64(ptr %0) {
3062; CHECK-LABEL: ucvtf_i32_f64:
3063; CHECK:       // %bb.0:
3064; CHECK-NEXT:    ldr w8, [x0]
3065; CHECK-NEXT:    ucvtf d0, w8
3066; CHECK-NEXT:    ret
3067;
3068; NONEON-NOSVE-LABEL: ucvtf_i32_f64:
3069; NONEON-NOSVE:       // %bb.0:
3070; NONEON-NOSVE-NEXT:    ldr w8, [x0]
3071; NONEON-NOSVE-NEXT:    ucvtf d0, w8
3072; NONEON-NOSVE-NEXT:    ret
3073  %2 = load i32, ptr %0, align 64
3074  %3 = uitofp i32 %2 to double
3075  ret double %3
3076}
3077
3078define half @ucvtf_i64_f16(ptr %0) {
3079; CHECK-LABEL: ucvtf_i64_f16:
3080; CHECK:       // %bb.0:
3081; CHECK-NEXT:    ptrue p0.d
3082; CHECK-NEXT:    ldr d0, [x0]
3083; CHECK-NEXT:    ucvtf z0.h, p0/m, z0.d
3084; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
3085; CHECK-NEXT:    ret
3086;
3087; NONEON-NOSVE-LABEL: ucvtf_i64_f16:
3088; NONEON-NOSVE:       // %bb.0:
3089; NONEON-NOSVE-NEXT:    ldr x8, [x0]
3090; NONEON-NOSVE-NEXT:    ucvtf s0, x8
3091; NONEON-NOSVE-NEXT:    fcvt h0, s0
3092; NONEON-NOSVE-NEXT:    ret
3093  %2 = load i64, ptr %0, align 64
3094  %3 = uitofp i64 %2 to half
3095  ret half %3
3096}
3097
3098define float @ucvtf_i64_f32(ptr %0) {
3099; CHECK-LABEL: ucvtf_i64_f32:
3100; CHECK:       // %bb.0:
3101; CHECK-NEXT:    ptrue p0.d
3102; CHECK-NEXT:    ldr d0, [x0]
3103; CHECK-NEXT:    ucvtf z0.s, p0/m, z0.d
3104; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
3105; CHECK-NEXT:    ret
3106;
3107; NONEON-NOSVE-LABEL: ucvtf_i64_f32:
3108; NONEON-NOSVE:       // %bb.0:
3109; NONEON-NOSVE-NEXT:    ldr x8, [x0]
3110; NONEON-NOSVE-NEXT:    ucvtf s0, x8
3111; NONEON-NOSVE-NEXT:    ret
3112  %2 = load i64, ptr %0, align 64
3113  %3 = uitofp i64 %2 to float
3114  ret float %3
3115}
3116
3117define double @ucvtf_i64_f64(ptr %0) {
3118; CHECK-LABEL: ucvtf_i64_f64:
3119; CHECK:       // %bb.0:
3120; CHECK-NEXT:    ptrue p0.d
3121; CHECK-NEXT:    ldr d0, [x0]
3122; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
3123; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
3124; CHECK-NEXT:    ret
3125;
3126; NONEON-NOSVE-LABEL: ucvtf_i64_f64:
3127; NONEON-NOSVE:       // %bb.0:
3128; NONEON-NOSVE-NEXT:    ldr x8, [x0]
3129; NONEON-NOSVE-NEXT:    ucvtf d0, x8
3130; NONEON-NOSVE-NEXT:    ret
3131  %2 = load i64, ptr %0, align 64
3132  %3 = uitofp i64 %2 to double
3133  ret double %3
3134}
3135