[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-fp-extend-trunc.ll
blobc96189b96026856144b31cbe31aea2bdd7651ce6
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 -mattr=+sme -force-streaming  < %s | FileCheck %s
4 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6 target triple = "aarch64-unknown-linux-gnu"
9 ; FCVT H -> S; Without load instr
12 define void @fcvt_v2f16_to_v2f32(<2 x half> %a, ptr %b) {
13 ; CHECK-LABEL: fcvt_v2f16_to_v2f32:
14 ; CHECK:       // %bb.0:
15 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16 ; CHECK-NEXT:    ptrue p0.s, vl4
17 ; CHECK-NEXT:    uunpklo z0.s, z0.h
18 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
19 ; CHECK-NEXT:    str d0, [x0]
20 ; CHECK-NEXT:    ret
22 ; NONEON-NOSVE-LABEL: fcvt_v2f16_to_v2f32:
23 ; NONEON-NOSVE:       // %bb.0:
24 ; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
25 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
26 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #2]
27 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
28 ; NONEON-NOSVE-NEXT:    ldr h0, [sp]
29 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
30 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #8]
31 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
32 ; NONEON-NOSVE-NEXT:    str d0, [x0]
33 ; NONEON-NOSVE-NEXT:    add sp, sp, #16
34 ; NONEON-NOSVE-NEXT:    ret
35   %res = fpext <2 x half> %a to <2 x float>
36   store <2 x float> %res, ptr %b
37   ret void
40 define void @fcvt_v4f16_to_v4f32(<4 x half> %a, ptr %b) {
41 ; CHECK-LABEL: fcvt_v4f16_to_v4f32:
42 ; CHECK:       // %bb.0:
43 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
44 ; CHECK-NEXT:    ptrue p0.s, vl4
45 ; CHECK-NEXT:    uunpklo z0.s, z0.h
46 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
47 ; CHECK-NEXT:    str q0, [x0]
48 ; CHECK-NEXT:    ret
50 ; NONEON-NOSVE-LABEL: fcvt_v4f16_to_v4f32:
51 ; NONEON-NOSVE:       // %bb.0:
52 ; NONEON-NOSVE-NEXT:    sub sp, sp, #32
53 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
54 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
55 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
56 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
57 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #12]
58 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
59 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
60 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #10]
61 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
62 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #8]
63 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
64 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
65 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
66 ; NONEON-NOSVE-NEXT:    str q0, [x0]
67 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
68 ; NONEON-NOSVE-NEXT:    ret
69   %res = fpext <4 x half> %a to <4 x float>
70   store <4 x float> %res, ptr %b
71   ret void
74 define void @fcvt_v8f16_to_v8f32(<8 x half> %a, ptr %b) {
75 ; CHECK-LABEL: fcvt_v8f16_to_v8f32:
76 ; CHECK:       // %bb.0:
77 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
78 ; CHECK-NEXT:    uunpklo z1.s, z0.h
79 ; CHECK-NEXT:    ptrue p0.s, vl4
80 ; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
81 ; CHECK-NEXT:    uunpklo z0.s, z0.h
82 ; CHECK-NEXT:    fcvt z1.s, p0/m, z1.h
83 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
84 ; CHECK-NEXT:    stp q1, q0, [x0]
85 ; CHECK-NEXT:    ret
87 ; NONEON-NOSVE-LABEL: fcvt_v8f16_to_v8f32:
88 ; NONEON-NOSVE:       // %bb.0:
89 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
90 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
91 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
92 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
93 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
94 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
95 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
96 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
97 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
98 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
99 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
100 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
101 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
102 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
103 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
104 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
105 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
106 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
107 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
108 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
109 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
110 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
111 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
112 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
113 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
114 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x0]
115 ; NONEON-NOSVE-NEXT:    add sp, sp, #64
116 ; NONEON-NOSVE-NEXT:    ret
117   %res = fpext <8 x half> %a to <8 x float>
118   store <8 x float> %res, ptr %b
119   ret void
122 define void @fcvt_v16f16_to_v16f32(<16 x half> %a, ptr %b) {
123 ; CHECK-LABEL: fcvt_v16f16_to_v16f32:
124 ; CHECK:       // %bb.0:
125 ; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
126 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
127 ; CHECK-NEXT:    uunpklo z2.s, z1.h
128 ; CHECK-NEXT:    uunpklo z3.s, z0.h
129 ; CHECK-NEXT:    ptrue p0.s, vl4
130 ; CHECK-NEXT:    ext z1.b, z1.b, z1.b, #8
131 ; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
132 ; CHECK-NEXT:    uunpklo z1.s, z1.h
133 ; CHECK-NEXT:    uunpklo z0.s, z0.h
134 ; CHECK-NEXT:    fcvt z2.s, p0/m, z2.h
135 ; CHECK-NEXT:    fcvt z3.s, p0/m, z3.h
136 ; CHECK-NEXT:    fcvt z1.s, p0/m, z1.h
137 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
138 ; CHECK-NEXT:    stp q3, q0, [x0]
139 ; CHECK-NEXT:    stp q2, q1, [x0, #32]
140 ; CHECK-NEXT:    ret
142 ; NONEON-NOSVE-LABEL: fcvt_v16f16_to_v16f32:
143 ; NONEON-NOSVE:       // %bb.0:
144 ; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
145 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
146 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
147 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
148 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
149 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
150 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #46]
151 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
152 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #44]
153 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
154 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
155 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #42]
156 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
157 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #40]
158 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
159 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
160 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #38]
161 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
162 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #36]
163 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
164 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
165 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #34]
166 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
167 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #32]
168 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
169 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #64]
170 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
171 ; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
172 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
173 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
174 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
175 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #120]
176 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
177 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
178 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
179 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
180 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #112]
181 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
182 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
183 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
184 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
185 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #104]
186 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
187 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
188 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
189 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
190 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #96]
191 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
192 ; NONEON-NOSVE-NEXT:    stp q2, q3, [x0]
193 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x0, #32]
194 ; NONEON-NOSVE-NEXT:    add sp, sp, #128
195 ; NONEON-NOSVE-NEXT:    ret
196   %res = fpext <16 x half> %a to <16 x float>
197   store <16 x float> %res, ptr %b
198   ret void
203 ; FCVT H -> S
206 define void @fcvt_v2f16_v2f32(ptr %a, ptr %b) {
207 ; CHECK-LABEL: fcvt_v2f16_v2f32:
208 ; CHECK:       // %bb.0:
209 ; CHECK-NEXT:    ptrue p0.s, vl2
210 ; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0]
211 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
212 ; CHECK-NEXT:    str d0, [x1]
213 ; CHECK-NEXT:    ret
215 ; NONEON-NOSVE-LABEL: fcvt_v2f16_v2f32:
216 ; NONEON-NOSVE:       // %bb.0:
217 ; NONEON-NOSVE-NEXT:    sub sp, sp, #32
218 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
219 ; NONEON-NOSVE-NEXT:    ldr w8, [x0]
220 ; NONEON-NOSVE-NEXT:    str w8, [sp, #8]
221 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
222 ; NONEON-NOSVE-NEXT:    str d0, [sp, #16]
223 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
224 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
225 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
226 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
227 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
228 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
229 ; NONEON-NOSVE-NEXT:    str d0, [x1]
230 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
231 ; NONEON-NOSVE-NEXT:    ret
232   %op1 = load <2 x half>, ptr %a
233   %res = fpext <2 x half> %op1 to <2 x float>
234   store <2 x float> %res, ptr %b
235   ret void
238 define void @fcvt_v4f16_v4f32(ptr %a, ptr %b) {
239 ; CHECK-LABEL: fcvt_v4f16_v4f32:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    ptrue p0.s, vl4
242 ; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0]
243 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
244 ; CHECK-NEXT:    str q0, [x1]
245 ; CHECK-NEXT:    ret
247 ; NONEON-NOSVE-LABEL: fcvt_v4f16_v4f32:
248 ; NONEON-NOSVE:       // %bb.0:
249 ; NONEON-NOSVE-NEXT:    sub sp, sp, #32
250 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
251 ; NONEON-NOSVE-NEXT:    ldr d0, [x0]
252 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
253 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
254 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
255 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #12]
256 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
257 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
258 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #10]
259 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
260 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #8]
261 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
262 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
263 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
264 ; NONEON-NOSVE-NEXT:    str q0, [x1]
265 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
266 ; NONEON-NOSVE-NEXT:    ret
267   %op1 = load <4 x half>, ptr %a
268   %res = fpext <4 x half> %op1 to <4 x float>
269   store <4 x float> %res, ptr %b
270   ret void
273 define void @fcvt_v8f16_v8f32(ptr %a, ptr %b) {
274 ; CHECK-LABEL: fcvt_v8f16_v8f32:
275 ; CHECK:       // %bb.0:
276 ; CHECK-NEXT:    ptrue p0.s, vl4
277 ; CHECK-NEXT:    mov x8, #4 // =0x4
278 ; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0, x8, lsl #1]
279 ; CHECK-NEXT:    ld1h { z1.s }, p0/z, [x0]
280 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
281 ; CHECK-NEXT:    fcvt z1.s, p0/m, z1.h
282 ; CHECK-NEXT:    stp q1, q0, [x1]
283 ; CHECK-NEXT:    ret
285 ; NONEON-NOSVE-LABEL: fcvt_v8f16_v8f32:
286 ; NONEON-NOSVE:       // %bb.0:
287 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
288 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
289 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
290 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
291 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
292 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
293 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
294 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
295 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
296 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
297 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
298 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
299 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
300 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
301 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
302 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
303 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
304 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
305 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
306 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
307 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
308 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
309 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
310 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
311 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
312 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
313 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
314 ; NONEON-NOSVE-NEXT:    add sp, sp, #64
315 ; NONEON-NOSVE-NEXT:    ret
316   %op1 = load <8 x half>, ptr %a
317   %res = fpext <8 x half> %op1 to <8 x float>
318   store <8 x float> %res, ptr %b
319   ret void
322 define void @fcvt_v16f16_v16f32(ptr %a, ptr %b) {
323 ; CHECK-LABEL: fcvt_v16f16_v16f32:
324 ; CHECK:       // %bb.0:
325 ; CHECK-NEXT:    ptrue p0.s, vl4
326 ; CHECK-NEXT:    mov x8, #8 // =0x8
327 ; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0, x8, lsl #1]
328 ; CHECK-NEXT:    mov x8, #12 // =0xc
329 ; CHECK-NEXT:    ld1h { z2.s }, p0/z, [x0]
330 ; CHECK-NEXT:    ld1h { z1.s }, p0/z, [x0, x8, lsl #1]
331 ; CHECK-NEXT:    mov x8, #4 // =0x4
332 ; CHECK-NEXT:    ld1h { z3.s }, p0/z, [x0, x8, lsl #1]
333 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.h
334 ; CHECK-NEXT:    fcvt z2.s, p0/m, z2.h
335 ; CHECK-NEXT:    fcvt z1.s, p0/m, z1.h
336 ; CHECK-NEXT:    fcvt z3.s, p0/m, z3.h
337 ; CHECK-NEXT:    stp q0, q1, [x1, #32]
338 ; CHECK-NEXT:    stp q2, q3, [x1]
339 ; CHECK-NEXT:    ret
341 ; NONEON-NOSVE-LABEL: fcvt_v16f16_v16f32:
342 ; NONEON-NOSVE:       // %bb.0:
343 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
344 ; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
345 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
346 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
347 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
348 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
349 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
350 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #46]
351 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
352 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #44]
353 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
354 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
355 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #42]
356 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
357 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #40]
358 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
359 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
360 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #38]
361 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
362 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #36]
363 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
364 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
365 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #34]
366 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
367 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #32]
368 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
369 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #64]
370 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
371 ; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
372 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
373 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
374 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
375 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #120]
376 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
377 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
378 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
379 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
380 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #112]
381 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
382 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
383 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
384 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
385 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #104]
386 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
387 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
388 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
389 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
390 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #96]
391 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
392 ; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
393 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
394 ; NONEON-NOSVE-NEXT:    add sp, sp, #128
395 ; NONEON-NOSVE-NEXT:    ret
396   %op1 = load <16 x half>, ptr %a
397   %res = fpext <16 x half> %op1 to <16 x float>
398   store <16 x float> %res, ptr %b
399   ret void
403 ; FCVT H -> D
406 define void @fcvt_v1f16_v1f64(ptr %a, ptr %b) {
407 ; CHECK-LABEL: fcvt_v1f16_v1f64:
408 ; CHECK:       // %bb.0:
409 ; CHECK-NEXT:    ldr h0, [x0]
410 ; CHECK-NEXT:    fcvt d0, h0
411 ; CHECK-NEXT:    str d0, [x1]
412 ; CHECK-NEXT:    ret
414 ; NONEON-NOSVE-LABEL: fcvt_v1f16_v1f64:
415 ; NONEON-NOSVE:       // %bb.0:
416 ; NONEON-NOSVE-NEXT:    sub sp, sp, #16
417 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
418 ; NONEON-NOSVE-NEXT:    ldr h0, [x0]
419 ; NONEON-NOSVE-NEXT:    fcvt d0, h0
420 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
421 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
422 ; NONEON-NOSVE-NEXT:    str d0, [x1]
423 ; NONEON-NOSVE-NEXT:    add sp, sp, #16
424 ; NONEON-NOSVE-NEXT:    ret
425   %op1 = load <1 x half>, ptr %a
426   %res = fpext <1 x half> %op1 to <1 x double>
427   store <1 x double> %res, ptr %b
428   ret void
431 define void @fcvt_v2f16_v2f64(ptr %a, ptr %b) {
432 ; CHECK-LABEL: fcvt_v2f16_v2f64:
433 ; CHECK:       // %bb.0:
434 ; CHECK-NEXT:    ptrue p0.d, vl2
435 ; CHECK-NEXT:    ld1h { z0.d }, p0/z, [x0]
436 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.h
437 ; CHECK-NEXT:    str q0, [x1]
438 ; CHECK-NEXT:    ret
440 ; NONEON-NOSVE-LABEL: fcvt_v2f16_v2f64:
441 ; NONEON-NOSVE:       // %bb.0:
442 ; NONEON-NOSVE-NEXT:    ldr w8, [x0]
443 ; NONEON-NOSVE-NEXT:    str w8, [sp, #-48]!
444 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
445 ; NONEON-NOSVE-NEXT:    ldr d0, [sp]
446 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
447 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #10]
448 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
449 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #8]
450 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
451 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
452 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
453 ; NONEON-NOSVE-NEXT:    str d0, [sp, #24]
454 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #28]
455 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
456 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #24]
457 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
458 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
459 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
460 ; NONEON-NOSVE-NEXT:    str q0, [x1]
461 ; NONEON-NOSVE-NEXT:    add sp, sp, #48
462 ; NONEON-NOSVE-NEXT:    ret
463   %op1 = load <2 x half>, ptr %a
464   %res = fpext <2 x half> %op1 to <2 x double>
465   store <2 x double> %res, ptr %b
466   ret void
469 define void @fcvt_v4f16_v4f64(ptr %a, ptr %b) {
470 ; CHECK-LABEL: fcvt_v4f16_v4f64:
471 ; CHECK:       // %bb.0:
472 ; CHECK-NEXT:    ptrue p0.d, vl2
473 ; CHECK-NEXT:    mov x8, #2 // =0x2
474 ; CHECK-NEXT:    ld1h { z0.d }, p0/z, [x0, x8, lsl #1]
475 ; CHECK-NEXT:    ld1h { z1.d }, p0/z, [x0]
476 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.h
477 ; CHECK-NEXT:    fcvt z1.d, p0/m, z1.h
478 ; CHECK-NEXT:    stp q1, q0, [x1]
479 ; CHECK-NEXT:    ret
481 ; NONEON-NOSVE-LABEL: fcvt_v4f16_v4f64:
482 ; NONEON-NOSVE:       // %bb.0:
483 ; NONEON-NOSVE-NEXT:    sub sp, sp, #80
484 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 80
485 ; NONEON-NOSVE-NEXT:    ldr d0, [x0]
486 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
487 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #10]
488 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
489 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #8]
490 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
491 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
492 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
493 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
494 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #12]
495 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
496 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #16]
497 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #16]
498 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
499 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #44]
500 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
501 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #40]
502 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
503 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
504 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #36]
505 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
506 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #32]
507 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
508 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
509 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #48]
510 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
511 ; NONEON-NOSVE-NEXT:    add sp, sp, #80
512 ; NONEON-NOSVE-NEXT:    ret
513   %op1 = load <4 x half>, ptr %a
514   %res = fpext <4 x half> %op1 to <4 x double>
515   store <4 x double> %res, ptr %b
516   ret void
519 define void @fcvt_v8f16_v8f64(ptr %a, ptr %b) {
520 ; CHECK-LABEL: fcvt_v8f16_v8f64:
521 ; CHECK:       // %bb.0:
522 ; CHECK-NEXT:    ptrue p0.d, vl2
523 ; CHECK-NEXT:    mov x8, #4 // =0x4
524 ; CHECK-NEXT:    ld1h { z0.d }, p0/z, [x0, x8, lsl #1]
525 ; CHECK-NEXT:    mov x8, #6 // =0x6
526 ; CHECK-NEXT:    ld1h { z2.d }, p0/z, [x0]
527 ; CHECK-NEXT:    ld1h { z1.d }, p0/z, [x0, x8, lsl #1]
528 ; CHECK-NEXT:    mov x8, #2 // =0x2
529 ; CHECK-NEXT:    ld1h { z3.d }, p0/z, [x0, x8, lsl #1]
530 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.h
531 ; CHECK-NEXT:    fcvt z2.d, p0/m, z2.h
532 ; CHECK-NEXT:    fcvt z1.d, p0/m, z1.h
533 ; CHECK-NEXT:    fcvt z3.d, p0/m, z3.h
534 ; CHECK-NEXT:    stp q0, q1, [x1, #32]
535 ; CHECK-NEXT:    stp q2, q3, [x1]
536 ; CHECK-NEXT:    ret
538 ; NONEON-NOSVE-LABEL: fcvt_v8f16_v8f64:
539 ; NONEON-NOSVE:       // %bb.0:
540 ; NONEON-NOSVE-NEXT:    sub sp, sp, #160
541 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 160
542 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
543 ; NONEON-NOSVE-NEXT:    str q0, [sp]
544 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
545 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
546 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #26]
547 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
548 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #24]
549 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
550 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #56]
551 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #30]
552 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
553 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #28]
554 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
555 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #48]
556 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #18]
557 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
558 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
559 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
560 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
561 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #22]
562 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
563 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #20]
564 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
565 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
566 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #48]
567 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
568 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #32]
569 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
570 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #92]
571 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
572 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #88]
573 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
574 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #144]
575 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #84]
576 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
577 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #80]
578 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
579 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #128]
580 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #76]
581 ; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #128]
582 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
583 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #72]
584 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
585 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
586 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #68]
587 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
588 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #64]
589 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
590 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
591 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
592 ; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
593 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
594 ; NONEON-NOSVE-NEXT:    add sp, sp, #160
595 ; NONEON-NOSVE-NEXT:    ret
596   %op1 = load <8 x half>, ptr %a
597   %res = fpext <8 x half> %op1 to <8 x double>
598   store <8 x double> %res, ptr %b
599   ret void
602 define void @fcvt_v16f16_v16f64(ptr %a, ptr %b) {
603 ; CHECK-LABEL: fcvt_v16f16_v16f64:
604 ; CHECK:       // %bb.0:
605 ; CHECK-NEXT:    ptrue p0.d, vl2
606 ; CHECK-NEXT:    mov x8, #12 // =0xc
607 ; CHECK-NEXT:    ld1h { z0.d }, p0/z, [x0, x8, lsl #1]
608 ; CHECK-NEXT:    mov x8, #14 // =0xe
609 ; CHECK-NEXT:    ld1h { z6.d }, p0/z, [x0]
610 ; CHECK-NEXT:    ld1h { z1.d }, p0/z, [x0, x8, lsl #1]
611 ; CHECK-NEXT:    mov x8, #8 // =0x8
612 ; CHECK-NEXT:    ld1h { z2.d }, p0/z, [x0, x8, lsl #1]
613 ; CHECK-NEXT:    mov x8, #10 // =0xa
614 ; CHECK-NEXT:    ld1h { z3.d }, p0/z, [x0, x8, lsl #1]
615 ; CHECK-NEXT:    mov x8, #4 // =0x4
616 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.h
617 ; CHECK-NEXT:    ld1h { z4.d }, p0/z, [x0, x8, lsl #1]
618 ; CHECK-NEXT:    mov x8, #6 // =0x6
619 ; CHECK-NEXT:    fcvt z1.d, p0/m, z1.h
620 ; CHECK-NEXT:    ld1h { z5.d }, p0/z, [x0, x8, lsl #1]
621 ; CHECK-NEXT:    fcvt z2.d, p0/m, z2.h
622 ; CHECK-NEXT:    mov x8, #2 // =0x2
623 ; CHECK-NEXT:    fcvt z3.d, p0/m, z3.h
624 ; CHECK-NEXT:    ld1h { z7.d }, p0/z, [x0, x8, lsl #1]
625 ; CHECK-NEXT:    fcvt z4.d, p0/m, z4.h
626 ; CHECK-NEXT:    stp q0, q1, [x1, #96]
627 ; CHECK-NEXT:    movprfx z0, z5
628 ; CHECK-NEXT:    fcvt z0.d, p0/m, z5.h
629 ; CHECK-NEXT:    movprfx z1, z6
630 ; CHECK-NEXT:    fcvt z1.d, p0/m, z6.h
631 ; CHECK-NEXT:    stp q2, q3, [x1, #64]
632 ; CHECK-NEXT:    movprfx z2, z7
633 ; CHECK-NEXT:    fcvt z2.d, p0/m, z7.h
634 ; CHECK-NEXT:    stp q4, q0, [x1, #32]
635 ; CHECK-NEXT:    stp q1, q2, [x1]
636 ; CHECK-NEXT:    ret
638 ; NONEON-NOSVE-LABEL: fcvt_v16f16_v16f64:
639 ; NONEON-NOSVE:       // %bb.0:
640 ; NONEON-NOSVE-NEXT:    sub sp, sp, #336
641 ; NONEON-NOSVE-NEXT:    str x29, [sp, #320] // 8-byte Folded Spill
642 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 336
643 ; NONEON-NOSVE-NEXT:    .cfi_offset w29, -16
644 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
645 ; NONEON-NOSVE-NEXT:    ldr x29, [sp, #320] // 8-byte Folded Reload
646 ; NONEON-NOSVE-NEXT:    stp q0, q1, [sp]
647 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
648 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #40]
649 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
650 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #56]
651 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #50]
652 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
653 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #48]
654 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
655 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #96]
656 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #54]
657 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
658 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #52]
659 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
660 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #88]
661 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #42]
662 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
663 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #40]
664 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
665 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #80]
666 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #46]
667 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
668 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #44]
669 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
670 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #72]
671 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #66]
672 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
673 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #64]
674 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
675 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #128]
676 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #70]
677 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
678 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #68]
679 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
680 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #120]
681 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #58]
682 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
683 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #56]
684 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
685 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #112]
686 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #62]
687 ; NONEON-NOSVE-NEXT:    fcvt s1, h0
688 ; NONEON-NOSVE-NEXT:    ldr h0, [sp, #60]
689 ; NONEON-NOSVE-NEXT:    fcvt s0, h0
690 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #104]
691 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #88]
692 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #152]
693 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #72]
694 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #136]
695 ; NONEON-NOSVE-NEXT:    ldp d2, d1, [sp, #120]
696 ; NONEON-NOSVE-NEXT:    str d1, [sp, #328]
697 ; NONEON-NOSVE-NEXT:    ldp d0, d1, [sp, #104]
698 ; NONEON-NOSVE-NEXT:    str d0, [sp, #168]
699 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #164]
700 ; NONEON-NOSVE-NEXT:    stp d1, d2, [sp, #176]
701 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
702 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #160]
703 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
704 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #240]
705 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #156]
706 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
707 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #152]
708 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
709 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #224]
710 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #148]
711 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
712 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #144]
713 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
714 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #208]
715 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #140]
716 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
717 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #136]
718 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
719 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #192]
720 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #332]
721 ; NONEON-NOSVE-NEXT:    ldp q4, q3, [sp, #192]
722 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
723 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #328]
724 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
725 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #304]
726 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #188]
727 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
728 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #184]
729 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
730 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #288]
731 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #180]
732 ; NONEON-NOSVE-NEXT:    ldp q7, q6, [sp, #288]
733 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
734 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #176]
735 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
736 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #272]
737 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #172]
738 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
739 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #168]
740 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
741 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #256]
742 ; NONEON-NOSVE-NEXT:    ldp q1, q0, [sp, #224]
743 ; NONEON-NOSVE-NEXT:    ldp q2, q5, [sp, #256]
744 ; NONEON-NOSVE-NEXT:    stp q3, q4, [x1, #32]
745 ; NONEON-NOSVE-NEXT:    stp q6, q7, [x1, #64]
746 ; NONEON-NOSVE-NEXT:    stp q0, q1, [x1]
747 ; NONEON-NOSVE-NEXT:    stp q5, q2, [x1, #96]
748 ; NONEON-NOSVE-NEXT:    add sp, sp, #336
749 ; NONEON-NOSVE-NEXT:    ret
750   %op1 = load <16 x half>, ptr %a
751   %res = fpext <16 x half> %op1 to <16 x double>
752   store <16 x double> %res, ptr %b
753   ret void
757 ; FCVT S -> D
760 define void @fcvt_v1f32_v1f64(ptr %a, ptr %b) {
761 ; CHECK-LABEL: fcvt_v1f32_v1f64:
762 ; CHECK:       // %bb.0:
763 ; CHECK-NEXT:    ldr s0, [x0]
764 ; CHECK-NEXT:    fcvt d0, s0
765 ; CHECK-NEXT:    str d0, [x1]
766 ; CHECK-NEXT:    ret
768 ; NONEON-NOSVE-LABEL: fcvt_v1f32_v1f64:
769 ; NONEON-NOSVE:       // %bb.0:
770 ; NONEON-NOSVE-NEXT:    ldr s0, [x0]
771 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
772 ; NONEON-NOSVE-NEXT:    str d0, [x1]
773 ; NONEON-NOSVE-NEXT:    ret
774   %op1 = load <1 x float>, ptr %a
775   %res = fpext <1 x float> %op1 to <1 x double>
776   store <1 x double> %res, ptr %b
777   ret void
780 define void @fcvt_v2f32_v2f64(ptr %a, ptr %b) {
781 ; CHECK-LABEL: fcvt_v2f32_v2f64:
782 ; CHECK:       // %bb.0:
783 ; CHECK-NEXT:    ptrue p0.d, vl2
784 ; CHECK-NEXT:    ld1w { z0.d }, p0/z, [x0]
785 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
786 ; CHECK-NEXT:    str q0, [x1]
787 ; CHECK-NEXT:    ret
789 ; NONEON-NOSVE-LABEL: fcvt_v2f32_v2f64:
790 ; NONEON-NOSVE:       // %bb.0:
791 ; NONEON-NOSVE-NEXT:    sub sp, sp, #32
792 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
793 ; NONEON-NOSVE-NEXT:    ldr d0, [x0]
794 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
795 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
796 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
797 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #8]
798 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
799 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
800 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #16]
801 ; NONEON-NOSVE-NEXT:    str q0, [x1]
802 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
803 ; NONEON-NOSVE-NEXT:    ret
804   %op1 = load <2 x float>, ptr %a
805   %res = fpext <2 x float> %op1 to <2 x double>
806   store <2 x double> %res, ptr %b
807   ret void
810 define void @fcvt_v4f32_v4f64(ptr %a, ptr %b) {
811 ; CHECK-LABEL: fcvt_v4f32_v4f64:
812 ; CHECK:       // %bb.0:
813 ; CHECK-NEXT:    ptrue p0.d, vl2
814 ; CHECK-NEXT:    mov x8, #2 // =0x2
815 ; CHECK-NEXT:    ld1w { z0.d }, p0/z, [x0, x8, lsl #2]
816 ; CHECK-NEXT:    ld1w { z1.d }, p0/z, [x0]
817 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
818 ; CHECK-NEXT:    fcvt z1.d, p0/m, z1.s
819 ; CHECK-NEXT:    stp q1, q0, [x1]
820 ; CHECK-NEXT:    ret
822 ; NONEON-NOSVE-LABEL: fcvt_v4f32_v4f64:
823 ; NONEON-NOSVE:       // %bb.0:
824 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
825 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-64]!
826 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
827 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
828 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #16]
829 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #28]
830 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
831 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #24]
832 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
833 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
834 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #20]
835 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
836 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]
837 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
838 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
839 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #32]
840 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1]
841 ; NONEON-NOSVE-NEXT:    add sp, sp, #64
842 ; NONEON-NOSVE-NEXT:    ret
843   %op1 = load <4 x float>, ptr %a
844   %res = fpext <4 x float> %op1 to <4 x double>
845   store <4 x double> %res, ptr %b
846   ret void
849 define void @fcvt_v8f32_v8f64(ptr %a, ptr %b) {
850 ; CHECK-LABEL: fcvt_v8f32_v8f64:
851 ; CHECK:       // %bb.0:
852 ; CHECK-NEXT:    ptrue p0.d, vl2
853 ; CHECK-NEXT:    mov x8, #4 // =0x4
854 ; CHECK-NEXT:    ld1w { z0.d }, p0/z, [x0, x8, lsl #2]
855 ; CHECK-NEXT:    mov x8, #6 // =0x6
856 ; CHECK-NEXT:    ld1w { z2.d }, p0/z, [x0]
857 ; CHECK-NEXT:    ld1w { z1.d }, p0/z, [x0, x8, lsl #2]
858 ; CHECK-NEXT:    mov x8, #2 // =0x2
859 ; CHECK-NEXT:    ld1w { z3.d }, p0/z, [x0, x8, lsl #2]
860 ; CHECK-NEXT:    fcvt z0.d, p0/m, z0.s
861 ; CHECK-NEXT:    fcvt z2.d, p0/m, z2.s
862 ; CHECK-NEXT:    fcvt z1.d, p0/m, z1.s
863 ; CHECK-NEXT:    fcvt z3.d, p0/m, z3.s
864 ; CHECK-NEXT:    stp q0, q1, [x1, #32]
865 ; CHECK-NEXT:    stp q2, q3, [x1]
866 ; CHECK-NEXT:    ret
868 ; NONEON-NOSVE-LABEL: fcvt_v8f32_v8f64:
869 ; NONEON-NOSVE:       // %bb.0:
870 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [x0]
871 ; NONEON-NOSVE-NEXT:    stp q0, q1, [sp, #-128]!
872 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 128
873 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp]
874 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #32]
875 ; NONEON-NOSVE-NEXT:    ldp d1, d0, [sp, #16]
876 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #48]
877 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #44]
878 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
879 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #40]
880 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
881 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #80]
882 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #36]
883 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
884 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #32]
885 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
886 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #64]
887 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #60]
888 ; NONEON-NOSVE-NEXT:    ldp q3, q2, [sp, #64]
889 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
890 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #56]
891 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
892 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #112]
893 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #52]
894 ; NONEON-NOSVE-NEXT:    fcvt d1, s0
895 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #48]
896 ; NONEON-NOSVE-NEXT:    fcvt d0, s0
897 ; NONEON-NOSVE-NEXT:    stp d0, d1, [sp, #96]
898 ; NONEON-NOSVE-NEXT:    ldp q0, q1, [sp, #96]
899 ; NONEON-NOSVE-NEXT:    stp q2, q3, [x1]
900 ; NONEON-NOSVE-NEXT:    stp q1, q0, [x1, #32]
901 ; NONEON-NOSVE-NEXT:    add sp, sp, #128
902 ; NONEON-NOSVE-NEXT:    ret
903   %op1 = load <8 x float>, ptr %a
904   %res = fpext <8 x float> %op1 to <8 x double>
905   store <8 x double> %res, ptr %b
906   ret void
910 ; FCVT S -> H
913 define void @fcvt_v2f32_v2f16(ptr %a, ptr %b) {
914 ; CHECK-LABEL: fcvt_v2f32_v2f16:
915 ; CHECK:       // %bb.0:
916 ; CHECK-NEXT:    ptrue p0.s, vl2
917 ; CHECK-NEXT:    ldr d0, [x0]
918 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
919 ; CHECK-NEXT:    st1h { z0.s }, p0, [x1]
920 ; CHECK-NEXT:    ret
922 ; NONEON-NOSVE-LABEL: fcvt_v2f32_v2f16:
923 ; NONEON-NOSVE:       // %bb.0:
924 ; NONEON-NOSVE-NEXT:    sub sp, sp, #32
925 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
926 ; NONEON-NOSVE-NEXT:    ldr d0, [x0]
927 ; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
928 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
929 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
930 ; NONEON-NOSVE-NEXT:    str h0, [sp, #18]
931 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #8]
932 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
933 ; NONEON-NOSVE-NEXT:    str h0, [sp, #16]
934 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
935 ; NONEON-NOSVE-NEXT:    str d0, [sp, #24]
936 ; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
937 ; NONEON-NOSVE-NEXT:    str w8, [x1]
938 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
939 ; NONEON-NOSVE-NEXT:    ret
940   %op1 = load <2 x float>, ptr %a
941   %res = fptrunc <2 x float> %op1 to <2 x half>
942   store <2 x half> %res, ptr %b
943   ret void
946 define void @fcvt_v4f32_v4f16(ptr %a, ptr %b) {
947 ; CHECK-LABEL: fcvt_v4f32_v4f16:
948 ; CHECK:       // %bb.0:
949 ; CHECK-NEXT:    ptrue p0.s, vl4
950 ; CHECK-NEXT:    ldr q0, [x0]
951 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
952 ; CHECK-NEXT:    st1h { z0.s }, p0, [x1]
953 ; CHECK-NEXT:    ret
955 ; NONEON-NOSVE-LABEL: fcvt_v4f32_v4f16:
956 ; NONEON-NOSVE:       // %bb.0:
957 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
958 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
959 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
960 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
961 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
962 ; NONEON-NOSVE-NEXT:    str h0, [sp, #30]
963 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #8]
964 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
965 ; NONEON-NOSVE-NEXT:    str h0, [sp, #28]
966 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #4]
967 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
968 ; NONEON-NOSVE-NEXT:    str h0, [sp, #26]
969 ; NONEON-NOSVE-NEXT:    ldr s0, [sp]
970 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
971 ; NONEON-NOSVE-NEXT:    str h0, [sp, #24]
972 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
973 ; NONEON-NOSVE-NEXT:    str d0, [x1]
974 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
975 ; NONEON-NOSVE-NEXT:    ret
976   %op1 = load <4 x float>, ptr %a
977   %res = fptrunc <4 x float> %op1 to <4 x half>
978   store <4 x half> %res, ptr %b
979   ret void
982 define void @fcvt_v8f32_v8f16(ptr %a, ptr %b) {
983 ; CHECK-LABEL: fcvt_v8f32_v8f16:
984 ; CHECK:       // %bb.0:
985 ; CHECK-NEXT:    ldp q1, q0, [x0]
986 ; CHECK-NEXT:    ptrue p0.s, vl4
987 ; CHECK-NEXT:    mov x8, #4 // =0x4
988 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.s
989 ; CHECK-NEXT:    fcvt z1.h, p0/m, z1.s
990 ; CHECK-NEXT:    st1h { z0.s }, p0, [x1, x8, lsl #1]
991 ; CHECK-NEXT:    st1h { z1.s }, p0, [x1]
992 ; CHECK-NEXT:    ret
994 ; NONEON-NOSVE-LABEL: fcvt_v8f32_v8f16:
995 ; NONEON-NOSVE:       // %bb.0:
996 ; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
997 ; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
998 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
999 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #28]
1000 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1001 ; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
1002 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #24]
1003 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1004 ; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
1005 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #20]
1006 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1007 ; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
1008 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]
1009 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1010 ; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
1011 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
1012 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1013 ; NONEON-NOSVE-NEXT:    str h0, [sp, #38]
1014 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #8]
1015 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1016 ; NONEON-NOSVE-NEXT:    str h0, [sp, #36]
1017 ; NONEON-NOSVE-NEXT:    ldr s0, [sp, #4]
1018 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1019 ; NONEON-NOSVE-NEXT:    str h0, [sp, #34]
1020 ; NONEON-NOSVE-NEXT:    ldr s0, [sp]
1021 ; NONEON-NOSVE-NEXT:    fcvt h0, s0
1022 ; NONEON-NOSVE-NEXT:    str h0, [sp, #32]
1023 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1024 ; NONEON-NOSVE-NEXT:    str q0, [x1]
1025 ; NONEON-NOSVE-NEXT:    add sp, sp, #48
1026 ; NONEON-NOSVE-NEXT:    ret
1027   %op1 = load <8 x float>, ptr %a
1028   %res = fptrunc <8 x float> %op1 to <8 x half>
1029   store <8 x half> %res, ptr %b
1030   ret void
1034 ; FCVT D -> H
1037 define void @fcvt_v1f64_v1f16(ptr %a, ptr %b) {
1038 ; CHECK-LABEL: fcvt_v1f64_v1f16:
1039 ; CHECK:       // %bb.0:
1040 ; CHECK-NEXT:    ptrue p0.d, vl1
1041 ; CHECK-NEXT:    ldr d0, [x0]
1042 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.d
1043 ; CHECK-NEXT:    st1h { z0.d }, p0, [x1]
1044 ; CHECK-NEXT:    ret
1046 ; NONEON-NOSVE-LABEL: fcvt_v1f64_v1f16:
1047 ; NONEON-NOSVE:       // %bb.0:
1048 ; NONEON-NOSVE-NEXT:    ldr d0, [x0]
1049 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1050 ; NONEON-NOSVE-NEXT:    str h0, [x1]
1051 ; NONEON-NOSVE-NEXT:    ret
1052   %op1 = load <1 x double>, ptr %a
1053   %res = fptrunc <1 x double> %op1 to <1 x half>
1054   store <1 x half> %res, ptr %b
1055   ret void
1058 define void @fcvt_v2f64_v2f16(ptr %a, ptr %b) {
1059 ; CHECK-LABEL: fcvt_v2f64_v2f16:
1060 ; CHECK:       // %bb.0:
1061 ; CHECK-NEXT:    ptrue p0.d, vl2
1062 ; CHECK-NEXT:    ldr q0, [x0]
1063 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.d
1064 ; CHECK-NEXT:    st1h { z0.d }, p0, [x1]
1065 ; CHECK-NEXT:    ret
1067 ; NONEON-NOSVE-LABEL: fcvt_v2f64_v2f16:
1068 ; NONEON-NOSVE:       // %bb.0:
1069 ; NONEON-NOSVE-NEXT:    ldr q0, [x0]
1070 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1071 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1072 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1073 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1074 ; NONEON-NOSVE-NEXT:    str h0, [sp, #18]
1075 ; NONEON-NOSVE-NEXT:    ldr d0, [sp]
1076 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1077 ; NONEON-NOSVE-NEXT:    str h0, [sp, #16]
1078 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
1079 ; NONEON-NOSVE-NEXT:    str d0, [sp, #24]
1080 ; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
1081 ; NONEON-NOSVE-NEXT:    str w8, [x1]
1082 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
1083 ; NONEON-NOSVE-NEXT:    ret
1084   %op1 = load <2 x double>, ptr %a
1085   %res = fptrunc <2 x double> %op1 to <2 x half>
1086   store <2 x half> %res, ptr %b
1087   ret void
1090 define void @fcvt_v4f64_v4f16(ptr %a, ptr %b) {
1091 ; CHECK-LABEL: fcvt_v4f64_v4f16:
1092 ; CHECK:       // %bb.0:
1093 ; CHECK-NEXT:    ldp q1, q0, [x0]
1094 ; CHECK-NEXT:    ptrue p0.d, vl2
1095 ; CHECK-NEXT:    mov x8, #2 // =0x2
1096 ; CHECK-NEXT:    fcvt z0.h, p0/m, z0.d
1097 ; CHECK-NEXT:    fcvt z1.h, p0/m, z1.d
1098 ; CHECK-NEXT:    st1h { z0.d }, p0, [x1, x8, lsl #1]
1099 ; CHECK-NEXT:    st1h { z1.d }, p0, [x1]
1100 ; CHECK-NEXT:    ret
1102 ; NONEON-NOSVE-LABEL: fcvt_v4f64_v4f16:
1103 ; NONEON-NOSVE:       // %bb.0:
1104 ; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1105 ; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1106 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1107 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1108 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1109 ; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
1110 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
1111 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1112 ; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
1113 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1114 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1115 ; NONEON-NOSVE-NEXT:    str h0, [sp, #42]
1116 ; NONEON-NOSVE-NEXT:    ldr d0, [sp]
1117 ; NONEON-NOSVE-NEXT:    fcvt h0, d0
1118 ; NONEON-NOSVE-NEXT:    str h0, [sp, #40]
1119 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]
1120 ; NONEON-NOSVE-NEXT:    str d0, [x1]
1121 ; NONEON-NOSVE-NEXT:    add sp, sp, #48
1122 ; NONEON-NOSVE-NEXT:    ret
1123   %op1 = load <4 x double>, ptr %a
1124   %res = fptrunc <4 x double> %op1 to <4 x half>
1125   store <4 x half> %res, ptr %b
1126   ret void
1130 ; FCVT D -> S
1133 define void @fcvt_v1f64_v1f32(<1 x double> %op1, ptr %b) {
1134 ; CHECK-LABEL: fcvt_v1f64_v1f32:
1135 ; CHECK:       // %bb.0:
1136 ; CHECK-NEXT:    ptrue p0.d, vl1
1137 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
1138 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
1139 ; CHECK-NEXT:    st1w { z0.d }, p0, [x0]
1140 ; CHECK-NEXT:    ret
1142 ; NONEON-NOSVE-LABEL: fcvt_v1f64_v1f32:
1143 ; NONEON-NOSVE:       // %bb.0:
1144 ; NONEON-NOSVE-NEXT:    fcvt s0, d0
1145 ; NONEON-NOSVE-NEXT:    str s0, [x0]
1146 ; NONEON-NOSVE-NEXT:    ret
1147   %res = fptrunc <1 x double> %op1 to <1 x float>
1148   store <1 x float> %res, ptr %b
1149   ret void
1152 define void @fcvt_v2f64_v2f32(<2 x double> %op1, ptr %b) {
1153 ; CHECK-LABEL: fcvt_v2f64_v2f32:
1154 ; CHECK:       // %bb.0:
1155 ; CHECK-NEXT:    ptrue p0.d, vl2
1156 ; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
1157 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
1158 ; CHECK-NEXT:    st1w { z0.d }, p0, [x0]
1159 ; CHECK-NEXT:    ret
1161 ; NONEON-NOSVE-LABEL: fcvt_v2f64_v2f32:
1162 ; NONEON-NOSVE:       // %bb.0:
1163 ; NONEON-NOSVE-NEXT:    str q0, [sp, #-32]!
1164 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
1165 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1166 ; NONEON-NOSVE-NEXT:    fcvt s1, d0
1167 ; NONEON-NOSVE-NEXT:    ldr d0, [sp]
1168 ; NONEON-NOSVE-NEXT:    fcvt s0, d0
1169 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #24]
1170 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1171 ; NONEON-NOSVE-NEXT:    str d0, [x0]
1172 ; NONEON-NOSVE-NEXT:    add sp, sp, #32
1173 ; NONEON-NOSVE-NEXT:    ret
1174   %res = fptrunc <2 x double> %op1 to <2 x float>
1175   store <2 x float> %res, ptr %b
1176   ret void
1179 define void @fcvt_v4f64_v4f32(ptr %a, ptr %b) {
1180 ; CHECK-LABEL: fcvt_v4f64_v4f32:
1181 ; CHECK:       // %bb.0:
1182 ; CHECK-NEXT:    ldp q1, q0, [x0]
1183 ; CHECK-NEXT:    ptrue p0.d, vl2
1184 ; CHECK-NEXT:    mov x8, #2 // =0x2
1185 ; CHECK-NEXT:    fcvt z0.s, p0/m, z0.d
1186 ; CHECK-NEXT:    fcvt z1.s, p0/m, z1.d
1187 ; CHECK-NEXT:    st1w { z0.d }, p0, [x1, x8, lsl #2]
1188 ; CHECK-NEXT:    st1w { z1.d }, p0, [x1]
1189 ; CHECK-NEXT:    ret
1191 ; NONEON-NOSVE-LABEL: fcvt_v4f64_v4f32:
1192 ; NONEON-NOSVE:       // %bb.0:
1193 ; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0]
1194 ; NONEON-NOSVE-NEXT:    stp q1, q0, [sp, #-48]!
1195 ; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 48
1196 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
1197 ; NONEON-NOSVE-NEXT:    fcvt s1, d0
1198 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
1199 ; NONEON-NOSVE-NEXT:    fcvt s0, d0
1200 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #40]
1201 ; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
1202 ; NONEON-NOSVE-NEXT:    fcvt s1, d0
1203 ; NONEON-NOSVE-NEXT:    ldr d0, [sp]
1204 ; NONEON-NOSVE-NEXT:    fcvt s0, d0
1205 ; NONEON-NOSVE-NEXT:    stp s0, s1, [sp, #32]
1206 ; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
1207 ; NONEON-NOSVE-NEXT:    str q0, [x1]
1208 ; NONEON-NOSVE-NEXT:    add sp, sp, #48
1209 ; NONEON-NOSVE-NEXT:    ret
1210   %op1 = load <4 x double>, ptr %a
1211   %res = fptrunc <4 x double> %op1 to <4 x float>
1212   store <4 x float> %res, ptr %b
1213   ret void