[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fpext.ll
blobdf90f9d5f091090c39e61c15361a74b168630c56
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc -mtriple=aarch64 -global-isel=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 define double @fpext_f32_f64(float %a) {
6 ; CHECK-LABEL: fpext_f32_f64:
7 ; CHECK:       // %bb.0: // %entry
8 ; CHECK-NEXT:    fcvt d0, s0
9 ; CHECK-NEXT:    ret
10 entry:
11   %c = fpext float %a to double
12   ret double %c
15 define double @fpext_f16_f64(half %a) {
16 ; CHECK-LABEL: fpext_f16_f64:
17 ; CHECK:       // %bb.0: // %entry
18 ; CHECK-NEXT:    fcvt d0, h0
19 ; CHECK-NEXT:    ret
20 entry:
21   %c = fpext half %a to double
22   ret double %c
25 define float @fpext_f16_f32(half %a) {
26 ; CHECK-LABEL: fpext_f16_f32:
27 ; CHECK:       // %bb.0: // %entry
28 ; CHECK-NEXT:    fcvt s0, h0
29 ; CHECK-NEXT:    ret
30 entry:
31   %c = fpext half %a to float
32   ret float %c
35 define fp128 @fpext_f16_f128(half %a) {
36 ; CHECK-LABEL: fpext_f16_f128:
37 ; CHECK:       // %bb.0: // %entry
38 ; CHECK-NEXT:    b __extendhftf2
39 entry:
40   %c = fpext half %a to fp128
41   ret fp128 %c
44 define fp128 @fpext_f32_f128(float %a) {
45 ; CHECK-LABEL: fpext_f32_f128:
46 ; CHECK:       // %bb.0: // %entry
47 ; CHECK-NEXT:    b __extendsftf2
48 entry:
49   %c = fpext float %a to fp128
50   ret fp128 %c
53 define fp128 @fpext_f64_f128(double %a) {
54 ; CHECK-LABEL: fpext_f64_f128:
55 ; CHECK:       // %bb.0: // %entry
56 ; CHECK-NEXT:    b __extenddftf2
57 entry:
58   %c = fpext double %a to fp128
59   ret fp128 %c
62 define <2 x double> @fpext_v2f32_v2f64(<2 x float> %a) {
63 ; CHECK-LABEL: fpext_v2f32_v2f64:
64 ; CHECK:       // %bb.0: // %entry
65 ; CHECK-NEXT:    fcvtl v0.2d, v0.2s
66 ; CHECK-NEXT:    ret
67 entry:
68   %c = fpext <2 x float> %a to <2 x double>
69   ret <2 x double> %c
72 define <3 x double> @fpext_v3f32_v3f64(<3 x float> %a) {
73 ; CHECK-SD-LABEL: fpext_v3f32_v3f64:
74 ; CHECK-SD:       // %bb.0: // %entry
75 ; CHECK-SD-NEXT:    fcvtl v3.2d, v0.2s
76 ; CHECK-SD-NEXT:    fcvtl2 v2.2d, v0.4s
77 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
78 ; CHECK-SD-NEXT:    fmov d0, d3
79 ; CHECK-SD-NEXT:    ext v1.16b, v3.16b, v3.16b, #8
80 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
81 ; CHECK-SD-NEXT:    ret
83 ; CHECK-GI-LABEL: fpext_v3f32_v3f64:
84 ; CHECK-GI:       // %bb.0: // %entry
85 ; CHECK-GI-NEXT:    mov s1, v0.s[2]
86 ; CHECK-GI-NEXT:    fcvtl v0.2d, v0.2s
87 ; CHECK-GI-NEXT:    fcvt d2, s1
88 ; CHECK-GI-NEXT:    mov d1, v0.d[1]
89 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
90 ; CHECK-GI-NEXT:    ret
91 entry:
92   %c = fpext <3 x float> %a to <3 x double>
93   ret <3 x double> %c
96 define <4 x fp128> @fpext_v4f16_v4f128(<4 x half> %a) {
97 ; CHECK-SD-LABEL: fpext_v4f16_v4f128:
98 ; CHECK-SD:       // %bb.0: // %entry
99 ; CHECK-SD-NEXT:    sub sp, sp, #64
100 ; CHECK-SD-NEXT:    str x30, [sp, #48] // 8-byte Folded Spill
101 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64
102 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
103 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
104 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
105 ; CHECK-SD-NEXT:    // kill: def $h0 killed $h0 killed $q0
106 ; CHECK-SD-NEXT:    bl __extendhftf2
107 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
108 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
109 ; CHECK-SD-NEXT:    mov h1, v1.h[1]
110 ; CHECK-SD-NEXT:    fmov s0, s1
111 ; CHECK-SD-NEXT:    bl __extendhftf2
112 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
113 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
114 ; CHECK-SD-NEXT:    mov h1, v1.h[2]
115 ; CHECK-SD-NEXT:    fmov s0, s1
116 ; CHECK-SD-NEXT:    bl __extendhftf2
117 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
118 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
119 ; CHECK-SD-NEXT:    mov h1, v1.h[3]
120 ; CHECK-SD-NEXT:    fmov s0, s1
121 ; CHECK-SD-NEXT:    bl __extendhftf2
122 ; CHECK-SD-NEXT:    mov v3.16b, v0.16b
123 ; CHECK-SD-NEXT:    ldp q1, q0, [sp] // 32-byte Folded Reload
124 ; CHECK-SD-NEXT:    ldr q2, [sp, #32] // 16-byte Folded Reload
125 ; CHECK-SD-NEXT:    ldr x30, [sp, #48] // 8-byte Folded Reload
126 ; CHECK-SD-NEXT:    add sp, sp, #64
127 ; CHECK-SD-NEXT:    ret
129 ; CHECK-GI-LABEL: fpext_v4f16_v4f128:
130 ; CHECK-GI:       // %bb.0: // %entry
131 ; CHECK-GI-NEXT:    sub sp, sp, #80
132 ; CHECK-GI-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
133 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
134 ; CHECK-GI-NEXT:    str x30, [sp, #72] // 8-byte Folded Spill
135 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
136 ; CHECK-GI-NEXT:    .cfi_offset w30, -8
137 ; CHECK-GI-NEXT:    .cfi_offset b8, -16
138 ; CHECK-GI-NEXT:    .cfi_offset b9, -24
139 ; CHECK-GI-NEXT:    .cfi_offset b10, -32
140 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
141 ; CHECK-GI-NEXT:    mov h8, v0.h[1]
142 ; CHECK-GI-NEXT:    mov h9, v0.h[2]
143 ; CHECK-GI-NEXT:    mov h10, v0.h[3]
144 ; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 killed $q0
145 ; CHECK-GI-NEXT:    bl __extendhftf2
146 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
147 ; CHECK-GI-NEXT:    fmov s0, s8
148 ; CHECK-GI-NEXT:    bl __extendhftf2
149 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
150 ; CHECK-GI-NEXT:    fmov s0, s9
151 ; CHECK-GI-NEXT:    bl __extendhftf2
152 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
153 ; CHECK-GI-NEXT:    fmov s0, s10
154 ; CHECK-GI-NEXT:    bl __extendhftf2
155 ; CHECK-GI-NEXT:    mov v3.16b, v0.16b
156 ; CHECK-GI-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
157 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
158 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
159 ; CHECK-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Folded Reload
160 ; CHECK-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
161 ; CHECK-GI-NEXT:    add sp, sp, #80
162 ; CHECK-GI-NEXT:    ret
163 entry:
164   %c = fpext <4 x half> %a to <4 x fp128>
165   ret <4 x fp128> %c
168 define <4 x fp128> @fpext_v4f32_v4f128(<4 x float> %a) {
169 ; CHECK-SD-LABEL: fpext_v4f32_v4f128:
170 ; CHECK-SD:       // %bb.0: // %entry
171 ; CHECK-SD-NEXT:    sub sp, sp, #80
172 ; CHECK-SD-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
173 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 80
174 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
175 ; CHECK-SD-NEXT:    str q0, [sp, #48] // 16-byte Folded Spill
176 ; CHECK-SD-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
177 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
178 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
179 ; CHECK-SD-NEXT:    bl __extendsftf2
180 ; CHECK-SD-NEXT:    ldr q1, [sp, #32] // 16-byte Folded Reload
181 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
182 ; CHECK-SD-NEXT:    mov s1, v1.s[1]
183 ; CHECK-SD-NEXT:    fmov s0, s1
184 ; CHECK-SD-NEXT:    bl __extendsftf2
185 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
186 ; CHECK-SD-NEXT:    ldr q0, [sp, #48] // 16-byte Folded Reload
187 ; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
188 ; CHECK-SD-NEXT:    bl __extendsftf2
189 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
190 ; CHECK-SD-NEXT:    ldr q0, [sp, #48] // 16-byte Folded Reload
191 ; CHECK-SD-NEXT:    mov s0, v0.s[1]
192 ; CHECK-SD-NEXT:    bl __extendsftf2
193 ; CHECK-SD-NEXT:    mov v1.16b, v0.16b
194 ; CHECK-SD-NEXT:    ldp q0, q3, [sp] // 32-byte Folded Reload
195 ; CHECK-SD-NEXT:    ldr q2, [sp, #32] // 16-byte Folded Reload
196 ; CHECK-SD-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
197 ; CHECK-SD-NEXT:    add sp, sp, #80
198 ; CHECK-SD-NEXT:    ret
200 ; CHECK-GI-LABEL: fpext_v4f32_v4f128:
201 ; CHECK-GI:       // %bb.0: // %entry
202 ; CHECK-GI-NEXT:    sub sp, sp, #80
203 ; CHECK-GI-NEXT:    str d10, [sp, #48] // 8-byte Folded Spill
204 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #56] // 16-byte Folded Spill
205 ; CHECK-GI-NEXT:    str x30, [sp, #72] // 8-byte Folded Spill
206 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
207 ; CHECK-GI-NEXT:    .cfi_offset w30, -8
208 ; CHECK-GI-NEXT:    .cfi_offset b8, -16
209 ; CHECK-GI-NEXT:    .cfi_offset b9, -24
210 ; CHECK-GI-NEXT:    .cfi_offset b10, -32
211 ; CHECK-GI-NEXT:    mov s8, v0.s[1]
212 ; CHECK-GI-NEXT:    mov s9, v0.s[2]
213 ; CHECK-GI-NEXT:    mov s10, v0.s[3]
214 ; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
215 ; CHECK-GI-NEXT:    bl __extendsftf2
216 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
217 ; CHECK-GI-NEXT:    fmov s0, s8
218 ; CHECK-GI-NEXT:    bl __extendsftf2
219 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
220 ; CHECK-GI-NEXT:    fmov s0, s9
221 ; CHECK-GI-NEXT:    bl __extendsftf2
222 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
223 ; CHECK-GI-NEXT:    fmov s0, s10
224 ; CHECK-GI-NEXT:    bl __extendsftf2
225 ; CHECK-GI-NEXT:    mov v3.16b, v0.16b
226 ; CHECK-GI-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
227 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #56] // 16-byte Folded Reload
228 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
229 ; CHECK-GI-NEXT:    ldr x30, [sp, #72] // 8-byte Folded Reload
230 ; CHECK-GI-NEXT:    ldr d10, [sp, #48] // 8-byte Folded Reload
231 ; CHECK-GI-NEXT:    add sp, sp, #80
232 ; CHECK-GI-NEXT:    ret
233 entry:
234   %c = fpext <4 x float> %a to <4 x fp128>
235   ret <4 x fp128> %c
238 define <4 x fp128> @fpext_v4f64_v4f128(<4 x double> %a) {
239 ; CHECK-SD-LABEL: fpext_v4f64_v4f128:
240 ; CHECK-SD:       // %bb.0: // %entry
241 ; CHECK-SD-NEXT:    sub sp, sp, #80
242 ; CHECK-SD-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
243 ; CHECK-SD-NEXT:    .cfi_def_cfa_offset 80
244 ; CHECK-SD-NEXT:    .cfi_offset w30, -16
245 ; CHECK-SD-NEXT:    str q1, [sp, #48] // 16-byte Folded Spill
246 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
247 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
248 ; CHECK-SD-NEXT:    bl __extenddftf2
249 ; CHECK-SD-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
250 ; CHECK-SD-NEXT:    ldr q0, [sp, #16] // 16-byte Folded Reload
251 ; CHECK-SD-NEXT:    mov d0, v0.d[1]
252 ; CHECK-SD-NEXT:    bl __extenddftf2
253 ; CHECK-SD-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
254 ; CHECK-SD-NEXT:    ldr q0, [sp, #48] // 16-byte Folded Reload
255 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
256 ; CHECK-SD-NEXT:    bl __extenddftf2
257 ; CHECK-SD-NEXT:    str q0, [sp] // 16-byte Folded Spill
258 ; CHECK-SD-NEXT:    ldr q0, [sp, #48] // 16-byte Folded Reload
259 ; CHECK-SD-NEXT:    mov d0, v0.d[1]
260 ; CHECK-SD-NEXT:    bl __extenddftf2
261 ; CHECK-SD-NEXT:    mov v3.16b, v0.16b
262 ; CHECK-SD-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
263 ; CHECK-SD-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
264 ; CHECK-SD-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
265 ; CHECK-SD-NEXT:    add sp, sp, #80
266 ; CHECK-SD-NEXT:    ret
268 ; CHECK-GI-LABEL: fpext_v4f64_v4f128:
269 ; CHECK-GI:       // %bb.0: // %entry
270 ; CHECK-GI-NEXT:    sub sp, sp, #80
271 ; CHECK-GI-NEXT:    stp d9, d8, [sp, #48] // 16-byte Folded Spill
272 ; CHECK-GI-NEXT:    str x30, [sp, #64] // 8-byte Folded Spill
273 ; CHECK-GI-NEXT:    .cfi_def_cfa_offset 80
274 ; CHECK-GI-NEXT:    .cfi_offset w30, -16
275 ; CHECK-GI-NEXT:    .cfi_offset b8, -24
276 ; CHECK-GI-NEXT:    .cfi_offset b9, -32
277 ; CHECK-GI-NEXT:    str q1, [sp] // 16-byte Folded Spill
278 ; CHECK-GI-NEXT:    mov d8, v0.d[1]
279 ; CHECK-GI-NEXT:    mov d9, v1.d[1]
280 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
281 ; CHECK-GI-NEXT:    bl __extenddftf2
282 ; CHECK-GI-NEXT:    str q0, [sp, #32] // 16-byte Folded Spill
283 ; CHECK-GI-NEXT:    fmov d0, d8
284 ; CHECK-GI-NEXT:    bl __extenddftf2
285 ; CHECK-GI-NEXT:    str q0, [sp, #16] // 16-byte Folded Spill
286 ; CHECK-GI-NEXT:    ldr q0, [sp] // 16-byte Folded Reload
287 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
288 ; CHECK-GI-NEXT:    bl __extenddftf2
289 ; CHECK-GI-NEXT:    str q0, [sp] // 16-byte Folded Spill
290 ; CHECK-GI-NEXT:    fmov d0, d9
291 ; CHECK-GI-NEXT:    bl __extenddftf2
292 ; CHECK-GI-NEXT:    mov v3.16b, v0.16b
293 ; CHECK-GI-NEXT:    ldp q1, q0, [sp, #16] // 32-byte Folded Reload
294 ; CHECK-GI-NEXT:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
295 ; CHECK-GI-NEXT:    ldr q2, [sp] // 16-byte Folded Reload
296 ; CHECK-GI-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
297 ; CHECK-GI-NEXT:    add sp, sp, #80
298 ; CHECK-GI-NEXT:    ret
299 entry:
300   %c = fpext <4 x double> %a to <4 x fp128>
301   ret <4 x fp128> %c
304 define <4 x double> @fpext_v4f32_v4f64(<4 x float> %a) {
305 ; CHECK-SD-LABEL: fpext_v4f32_v4f64:
306 ; CHECK-SD:       // %bb.0: // %entry
307 ; CHECK-SD-NEXT:    fcvtl2 v1.2d, v0.4s
308 ; CHECK-SD-NEXT:    fcvtl v0.2d, v0.2s
309 ; CHECK-SD-NEXT:    ret
311 ; CHECK-GI-LABEL: fpext_v4f32_v4f64:
312 ; CHECK-GI:       // %bb.0: // %entry
313 ; CHECK-GI-NEXT:    fcvtl v2.2d, v0.2s
314 ; CHECK-GI-NEXT:    fcvtl2 v1.2d, v0.4s
315 ; CHECK-GI-NEXT:    mov v0.16b, v2.16b
316 ; CHECK-GI-NEXT:    ret
317 entry:
318   %c = fpext <4 x float> %a to <4 x double>
319   ret <4 x double> %c
322 define <2 x double> @fpext_v2f16_v2f64(<2 x half> %a) {
323 ; CHECK-SD-LABEL: fpext_v2f16_v2f64:
324 ; CHECK-SD:       // %bb.0: // %entry
325 ; CHECK-SD-NEXT:    fcvtl v0.4s, v0.4h
326 ; CHECK-SD-NEXT:    fcvtl v0.2d, v0.2s
327 ; CHECK-SD-NEXT:    ret
329 ; CHECK-GI-LABEL: fpext_v2f16_v2f64:
330 ; CHECK-GI:       // %bb.0: // %entry
331 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
332 ; CHECK-GI-NEXT:    mov h1, v0.h[1]
333 ; CHECK-GI-NEXT:    fcvt d0, h0
334 ; CHECK-GI-NEXT:    fcvt d1, h1
335 ; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
336 ; CHECK-GI-NEXT:    ret
337 entry:
338   %c = fpext <2 x half> %a to <2 x double>
339   ret <2 x double> %c
342 define <3 x double> @fpext_v3f16_v3f64(<3 x half> %a) {
343 ; CHECK-SD-LABEL: fpext_v3f16_v3f64:
344 ; CHECK-SD:       // %bb.0: // %entry
345 ; CHECK-SD-NEXT:    fcvtl v1.4s, v0.4h
346 ; CHECK-SD-NEXT:    fcvtl v0.2d, v1.2s
347 ; CHECK-SD-NEXT:    fcvtl2 v2.2d, v1.4s
348 ; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
349 ; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
350 ; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
351 ; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
352 ; CHECK-SD-NEXT:    ret
354 ; CHECK-GI-LABEL: fpext_v3f16_v3f64:
355 ; CHECK-GI:       // %bb.0: // %entry
356 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
357 ; CHECK-GI-NEXT:    mov h1, v0.h[1]
358 ; CHECK-GI-NEXT:    mov h2, v0.h[2]
359 ; CHECK-GI-NEXT:    fcvt d0, h0
360 ; CHECK-GI-NEXT:    fcvt d1, h1
361 ; CHECK-GI-NEXT:    fcvt d2, h2
362 ; CHECK-GI-NEXT:    ret
363 entry:
364   %c = fpext <3 x half> %a to <3 x double>
365   ret <3 x double> %c
368 define <4 x double> @fpext_v4f16_v4f64(<4 x half> %a) {
369 ; CHECK-SD-LABEL: fpext_v4f16_v4f64:
370 ; CHECK-SD:       // %bb.0: // %entry
371 ; CHECK-SD-NEXT:    fcvtl v0.4s, v0.4h
372 ; CHECK-SD-NEXT:    fcvtl2 v1.2d, v0.4s
373 ; CHECK-SD-NEXT:    fcvtl v0.2d, v0.2s
374 ; CHECK-SD-NEXT:    ret
376 ; CHECK-GI-LABEL: fpext_v4f16_v4f64:
377 ; CHECK-GI:       // %bb.0: // %entry
378 ; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
379 ; CHECK-GI-NEXT:    mov h1, v0.h[1]
380 ; CHECK-GI-NEXT:    mov h2, v0.h[2]
381 ; CHECK-GI-NEXT:    mov h3, v0.h[3]
382 ; CHECK-GI-NEXT:    fcvt d0, h0
383 ; CHECK-GI-NEXT:    fcvt d4, h1
384 ; CHECK-GI-NEXT:    fcvt d1, h2
385 ; CHECK-GI-NEXT:    fcvt d2, h3
386 ; CHECK-GI-NEXT:    mov v0.d[1], v4.d[0]
387 ; CHECK-GI-NEXT:    mov v1.d[1], v2.d[0]
388 ; CHECK-GI-NEXT:    ret
389 entry:
390   %c = fpext <4 x half> %a to <4 x double>
391   ret <4 x double> %c
394 define <2 x float> @fpext_v2f16_v2f32(<2 x half> %a) {
395 ; CHECK-LABEL: fpext_v2f16_v2f32:
396 ; CHECK:       // %bb.0: // %entry
397 ; CHECK-NEXT:    fcvtl v0.4s, v0.4h
398 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
399 ; CHECK-NEXT:    ret
400 entry:
401   %c = fpext <2 x half> %a to <2 x float>
402   ret <2 x float> %c
405 define <3 x float> @fpext_v3f16_v3f32(<3 x half> %a) {
406 ; CHECK-LABEL: fpext_v3f16_v3f32:
407 ; CHECK:       // %bb.0: // %entry
408 ; CHECK-NEXT:    fcvtl v0.4s, v0.4h
409 ; CHECK-NEXT:    ret
410 entry:
411   %c = fpext <3 x half> %a to <3 x float>
412   ret <3 x float> %c
415 define <4 x float> @fpext_v4f16_v4f32(<4 x half> %a) {
416 ; CHECK-LABEL: fpext_v4f16_v4f32:
417 ; CHECK:       // %bb.0: // %entry
418 ; CHECK-NEXT:    fcvtl v0.4s, v0.4h
419 ; CHECK-NEXT:    ret
420 entry:
421   %c = fpext <4 x half> %a to <4 x float>
422   ret <4 x float> %c
425 define <8 x float> @fpext_v8f16_v8f32(<8 x half> %a) {
426 ; CHECK-SD-LABEL: fpext_v8f16_v8f32:
427 ; CHECK-SD:       // %bb.0: // %entry
428 ; CHECK-SD-NEXT:    fcvtl2 v1.4s, v0.8h
429 ; CHECK-SD-NEXT:    fcvtl v0.4s, v0.4h
430 ; CHECK-SD-NEXT:    ret
432 ; CHECK-GI-LABEL: fpext_v8f16_v8f32:
433 ; CHECK-GI:       // %bb.0: // %entry
434 ; CHECK-GI-NEXT:    fcvtl v2.4s, v0.4h
435 ; CHECK-GI-NEXT:    fcvtl2 v1.4s, v0.8h
436 ; CHECK-GI-NEXT:    mov v0.16b, v2.16b
437 ; CHECK-GI-NEXT:    ret
438 entry:
439   %c = fpext <8 x half> %a to <8 x float>
440   ret <8 x float> %c