1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s --mattr=+complxnum,+neon,+fullfp16 -o - | FileCheck %s
4 target triple = "aarch64"
7 ; Expected to transform
8 define <2 x float> @complex_add_v2f32(<2 x float> %a, <2 x float> %b) {
9 ; CHECK-LABEL: complex_add_v2f32:
10 ; CHECK: // %bb.0: // %entry
11 ; CHECK-NEXT: fcadd v0.2s, v1.2s, v0.2s, #90
14 %a.real = shufflevector <2 x float> %a, <2 x float> zeroinitializer, <1 x i32> <i32 0>
15 %a.imag = shufflevector <2 x float> %a, <2 x float> zeroinitializer, <1 x i32> <i32 1>
16 %b.real = shufflevector <2 x float> %b, <2 x float> zeroinitializer, <1 x i32> <i32 0>
17 %b.imag = shufflevector <2 x float> %b, <2 x float> zeroinitializer, <1 x i32> <i32 1>
18 %0 = fsub fast <1 x float> %b.real, %a.imag
19 %1 = fadd fast <1 x float> %b.imag, %a.real
20 %interleaved.vec = shufflevector <1 x float> %0, <1 x float> %1, <2 x i32> <i32 0, i32 1>
21 ret <2 x float> %interleaved.vec
24 ; Expected to transform
25 define <4 x float> @complex_add_v4f32(<4 x float> %a, <4 x float> %b) {
26 ; CHECK-LABEL: complex_add_v4f32:
27 ; CHECK: // %bb.0: // %entry
28 ; CHECK-NEXT: fcadd v0.4s, v1.4s, v0.4s, #90
31 %a.real = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <2 x i32> <i32 0, i32 2>
32 %a.imag = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <2 x i32> <i32 1, i32 3>
33 %b.real = shufflevector <4 x float> %b, <4 x float> zeroinitializer, <2 x i32> <i32 0, i32 2>
34 %b.imag = shufflevector <4 x float> %b, <4 x float> zeroinitializer, <2 x i32> <i32 1, i32 3>
35 %0 = fsub fast <2 x float> %b.real, %a.imag
36 %1 = fadd fast <2 x float> %b.imag, %a.real
37 %interleaved.vec = shufflevector <2 x float> %0, <2 x float> %1, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
38 ret <4 x float> %interleaved.vec
41 ; Expected to transform
42 define <8 x float> @complex_add_v8f32(<8 x float> %a, <8 x float> %b) {
43 ; CHECK-LABEL: complex_add_v8f32:
44 ; CHECK: // %bb.0: // %entry
45 ; CHECK-NEXT: fcadd v1.4s, v3.4s, v1.4s, #90
46 ; CHECK-NEXT: fcadd v0.4s, v2.4s, v0.4s, #90
49 %a.real = shufflevector <8 x float> %a, <8 x float> zeroinitializer, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
50 %a.imag = shufflevector <8 x float> %a, <8 x float> zeroinitializer, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
51 %b.real = shufflevector <8 x float> %b, <8 x float> zeroinitializer, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
52 %b.imag = shufflevector <8 x float> %b, <8 x float> zeroinitializer, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
53 %0 = fsub fast <4 x float> %b.real, %a.imag
54 %1 = fadd fast <4 x float> %b.imag, %a.real
55 %interleaved.vec = shufflevector <4 x float> %0, <4 x float> %1, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
56 ret <8 x float> %interleaved.vec
59 ; Expected to transform
60 define <16 x float> @complex_add_v16f32(<16 x float> %a, <16 x float> %b) {
61 ; CHECK-LABEL: complex_add_v16f32:
62 ; CHECK: // %bb.0: // %entry
63 ; CHECK-NEXT: fcadd v2.4s, v6.4s, v2.4s, #90
64 ; CHECK-NEXT: fcadd v0.4s, v4.4s, v0.4s, #90
65 ; CHECK-NEXT: fcadd v1.4s, v5.4s, v1.4s, #90
66 ; CHECK-NEXT: fcadd v3.4s, v7.4s, v3.4s, #90
69 %a.real = shufflevector <16 x float> %a, <16 x float> zeroinitializer, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
70 %a.imag = shufflevector <16 x float> %a, <16 x float> zeroinitializer, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
71 %b.real = shufflevector <16 x float> %b, <16 x float> zeroinitializer, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
72 %b.imag = shufflevector <16 x float> %b, <16 x float> zeroinitializer, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
73 %0 = fsub fast <8 x float> %b.real, %a.imag
74 %1 = fadd fast <8 x float> %b.imag, %a.real
75 %interleaved.vec = shufflevector <8 x float> %0, <8 x float> %1, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
76 ret <16 x float> %interleaved.vec