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