xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-vaddv.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-neon-syntax=apple < %s -asm-verbose=false -mcpu=cyclone | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vaddv_s8(<8 x i8> %a1) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s8:
5*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0]
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> %a1)
10*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i8
11*9880d681SAndroid Build Coastguard Worker  ret i8 %0
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddv_s8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s8_used_by_laneop:
16*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v1
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
19*9880d681SAndroid Build Coastguard Workerentry:
20*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> %a2)
21*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
22*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i8> %a1, i8 %1, i32 3
23*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %2
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vaddv_s16(<4 x i16> %a1) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s16:
28*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0]
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> %a1)
33*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i16
34*9880d681SAndroid Build Coastguard Worker  ret i16 %0
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddv_s16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s16_used_by_laneop:
39*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v1
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> %a2)
44*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
45*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x i16> %a1, i16 %1, i32 3
46*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %2
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_s32(<2 x i32> %a1) {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s32:
51*9880d681SAndroid Build Coastguard Worker; 2 x i32 is not supported by the ISA, thus, this is a special case
52*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v0, v0
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a1)
57*9880d681SAndroid Build Coastguard Worker  ret i32 %vaddv.i
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddv_s32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s32_used_by_laneop:
62*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v1, v1
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0]
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a2)
67*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i32> %a1, i32 %0, i32 1
68*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %1
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine i64 @test_vaddv_s64(<2 x i64> %a1) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s64:
73*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d [[REGNUM:d[0-9]+]], v0
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov x0, [[REGNUM]]
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
76*9880d681SAndroid Build Coastguard Workerentry:
77*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> %a1)
78*9880d681SAndroid Build Coastguard Worker  ret i64 %vaddv.i
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddv_s64_used_by_laneop(<2 x i64> %a1, <2 x i64> %a2) {
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_s64_used_by_laneop:
83*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d[[REGNUM:[0-9]+]], v1
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], v[[REGNUM]][0]
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
86*9880d681SAndroid Build Coastguard Workerentry:
87*9880d681SAndroid Build Coastguard Worker  %0 = tail call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> %a2)
88*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i64> %a1, i64 %0, i64 1
89*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_vaddv_u8(<8 x i8> %a1) {
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8:
94*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
97*9880d681SAndroid Build Coastguard Workerentry:
98*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a1)
99*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i8
100*9880d681SAndroid Build Coastguard Worker  ret i8 %0
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vaddv_u8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8_used_by_laneop:
105*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v1
106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
108*9880d681SAndroid Build Coastguard Workerentry:
109*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a2)
110*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
111*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i8> %a1, i8 %1, i32 3
112*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %2
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u8_masked(<8 x i8> %a1) {
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u8_masked:
117*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8b b[[REGNUM:[0-9]+]], v0
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> %a1)
122*9880d681SAndroid Build Coastguard Worker  %0 = and i32 %vaddv.i, 511 ; 0x1ff
123*9880d681SAndroid Build Coastguard Worker  ret i32 %0
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_vaddv_u16(<4 x i16> %a1) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16:
128*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a1)
133*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i16
134*9880d681SAndroid Build Coastguard Worker  ret i16 %0
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vaddv_u16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) {
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16_used_by_laneop:
139*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v1
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
142*9880d681SAndroid Build Coastguard Workerentry:
143*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a2)
144*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
145*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x i16> %a1, i16 %1, i32 3
146*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %2
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u16_masked(<4 x i16> %a1) {
150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u16_masked:
151*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4h h[[REGNUM:[0-9]+]], v0
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> %a1)
156*9880d681SAndroid Build Coastguard Worker  %0 = and i32 %vaddv.i, 3276799 ; 0x31ffff
157*9880d681SAndroid Build Coastguard Worker  ret i32 %0
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddv_u32(<2 x i32> %a1) {
161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u32:
162*9880d681SAndroid Build Coastguard Worker; 2 x i32 is not supported by the ISA, thus, this is a special case
163*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v0, v0
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
166*9880d681SAndroid Build Coastguard Workerentry:
167*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a1)
168*9880d681SAndroid Build Coastguard Worker  ret i32 %vaddv.i
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vaddv_u32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) {
172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u32_used_by_laneop:
173*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2s v[[REGNUM:[0-9]+]], v1, v1
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0]
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a2)
178*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i32> %a1, i32 %0, i32 1
179*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %1
180*9880d681SAndroid Build Coastguard Worker}
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerdefine float @test_vaddv_f32(<2 x float> %a1) {
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_f32:
184*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2s s0, v0
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call float @llvm.aarch64.neon.faddv.f32.v2f32(<2 x float> %a1)
188*9880d681SAndroid Build Coastguard Worker  ret float %vaddv.i
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine float @test_vaddv_v4f32(<4 x float> %a1) {
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_v4f32:
193*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.4s [[REGNUM:v[0-9]+]], v0, v0
194*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2s s0, [[REGNUM]]
195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
196*9880d681SAndroid Build Coastguard Workerentry:
197*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call float @llvm.aarch64.neon.faddv.f32.v4f32(<4 x float> %a1)
198*9880d681SAndroid Build Coastguard Worker  ret float %vaddv.i
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdefine double @test_vaddv_f64(<2 x double> %a1) {
202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_f64:
203*9880d681SAndroid Build Coastguard Worker; CHECK: faddp.2d d0, v0
204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
205*9880d681SAndroid Build Coastguard Workerentry:
206*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call double @llvm.aarch64.neon.faddv.f64.v2f64(<2 x double> %a1)
207*9880d681SAndroid Build Coastguard Worker  ret double %vaddv.i
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine i64 @test_vaddv_u64(<2 x i64> %a1) {
211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64:
212*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d [[REGNUM:d[0-9]+]], v0
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov x0, [[REGNUM]]
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
215*9880d681SAndroid Build Coastguard Workerentry:
216*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a1)
217*9880d681SAndroid Build Coastguard Worker  ret i64 %vaddv.i
218*9880d681SAndroid Build Coastguard Worker}
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vaddv_u64_used_by_laneop(<2 x i64> %a1, <2 x i64> %a2) {
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64_used_by_laneop:
222*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d[[REGNUM:[0-9]+]], v1
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], v[[REGNUM]][0]
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %0 = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a2)
227*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i64> %a1, i64 %0, i64 1
228*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vaddv_u64_to_vec(<2 x i64> %a1) {
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddv_u64_to_vec:
233*9880d681SAndroid Build Coastguard Worker; CHECK: addp.2d d0, v0
234*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmov
235*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ins
236*9880d681SAndroid Build Coastguard Worker; CHECK: ret
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> %a1)
239*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <1 x i64> undef, i64 %vaddv.i, i32 0
240*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %vec
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vaddvq_s8(<16 x i8> %a1) {
244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s8:
245*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v0
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0]
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
248*9880d681SAndroid Build Coastguard Workerentry:
249*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> %a1)
250*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i8
251*9880d681SAndroid Build Coastguard Worker  ret i8 %0
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddvq_s8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) {
255*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s8_used_by_laneop:
256*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v1
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
259*9880d681SAndroid Build Coastguard Workerentry:
260*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> %a2)
261*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
262*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <16 x i8> %a1, i8 %1, i32 3
263*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vaddvq_s16(<8 x i16> %a1) {
267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s16:
268*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v0
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0]
270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
271*9880d681SAndroid Build Coastguard Workerentry:
272*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> %a1)
273*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i16
274*9880d681SAndroid Build Coastguard Worker  ret i16 %0
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddvq_s16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) {
278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s16_used_by_laneop:
279*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v1
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
282*9880d681SAndroid Build Coastguard Workerentry:
283*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> %a2)
284*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
285*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i16> %a1, i16 %1, i32 3
286*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
287*9880d681SAndroid Build Coastguard Worker}
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddvq_s32(<4 x i32> %a1) {
290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s32:
291*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s [[REGNUM:s[0-9]+]], v0
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, [[REGNUM]]
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
294*9880d681SAndroid Build Coastguard Workerentry:
295*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> %a1)
296*9880d681SAndroid Build Coastguard Worker  ret i32 %vaddv.i
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddvq_s32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) {
300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_s32_used_by_laneop:
301*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s s[[REGNUM:[0-9]+]], v1
302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0]
303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
304*9880d681SAndroid Build Coastguard Workerentry:
305*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> %a2)
306*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> %a1, i32 %0, i32 3
307*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
308*9880d681SAndroid Build Coastguard Worker}
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_vaddvq_u8(<16 x i8> %a1) {
311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u8:
312*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v0
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
314*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
315*9880d681SAndroid Build Coastguard Workerentry:
316*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> %a1)
317*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i8
318*9880d681SAndroid Build Coastguard Worker  ret i8 %0
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vaddvq_u8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) {
322*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u8_used_by_laneop:
323*9880d681SAndroid Build Coastguard Worker; CHECK: addv.16b b[[REGNUM:[0-9]+]], v1
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0]
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
326*9880d681SAndroid Build Coastguard Workerentry:
327*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> %a2)
328*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i8
329*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <16 x i8> %a1, i8 %1, i32 3
330*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %2
331*9880d681SAndroid Build Coastguard Worker}
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_vaddvq_u16(<8 x i16> %a1) {
334*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u16:
335*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v0
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]]
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
338*9880d681SAndroid Build Coastguard Workerentry:
339*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> %a1)
340*9880d681SAndroid Build Coastguard Worker  %0 = trunc i32 %vaddv.i to i16
341*9880d681SAndroid Build Coastguard Worker  ret i16 %0
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vaddvq_u16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) {
345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u16_used_by_laneop:
346*9880d681SAndroid Build Coastguard Worker; CHECK: addv.8h h[[REGNUM:[0-9]+]], v1
347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0]
348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
349*9880d681SAndroid Build Coastguard Workerentry:
350*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> %a2)
351*9880d681SAndroid Build Coastguard Worker  %1 = trunc i32 %0 to i16
352*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <8 x i16> %a1, i16 %1, i32 3
353*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %2
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vaddvq_u32(<4 x i32> %a1) {
357*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u32:
358*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s [[REGNUM:s[0-9]+]], v0
359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov [[FMOVRES:w[0-9]+]], [[REGNUM]]
360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
361*9880d681SAndroid Build Coastguard Workerentry:
362*9880d681SAndroid Build Coastguard Worker  %vaddv.i = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> %a1)
363*9880d681SAndroid Build Coastguard Worker  ret i32 %vaddv.i
364*9880d681SAndroid Build Coastguard Worker}
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vaddvq_u32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) {
367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vaddvq_u32_used_by_laneop:
368*9880d681SAndroid Build Coastguard Worker; CHECK: addv.4s s[[REGNUM:[0-9]+]], v1
369*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0]
370*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
371*9880d681SAndroid Build Coastguard Workerentry:
372*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> %a2)
373*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> %a1, i32 %0, i32 3
374*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %1
375*9880d681SAndroid Build Coastguard Worker}
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32>)
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16>)
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8>)
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32>)
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16>)
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8>)
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64>)
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32>)
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16>)
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8>)
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32>)
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64>)
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16>)
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8>)
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.aarch64.neon.faddv.f32.v2f32(<2 x float> %a1)
406*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.aarch64.neon.faddv.f32.v4f32(<4 x float> %a1)
407*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.aarch64.neon.faddv.f64.v2f64(<2 x double> %a1)
408