xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vcombine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -float-abi=soft -mattr=+neon %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armeb-eabi -float-abi=soft -mattr=+neon %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vcombine8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine8
6*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0]
7*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1]
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r0, r1, [[LD0]]
10*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r2, r3, [[LD1]]
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r1, r0, d16
13*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r3, r2, d17
14*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
15*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i8>, <8 x i8>* %B
16*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> %tmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
17*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp3
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vcombine16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine16
22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0]
23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1]
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r0, r1, [[LD0]]
26*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r2, r3, [[LD1]]
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r1, r0, d16
29*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r3, r2, d17
30*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
31*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i16>, <4 x i16>* %B
32*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <4 x i16> %tmp1, <4 x i16> %tmp2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
33*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp3
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vcombine32(<2 x i32>* %A, <2 x i32>* %B) nounwind {
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine32
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0]
40*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1]
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]]
43*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]]
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16
46*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, d17
47*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
48*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x i32>, <2 x i32>* %B
49*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <2 x i32> %tmp1, <2 x i32> %tmp2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
50*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vcombinefloat(<2 x float>* %A, <2 x float>* %B) nounwind {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombinefloat
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0]
57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1]
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]]
60*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]]
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16
63*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, d17
64*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
65*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <2 x float>, <2 x float>* %B
66*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <2 x float> %tmp1, <2 x float> %tmp2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
67*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp3
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vcombine64(<1 x i64>* %A, <1 x i64>* %B) nounwind {
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine64
72*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0]
73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1]
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]]
76*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]]
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, [[LD0]]
79*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, [[LD1]]
80*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <1 x i64>, <1 x i64>* %A
81*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <1 x i64>, <1 x i64>* %B
82*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <1 x i64> %tmp1, <1 x i64> %tmp2, <2 x i32> <i32 0, i32 1>
83*9880d681SAndroid Build Coastguard Worker	ret <2 x i64> %tmp3
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; Check for vget_low and vget_high implemented with shufflevector.  PR8411.
87*9880d681SAndroid Build Coastguard Worker; They should not require storing to the stack.
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vget_low16(<8 x i16>* %A) nounwind {
90*9880d681SAndroid Build Coastguard Worker; CHECK: vget_low16
91*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vst
92*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, d16
93*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16
94*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
95*9880d681SAndroid Build Coastguard Worker        %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
96*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp2
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vget_high8(<16 x i8>* %A) nounwind {
100*9880d681SAndroid Build Coastguard Worker; CHECK: vget_high8
101*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vst
102*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, d17
103*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16
104*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
105*9880d681SAndroid Build Coastguard Worker        %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
106*9880d681SAndroid Build Coastguard Worker        ret <8 x i8> %tmp2
107*9880d681SAndroid Build Coastguard Worker}
108