xref: /llvm-project/llvm/test/CodeGen/AArch64/fpext.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc -mtriple=aarch64 -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
4
5define 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
10entry:
11  %c = fpext float %a to double
12  ret double %c
13}
14
15define 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
20entry:
21  %c = fpext half %a to double
22  ret double %c
23}
24
25define 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
30entry:
31  %c = fpext half %a to float
32  ret float %c
33}
34
35define fp128 @fpext_f16_f128(half %a) {
36; CHECK-LABEL: fpext_f16_f128:
37; CHECK:       // %bb.0: // %entry
38; CHECK-NEXT:    b __extendhftf2
39entry:
40  %c = fpext half %a to fp128
41  ret fp128 %c
42}
43
44define fp128 @fpext_f32_f128(float %a) {
45; CHECK-LABEL: fpext_f32_f128:
46; CHECK:       // %bb.0: // %entry
47; CHECK-NEXT:    b __extendsftf2
48entry:
49  %c = fpext float %a to fp128
50  ret fp128 %c
51}
52
53define fp128 @fpext_f64_f128(double %a) {
54; CHECK-LABEL: fpext_f64_f128:
55; CHECK:       // %bb.0: // %entry
56; CHECK-NEXT:    b __extenddftf2
57entry:
58  %c = fpext double %a to fp128
59  ret fp128 %c
60}
61
62define <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
67entry:
68  %c = fpext <2 x float> %a to <2 x double>
69  ret <2 x double> %c
70}
71
72define <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
82;
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
91entry:
92  %c = fpext <3 x float> %a to <3 x double>
93  ret <3 x double> %c
94}
95
96define <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
128;
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
163entry:
164  %c = fpext <4 x half> %a to <4 x fp128>
165  ret <4 x fp128> %c
166}
167
168define <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
199;
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
233entry:
234  %c = fpext <4 x float> %a to <4 x fp128>
235  ret <4 x fp128> %c
236}
237
238define <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
267;
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
299entry:
300  %c = fpext <4 x double> %a to <4 x fp128>
301  ret <4 x fp128> %c
302}
303
304define <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
310;
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
317entry:
318  %c = fpext <4 x float> %a to <4 x double>
319  ret <4 x double> %c
320}
321
322define <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
328;
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
337entry:
338  %c = fpext <2 x half> %a to <2 x double>
339  ret <2 x double> %c
340}
341
342define <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
353;
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
363entry:
364  %c = fpext <3 x half> %a to <3 x double>
365  ret <3 x double> %c
366}
367
368define <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
375;
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
389entry:
390  %c = fpext <4 x half> %a to <4 x double>
391  ret <4 x double> %c
392}
393
394define <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
400entry:
401  %c = fpext <2 x half> %a to <2 x float>
402  ret <2 x float> %c
403}
404
405define <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
410entry:
411  %c = fpext <3 x half> %a to <3 x float>
412  ret <3 x float> %c
413}
414
415define <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
420entry:
421  %c = fpext <4 x half> %a to <4 x float>
422  ret <4 x float> %c
423}
424
425define <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
431;
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
438entry:
439  %c = fpext <8 x half> %a to <8 x float>
440  ret <8 x float> %c
441}
442