[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-vhadd.ll
blob5f8447b19bb5f87b52527f627d71c14710443e36
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s
4 define <8 x i8> @shadd8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
5 ; CHECK-LABEL: shadd8b:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    ldr d0, [x0]
8 ; CHECK-NEXT:    ldr d1, [x1]
9 ; CHECK-NEXT:    shadd.8b v0, v0, v1
10 ; CHECK-NEXT:    ret
11         %tmp1 = load <8 x i8>, <8 x i8>* %A
12         %tmp2 = load <8 x i8>, <8 x i8>* %B
13         %tmp3 = call <8 x i8> @llvm.aarch64.neon.shadd.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
14         ret <8 x i8> %tmp3
17 define <16 x i8> @shadd16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
18 ; CHECK-LABEL: shadd16b:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    ldr q0, [x0]
21 ; CHECK-NEXT:    ldr q1, [x1]
22 ; CHECK-NEXT:    shadd.16b v0, v0, v1
23 ; CHECK-NEXT:    ret
24         %tmp1 = load <16 x i8>, <16 x i8>* %A
25         %tmp2 = load <16 x i8>, <16 x i8>* %B
26         %tmp3 = call <16 x i8> @llvm.aarch64.neon.shadd.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
27         ret <16 x i8> %tmp3
30 define <4 x i16> @shadd4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
31 ; CHECK-LABEL: shadd4h:
32 ; CHECK:       // %bb.0:
33 ; CHECK-NEXT:    ldr d0, [x0]
34 ; CHECK-NEXT:    ldr d1, [x1]
35 ; CHECK-NEXT:    shadd.4h v0, v0, v1
36 ; CHECK-NEXT:    ret
37         %tmp1 = load <4 x i16>, <4 x i16>* %A
38         %tmp2 = load <4 x i16>, <4 x i16>* %B
39         %tmp3 = call <4 x i16> @llvm.aarch64.neon.shadd.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
40         ret <4 x i16> %tmp3
43 define <8 x i16> @shadd8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
44 ; CHECK-LABEL: shadd8h:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    ldr q0, [x0]
47 ; CHECK-NEXT:    ldr q1, [x1]
48 ; CHECK-NEXT:    shadd.8h v0, v0, v1
49 ; CHECK-NEXT:    ret
50         %tmp1 = load <8 x i16>, <8 x i16>* %A
51         %tmp2 = load <8 x i16>, <8 x i16>* %B
52         %tmp3 = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
53         ret <8 x i16> %tmp3
56 define <2 x i32> @shadd2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
57 ; CHECK-LABEL: shadd2s:
58 ; CHECK:       // %bb.0:
59 ; CHECK-NEXT:    ldr d0, [x0]
60 ; CHECK-NEXT:    ldr d1, [x1]
61 ; CHECK-NEXT:    shadd.2s v0, v0, v1
62 ; CHECK-NEXT:    ret
63         %tmp1 = load <2 x i32>, <2 x i32>* %A
64         %tmp2 = load <2 x i32>, <2 x i32>* %B
65         %tmp3 = call <2 x i32> @llvm.aarch64.neon.shadd.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
66         ret <2 x i32> %tmp3
69 define <4 x i32> @shadd4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
70 ; CHECK-LABEL: shadd4s:
71 ; CHECK:       // %bb.0:
72 ; CHECK-NEXT:    ldr q0, [x0]
73 ; CHECK-NEXT:    ldr q1, [x1]
74 ; CHECK-NEXT:    shadd.4s v0, v0, v1
75 ; CHECK-NEXT:    ret
76         %tmp1 = load <4 x i32>, <4 x i32>* %A
77         %tmp2 = load <4 x i32>, <4 x i32>* %B
78         %tmp3 = call <4 x i32> @llvm.aarch64.neon.shadd.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
79         ret <4 x i32> %tmp3
82 define <8 x i8> @uhadd8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
83 ; CHECK-LABEL: uhadd8b:
84 ; CHECK:       // %bb.0:
85 ; CHECK-NEXT:    ldr d0, [x0]
86 ; CHECK-NEXT:    ldr d1, [x1]
87 ; CHECK-NEXT:    uhadd.8b v0, v0, v1
88 ; CHECK-NEXT:    ret
89         %tmp1 = load <8 x i8>, <8 x i8>* %A
90         %tmp2 = load <8 x i8>, <8 x i8>* %B
91         %tmp3 = call <8 x i8> @llvm.aarch64.neon.uhadd.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
92         ret <8 x i8> %tmp3
95 define <16 x i8> @uhadd16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
96 ; CHECK-LABEL: uhadd16b:
97 ; CHECK:       // %bb.0:
98 ; CHECK-NEXT:    ldr q0, [x0]
99 ; CHECK-NEXT:    ldr q1, [x1]
100 ; CHECK-NEXT:    uhadd.16b v0, v0, v1
101 ; CHECK-NEXT:    ret
102         %tmp1 = load <16 x i8>, <16 x i8>* %A
103         %tmp2 = load <16 x i8>, <16 x i8>* %B
104         %tmp3 = call <16 x i8> @llvm.aarch64.neon.uhadd.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
105         ret <16 x i8> %tmp3
108 define <4 x i16> @uhadd4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
109 ; CHECK-LABEL: uhadd4h:
110 ; CHECK:       // %bb.0:
111 ; CHECK-NEXT:    ldr d0, [x0]
112 ; CHECK-NEXT:    ldr d1, [x1]
113 ; CHECK-NEXT:    uhadd.4h v0, v0, v1
114 ; CHECK-NEXT:    ret
115         %tmp1 = load <4 x i16>, <4 x i16>* %A
116         %tmp2 = load <4 x i16>, <4 x i16>* %B
117         %tmp3 = call <4 x i16> @llvm.aarch64.neon.uhadd.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
118         ret <4 x i16> %tmp3
121 define <8 x i16> @uhadd8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
122 ; CHECK-LABEL: uhadd8h:
123 ; CHECK:       // %bb.0:
124 ; CHECK-NEXT:    ldr q0, [x0]
125 ; CHECK-NEXT:    ldr q1, [x1]
126 ; CHECK-NEXT:    uhadd.8h v0, v0, v1
127 ; CHECK-NEXT:    ret
128         %tmp1 = load <8 x i16>, <8 x i16>* %A
129         %tmp2 = load <8 x i16>, <8 x i16>* %B
130         %tmp3 = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
131         ret <8 x i16> %tmp3
134 define <2 x i32> @uhadd2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
135 ; CHECK-LABEL: uhadd2s:
136 ; CHECK:       // %bb.0:
137 ; CHECK-NEXT:    ldr d0, [x0]
138 ; CHECK-NEXT:    ldr d1, [x1]
139 ; CHECK-NEXT:    uhadd.2s v0, v0, v1
140 ; CHECK-NEXT:    ret
141         %tmp1 = load <2 x i32>, <2 x i32>* %A
142         %tmp2 = load <2 x i32>, <2 x i32>* %B
143         %tmp3 = call <2 x i32> @llvm.aarch64.neon.uhadd.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
144         ret <2 x i32> %tmp3
147 define <4 x i32> @uhadd4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
148 ; CHECK-LABEL: uhadd4s:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    ldr q0, [x0]
151 ; CHECK-NEXT:    ldr q1, [x1]
152 ; CHECK-NEXT:    uhadd.4s v0, v0, v1
153 ; CHECK-NEXT:    ret
154         %tmp1 = load <4 x i32>, <4 x i32>* %A
155         %tmp2 = load <4 x i32>, <4 x i32>* %B
156         %tmp3 = call <4 x i32> @llvm.aarch64.neon.uhadd.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
157         ret <4 x i32> %tmp3
160 declare <8 x i8>  @llvm.aarch64.neon.shadd.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
161 declare <4 x i16> @llvm.aarch64.neon.shadd.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
162 declare <2 x i32> @llvm.aarch64.neon.shadd.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
164 declare <8 x i8>  @llvm.aarch64.neon.uhadd.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
165 declare <4 x i16> @llvm.aarch64.neon.uhadd.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
166 declare <2 x i32> @llvm.aarch64.neon.uhadd.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
168 declare <16 x i8> @llvm.aarch64.neon.shadd.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
169 declare <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
170 declare <4 x i32> @llvm.aarch64.neon.shadd.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
172 declare <16 x i8> @llvm.aarch64.neon.uhadd.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
173 declare <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
174 declare <4 x i32> @llvm.aarch64.neon.uhadd.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
176 define <8 x i8> @srhadd8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
177 ; CHECK-LABEL: srhadd8b:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    ldr d0, [x0]
180 ; CHECK-NEXT:    ldr d1, [x1]
181 ; CHECK-NEXT:    srhadd.8b v0, v0, v1
182 ; CHECK-NEXT:    ret
183         %tmp1 = load <8 x i8>, <8 x i8>* %A
184         %tmp2 = load <8 x i8>, <8 x i8>* %B
185         %tmp3 = call <8 x i8> @llvm.aarch64.neon.srhadd.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
186         ret <8 x i8> %tmp3
189 define <16 x i8> @srhadd16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
190 ; CHECK-LABEL: srhadd16b:
191 ; CHECK:       // %bb.0:
192 ; CHECK-NEXT:    ldr q0, [x0]
193 ; CHECK-NEXT:    ldr q1, [x1]
194 ; CHECK-NEXT:    srhadd.16b v0, v0, v1
195 ; CHECK-NEXT:    ret
196         %tmp1 = load <16 x i8>, <16 x i8>* %A
197         %tmp2 = load <16 x i8>, <16 x i8>* %B
198         %tmp3 = call <16 x i8> @llvm.aarch64.neon.srhadd.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
199         ret <16 x i8> %tmp3
202 define <4 x i16> @srhadd4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
203 ; CHECK-LABEL: srhadd4h:
204 ; CHECK:       // %bb.0:
205 ; CHECK-NEXT:    ldr d0, [x0]
206 ; CHECK-NEXT:    ldr d1, [x1]
207 ; CHECK-NEXT:    srhadd.4h v0, v0, v1
208 ; CHECK-NEXT:    ret
209         %tmp1 = load <4 x i16>, <4 x i16>* %A
210         %tmp2 = load <4 x i16>, <4 x i16>* %B
211         %tmp3 = call <4 x i16> @llvm.aarch64.neon.srhadd.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
212         ret <4 x i16> %tmp3
215 define <8 x i16> @srhadd8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
216 ; CHECK-LABEL: srhadd8h:
217 ; CHECK:       // %bb.0:
218 ; CHECK-NEXT:    ldr q0, [x0]
219 ; CHECK-NEXT:    ldr q1, [x1]
220 ; CHECK-NEXT:    srhadd.8h v0, v0, v1
221 ; CHECK-NEXT:    ret
222         %tmp1 = load <8 x i16>, <8 x i16>* %A
223         %tmp2 = load <8 x i16>, <8 x i16>* %B
224         %tmp3 = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
225         ret <8 x i16> %tmp3
228 define <2 x i32> @srhadd2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
229 ; CHECK-LABEL: srhadd2s:
230 ; CHECK:       // %bb.0:
231 ; CHECK-NEXT:    ldr d0, [x0]
232 ; CHECK-NEXT:    ldr d1, [x1]
233 ; CHECK-NEXT:    srhadd.2s v0, v0, v1
234 ; CHECK-NEXT:    ret
235         %tmp1 = load <2 x i32>, <2 x i32>* %A
236         %tmp2 = load <2 x i32>, <2 x i32>* %B
237         %tmp3 = call <2 x i32> @llvm.aarch64.neon.srhadd.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
238         ret <2 x i32> %tmp3
241 define <4 x i32> @srhadd4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
242 ; CHECK-LABEL: srhadd4s:
243 ; CHECK:       // %bb.0:
244 ; CHECK-NEXT:    ldr q0, [x0]
245 ; CHECK-NEXT:    ldr q1, [x1]
246 ; CHECK-NEXT:    srhadd.4s v0, v0, v1
247 ; CHECK-NEXT:    ret
248         %tmp1 = load <4 x i32>, <4 x i32>* %A
249         %tmp2 = load <4 x i32>, <4 x i32>* %B
250         %tmp3 = call <4 x i32> @llvm.aarch64.neon.srhadd.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
251         ret <4 x i32> %tmp3
254 define <8 x i8> @urhadd8b(<8 x i8>* %A, <8 x i8>* %B) nounwind {
255 ; CHECK-LABEL: urhadd8b:
256 ; CHECK:       // %bb.0:
257 ; CHECK-NEXT:    ldr d0, [x0]
258 ; CHECK-NEXT:    ldr d1, [x1]
259 ; CHECK-NEXT:    urhadd.8b v0, v0, v1
260 ; CHECK-NEXT:    ret
261         %tmp1 = load <8 x i8>, <8 x i8>* %A
262         %tmp2 = load <8 x i8>, <8 x i8>* %B
263         %tmp3 = call <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8> %tmp1, <8 x i8> %tmp2)
264         ret <8 x i8> %tmp3
267 define <16 x i8> @urhadd16b(<16 x i8>* %A, <16 x i8>* %B) nounwind {
268 ; CHECK-LABEL: urhadd16b:
269 ; CHECK:       // %bb.0:
270 ; CHECK-NEXT:    ldr q0, [x0]
271 ; CHECK-NEXT:    ldr q1, [x1]
272 ; CHECK-NEXT:    urhadd.16b v0, v0, v1
273 ; CHECK-NEXT:    ret
274         %tmp1 = load <16 x i8>, <16 x i8>* %A
275         %tmp2 = load <16 x i8>, <16 x i8>* %B
276         %tmp3 = call <16 x i8> @llvm.aarch64.neon.urhadd.v16i8(<16 x i8> %tmp1, <16 x i8> %tmp2)
277         ret <16 x i8> %tmp3
280 define <4 x i16> @urhadd4h(<4 x i16>* %A, <4 x i16>* %B) nounwind {
281 ; CHECK-LABEL: urhadd4h:
282 ; CHECK:       // %bb.0:
283 ; CHECK-NEXT:    ldr d0, [x0]
284 ; CHECK-NEXT:    ldr d1, [x1]
285 ; CHECK-NEXT:    urhadd.4h v0, v0, v1
286 ; CHECK-NEXT:    ret
287         %tmp1 = load <4 x i16>, <4 x i16>* %A
288         %tmp2 = load <4 x i16>, <4 x i16>* %B
289         %tmp3 = call <4 x i16> @llvm.aarch64.neon.urhadd.v4i16(<4 x i16> %tmp1, <4 x i16> %tmp2)
290         ret <4 x i16> %tmp3
293 define <8 x i16> @urhadd8h(<8 x i16>* %A, <8 x i16>* %B) nounwind {
294 ; CHECK-LABEL: urhadd8h:
295 ; CHECK:       // %bb.0:
296 ; CHECK-NEXT:    ldr q0, [x0]
297 ; CHECK-NEXT:    ldr q1, [x1]
298 ; CHECK-NEXT:    urhadd.8h v0, v0, v1
299 ; CHECK-NEXT:    ret
300         %tmp1 = load <8 x i16>, <8 x i16>* %A
301         %tmp2 = load <8 x i16>, <8 x i16>* %B
302         %tmp3 = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> %tmp1, <8 x i16> %tmp2)
303         ret <8 x i16> %tmp3
306 define <2 x i32> @urhadd2s(<2 x i32>* %A, <2 x i32>* %B) nounwind {
307 ; CHECK-LABEL: urhadd2s:
308 ; CHECK:       // %bb.0:
309 ; CHECK-NEXT:    ldr d0, [x0]
310 ; CHECK-NEXT:    ldr d1, [x1]
311 ; CHECK-NEXT:    urhadd.2s v0, v0, v1
312 ; CHECK-NEXT:    ret
313         %tmp1 = load <2 x i32>, <2 x i32>* %A
314         %tmp2 = load <2 x i32>, <2 x i32>* %B
315         %tmp3 = call <2 x i32> @llvm.aarch64.neon.urhadd.v2i32(<2 x i32> %tmp1, <2 x i32> %tmp2)
316         ret <2 x i32> %tmp3
319 define <4 x i32> @urhadd4s(<4 x i32>* %A, <4 x i32>* %B) nounwind {
320 ; CHECK-LABEL: urhadd4s:
321 ; CHECK:       // %bb.0:
322 ; CHECK-NEXT:    ldr q0, [x0]
323 ; CHECK-NEXT:    ldr q1, [x1]
324 ; CHECK-NEXT:    urhadd.4s v0, v0, v1
325 ; CHECK-NEXT:    ret
326         %tmp1 = load <4 x i32>, <4 x i32>* %A
327         %tmp2 = load <4 x i32>, <4 x i32>* %B
328         %tmp3 = call <4 x i32> @llvm.aarch64.neon.urhadd.v4i32(<4 x i32> %tmp1, <4 x i32> %tmp2)
329         ret <4 x i32> %tmp3
332 define void @testLowerToSRHADD8b(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
333 ; CHECK-LABEL: testLowerToSRHADD8b:
334 ; CHECK:       // %bb.0:
335 ; CHECK-NEXT:    srhadd.8b v0, v0, v1
336 ; CHECK-NEXT:    str d0, [x0]
337 ; CHECK-NEXT:    ret
338   %sextsrc1 = sext <8 x i8> %src1 to <8 x i16>
339   %sextsrc2 = sext <8 x i8> %src2 to <8 x i16>
340   %add1 = add <8 x i16> %sextsrc1, %sextsrc2
341   %add2 = add <8 x i16> %add1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
342   %resulti16 = lshr <8 x i16> %add2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
343   %result = trunc <8 x i16> %resulti16 to <8 x i8>
344   store <8 x i8> %result, <8 x i8>* %dest, align 8
345   ret void
348 define void @testLowerToSRHADD4h(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
349 ; CHECK-LABEL: testLowerToSRHADD4h:
350 ; CHECK:       // %bb.0:
351 ; CHECK-NEXT:    srhadd.4h v0, v0, v1
352 ; CHECK-NEXT:    str d0, [x0]
353 ; CHECK-NEXT:    ret
354   %sextsrc1 = sext <4 x i16> %src1 to <4 x i32>
355   %sextsrc2 = sext <4 x i16> %src2 to <4 x i32>
356   %add1 = add <4 x i32> %sextsrc1, %sextsrc2
357   %add2 = add <4 x i32> %add1, <i32 1, i32 1, i32 1, i32 1>
358   %resulti16 = lshr <4 x i32> %add2, <i32 1, i32 1, i32 1, i32 1>
359   %result = trunc <4 x i32> %resulti16 to <4 x i16>
360   store <4 x i16> %result, <4 x i16>* %dest, align 8
361   ret void
364 define void @testLowerToSRHADD2s(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
365 ; CHECK-LABEL: testLowerToSRHADD2s:
366 ; CHECK:       // %bb.0:
367 ; CHECK-NEXT:    srhadd.2s v0, v0, v1
368 ; CHECK-NEXT:    str d0, [x0]
369 ; CHECK-NEXT:    ret
370   %sextsrc1 = sext <2 x i32> %src1 to <2 x i64>
371   %sextsrc2 = sext <2 x i32> %src2 to <2 x i64>
372   %add1 = add <2 x i64> %sextsrc1, %sextsrc2
373   %add2 = add <2 x i64> %add1, <i64 1, i64 1>
374   %resulti16 = lshr <2 x i64> %add2, <i64 1, i64 1>
375   %result = trunc <2 x i64> %resulti16 to <2 x i32>
376   store <2 x i32> %result, <2 x i32>* %dest, align 8
377   ret void
380 define void @testLowerToSRHADD16b(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
381 ; CHECK-LABEL: testLowerToSRHADD16b:
382 ; CHECK:       // %bb.0:
383 ; CHECK-NEXT:    srhadd.16b v0, v0, v1
384 ; CHECK-NEXT:    str q0, [x0]
385 ; CHECK-NEXT:    ret
386   %sextsrc1 = sext <16 x i8> %src1 to <16 x i16>
387   %sextsrc2 = sext <16 x i8> %src2 to <16 x i16>
388   %add1 = add <16 x i16> %sextsrc1, %sextsrc2
389   %add2 = add <16 x i16> %add1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
390   %resulti16 = lshr <16 x i16> %add2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
391   %result = trunc <16 x i16> %resulti16 to <16 x i8>
392   store <16 x i8> %result, <16 x i8>* %dest, align 16
393   ret void
396 define void @testLowerToSRHADD8h(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
397 ; CHECK-LABEL: testLowerToSRHADD8h:
398 ; CHECK:       // %bb.0:
399 ; CHECK-NEXT:    srhadd.8h v0, v0, v1
400 ; CHECK-NEXT:    str q0, [x0]
401 ; CHECK-NEXT:    ret
402   %sextsrc1 = sext <8 x i16> %src1 to <8 x i32>
403   %sextsrc2 = sext <8 x i16> %src2 to <8 x i32>
404   %add1 = add <8 x i32> %sextsrc1, %sextsrc2
405   %add2 = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
406   %resulti16 = lshr <8 x i32> %add2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
407   %result = trunc <8 x i32> %resulti16 to <8 x i16>
408   store <8 x i16> %result, <8 x i16>* %dest, align 16
409   ret void
412 define void @testLowerToSRHADD4s(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
413 ; CHECK-LABEL: testLowerToSRHADD4s:
414 ; CHECK:       // %bb.0:
415 ; CHECK-NEXT:    srhadd.4s v0, v0, v1
416 ; CHECK-NEXT:    str q0, [x0]
417 ; CHECK-NEXT:    ret
418   %sextsrc1 = sext <4 x i32> %src1 to <4 x i64>
419   %sextsrc2 = sext <4 x i32> %src2 to <4 x i64>
420   %add1 = add <4 x i64> %sextsrc1, %sextsrc2
421   %add2 = add <4 x i64> %add1, <i64 1, i64 1, i64 1, i64 1>
422   %resulti16 = lshr <4 x i64> %add2, <i64 1, i64 1, i64 1, i64 1>
423   %result = trunc <4 x i64> %resulti16 to <4 x i32>
424   store <4 x i32> %result, <4 x i32>* %dest, align 16
425   ret void
428 define void @testLowerToSHADD8b(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
429 ; CHECK-LABEL: testLowerToSHADD8b:
430 ; CHECK:       // %bb.0:
431 ; CHECK-NEXT:    shadd.8b v0, v0, v1
432 ; CHECK-NEXT:    str d0, [x0]
433 ; CHECK-NEXT:    ret
434   %sextsrc1 = sext <8 x i8> %src1 to <8 x i16>
435   %sextsrc2 = sext <8 x i8> %src2 to <8 x i16>
436   %add = add <8 x i16> %sextsrc1, %sextsrc2
437   %resulti16 = lshr <8 x i16> %add, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
438   %result = trunc <8 x i16> %resulti16 to <8 x i8>
439   store <8 x i8> %result, <8 x i8>* %dest, align 8
440   ret void
443 define void @testLowerToSHADD4h(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
444 ; CHECK-LABEL: testLowerToSHADD4h:
445 ; CHECK:       // %bb.0:
446 ; CHECK-NEXT:    shadd.4h v0, v0, v1
447 ; CHECK-NEXT:    str d0, [x0]
448 ; CHECK-NEXT:    ret
449   %sextsrc1 = sext <4 x i16> %src1 to <4 x i32>
450   %sextsrc2 = sext <4 x i16> %src2 to <4 x i32>
451   %add = add <4 x i32> %sextsrc1, %sextsrc2
452   %resulti16 = lshr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
453   %result = trunc <4 x i32> %resulti16 to <4 x i16>
454   store <4 x i16> %result, <4 x i16>* %dest, align 8
455   ret void
458 define void @testLowerToSHADD2s(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
459 ; CHECK-LABEL: testLowerToSHADD2s:
460 ; CHECK:       // %bb.0:
461 ; CHECK-NEXT:    shadd.2s v0, v0, v1
462 ; CHECK-NEXT:    str d0, [x0]
463 ; CHECK-NEXT:    ret
464   %sextsrc1 = sext <2 x i32> %src1 to <2 x i64>
465   %sextsrc2 = sext <2 x i32> %src2 to <2 x i64>
466   %add = add <2 x i64> %sextsrc1, %sextsrc2
467   %resulti16 = lshr <2 x i64> %add, <i64 1, i64 1>
468   %result = trunc <2 x i64> %resulti16 to <2 x i32>
469   store <2 x i32> %result, <2 x i32>* %dest, align 8
470   ret void
473 define void @testLowerToSHADD16b(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
474 ; CHECK-LABEL: testLowerToSHADD16b:
475 ; CHECK:       // %bb.0:
476 ; CHECK-NEXT:    shadd.16b v0, v0, v1
477 ; CHECK-NEXT:    str q0, [x0]
478 ; CHECK-NEXT:    ret
479   %sextsrc1 = sext <16 x i8> %src1 to <16 x i16>
480   %sextsrc2 = sext <16 x i8> %src2 to <16 x i16>
481   %add = add <16 x i16> %sextsrc1, %sextsrc2
482   %resulti16 = lshr <16 x i16> %add, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
483   %result = trunc <16 x i16> %resulti16 to <16 x i8>
484   store <16 x i8> %result, <16 x i8>* %dest, align 16
485   ret void
488 define void @testLowerToSHADD8h(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
489 ; CHECK-LABEL: testLowerToSHADD8h:
490 ; CHECK:       // %bb.0:
491 ; CHECK-NEXT:    shadd.8h v0, v0, v1
492 ; CHECK-NEXT:    str q0, [x0]
493 ; CHECK-NEXT:    ret
494   %sextsrc1 = sext <8 x i16> %src1 to <8 x i32>
495   %sextsrc2 = sext <8 x i16> %src2 to <8 x i32>
496   %add = add <8 x i32> %sextsrc1, %sextsrc2
497   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
498   %result = trunc <8 x i32> %resulti16 to <8 x i16>
499   store <8 x i16> %result, <8 x i16>* %dest, align 16
500   ret void
503 define void @testLowerToSHADD4s(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
504 ; CHECK-LABEL: testLowerToSHADD4s:
505 ; CHECK:       // %bb.0:
506 ; CHECK-NEXT:    shadd.4s v0, v0, v1
507 ; CHECK-NEXT:    str q0, [x0]
508 ; CHECK-NEXT:    ret
509   %sextsrc1 = sext <4 x i32> %src1 to <4 x i64>
510   %sextsrc2 = sext <4 x i32> %src2 to <4 x i64>
511   %add = add <4 x i64> %sextsrc1, %sextsrc2
512   %resulti16 = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
513   %result = trunc <4 x i64> %resulti16 to <4 x i32>
514   store <4 x i32> %result, <4 x i32>* %dest, align 16
515   ret void
518 define void @testLowerToURHADD8b(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
519 ; CHECK-LABEL: testLowerToURHADD8b:
520 ; CHECK:       // %bb.0:
521 ; CHECK-NEXT:    urhadd.8b v0, v0, v1
522 ; CHECK-NEXT:    str d0, [x0]
523 ; CHECK-NEXT:    ret
524   %zextsrc1 = zext <8 x i8> %src1 to <8 x i16>
525   %zextsrc2 = zext <8 x i8> %src2 to <8 x i16>
526   %add1 = add <8 x i16> %zextsrc1, %zextsrc2
527   %add2 = add <8 x i16> %add1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
528   %resulti16 = lshr <8 x i16> %add2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
529   %result = trunc <8 x i16> %resulti16 to <8 x i8>
530   store <8 x i8> %result, <8 x i8>* %dest, align 8
531   ret void
534 define void @testLowerToURHADD4h(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
535 ; CHECK-LABEL: testLowerToURHADD4h:
536 ; CHECK:       // %bb.0:
537 ; CHECK-NEXT:    urhadd.4h v0, v0, v1
538 ; CHECK-NEXT:    str d0, [x0]
539 ; CHECK-NEXT:    ret
540   %zextsrc1 = zext <4 x i16> %src1 to <4 x i32>
541   %zextsrc2 = zext <4 x i16> %src2 to <4 x i32>
542   %add1 = add <4 x i32> %zextsrc1, %zextsrc2
543   %add2 = add <4 x i32> %add1, <i32 1, i32 1, i32 1, i32 1>
544   %resulti16 = lshr <4 x i32> %add2, <i32 1, i32 1, i32 1, i32 1>
545   %result = trunc <4 x i32> %resulti16 to <4 x i16>
546   store <4 x i16> %result, <4 x i16>* %dest, align 8
547   ret void
550 define void @testLowerToURHADD2s(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
551 ; CHECK-LABEL: testLowerToURHADD2s:
552 ; CHECK:       // %bb.0:
553 ; CHECK-NEXT:    urhadd.2s v0, v0, v1
554 ; CHECK-NEXT:    str d0, [x0]
555 ; CHECK-NEXT:    ret
556   %zextsrc1 = zext <2 x i32> %src1 to <2 x i64>
557   %zextsrc2 = zext <2 x i32> %src2 to <2 x i64>
558   %add1 = add <2 x i64> %zextsrc1, %zextsrc2
559   %add2 = add <2 x i64> %add1, <i64 1, i64 1>
560   %resulti16 = lshr <2 x i64> %add2, <i64 1, i64 1>
561   %result = trunc <2 x i64> %resulti16 to <2 x i32>
562   store <2 x i32> %result, <2 x i32>* %dest, align 8
563   ret void
566 define void @testLowerToURHADD16b(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
567 ; CHECK-LABEL: testLowerToURHADD16b:
568 ; CHECK:       // %bb.0:
569 ; CHECK-NEXT:    urhadd.16b v0, v0, v1
570 ; CHECK-NEXT:    str q0, [x0]
571 ; CHECK-NEXT:    ret
572   %zextsrc1 = zext <16 x i8> %src1 to <16 x i16>
573   %zextsrc2 = zext <16 x i8> %src2 to <16 x i16>
574   %add1 = add <16 x i16> %zextsrc1, %zextsrc2
575   %add2 = add <16 x i16> %add1, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
576   %resulti16 = lshr <16 x i16> %add2, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
577   %result = trunc <16 x i16> %resulti16 to <16 x i8>
578   store <16 x i8> %result, <16 x i8>* %dest, align 16
579   ret void
582 define void @testLowerToURHADD8h(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
583 ; CHECK-LABEL: testLowerToURHADD8h:
584 ; CHECK:       // %bb.0:
585 ; CHECK-NEXT:    urhadd.8h v0, v0, v1
586 ; CHECK-NEXT:    str q0, [x0]
587 ; CHECK-NEXT:    ret
588   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
589   %zextsrc2 = zext <8 x i16> %src2 to <8 x i32>
590   %add1 = add <8 x i32> %zextsrc1, %zextsrc2
591   %add2 = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
592   %resulti16 = lshr <8 x i32> %add2, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
593   %result = trunc <8 x i32> %resulti16 to <8 x i16>
594   store <8 x i16> %result, <8 x i16>* %dest, align 16
595   ret void
598 define void @testLowerToURHADD4s(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
599 ; CHECK-LABEL: testLowerToURHADD4s:
600 ; CHECK:       // %bb.0:
601 ; CHECK-NEXT:    urhadd.4s v0, v0, v1
602 ; CHECK-NEXT:    str q0, [x0]
603 ; CHECK-NEXT:    ret
604   %zextsrc1 = zext <4 x i32> %src1 to <4 x i64>
605   %zextsrc2 = zext <4 x i32> %src2 to <4 x i64>
606   %add1 = add <4 x i64> %zextsrc1, %zextsrc2
607   %add2 = add <4 x i64> %add1, <i64 1, i64 1, i64 1, i64 1>
608   %resulti16 = lshr <4 x i64> %add2, <i64 1, i64 1, i64 1, i64 1>
609   %result = trunc <4 x i64> %resulti16 to <4 x i32>
610   store <4 x i32> %result, <4 x i32>* %dest, align 16
611   ret void
614 define void @testLowerToUHADD8b(<8 x i8> %src1, <8 x i8> %src2, <8 x i8>* %dest) nounwind {
615 ; CHECK-LABEL: testLowerToUHADD8b:
616 ; CHECK:       // %bb.0:
617 ; CHECK-NEXT:    uhadd.8b v0, v0, v1
618 ; CHECK-NEXT:    str d0, [x0]
619 ; CHECK-NEXT:    ret
620   %zextsrc1 = zext <8 x i8> %src1 to <8 x i16>
621   %zextsrc2 = zext <8 x i8> %src2 to <8 x i16>
622   %add = add <8 x i16> %zextsrc1, %zextsrc2
623   %resulti16 = lshr <8 x i16> %add, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
624   %result = trunc <8 x i16> %resulti16 to <8 x i8>
625   store <8 x i8> %result, <8 x i8>* %dest, align 8
626   ret void
629 define void @testLowerToUHADD4h(<4 x i16> %src1, <4 x i16> %src2, <4 x i16>* %dest) nounwind {
630 ; CHECK-LABEL: testLowerToUHADD4h:
631 ; CHECK:       // %bb.0:
632 ; CHECK-NEXT:    uhadd.4h v0, v0, v1
633 ; CHECK-NEXT:    str d0, [x0]
634 ; CHECK-NEXT:    ret
635   %zextsrc1 = zext <4 x i16> %src1 to <4 x i32>
636   %zextsrc2 = zext <4 x i16> %src2 to <4 x i32>
637   %add = add <4 x i32> %zextsrc1, %zextsrc2
638   %resulti16 = lshr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
639   %result = trunc <4 x i32> %resulti16 to <4 x i16>
640   store <4 x i16> %result, <4 x i16>* %dest, align 8
641   ret void
644 define void @testLowerToUHADD2s(<2 x i32> %src1, <2 x i32> %src2, <2 x i32>* %dest) nounwind {
645 ; CHECK-LABEL: testLowerToUHADD2s:
646 ; CHECK:       // %bb.0:
647 ; CHECK-NEXT:    uhadd.2s v0, v0, v1
648 ; CHECK-NEXT:    str d0, [x0]
649 ; CHECK-NEXT:    ret
650   %zextsrc1 = zext <2 x i32> %src1 to <2 x i64>
651   %zextsrc2 = zext <2 x i32> %src2 to <2 x i64>
652   %add = add <2 x i64> %zextsrc1, %zextsrc2
653   %resulti16 = lshr <2 x i64> %add, <i64 1, i64 1>
654   %result = trunc <2 x i64> %resulti16 to <2 x i32>
655   store <2 x i32> %result, <2 x i32>* %dest, align 8
656   ret void
659 define void @testLowerToUHADD16b(<16 x i8> %src1, <16 x i8> %src2, <16 x i8>* %dest) nounwind {
660 ; CHECK-LABEL: testLowerToUHADD16b:
661 ; CHECK:       // %bb.0:
662 ; CHECK-NEXT:    uhadd.16b v0, v0, v1
663 ; CHECK-NEXT:    str q0, [x0]
664 ; CHECK-NEXT:    ret
665   %zextsrc1 = zext <16 x i8> %src1 to <16 x i16>
666   %zextsrc2 = zext <16 x i8> %src2 to <16 x i16>
667   %add = add <16 x i16> %zextsrc1, %zextsrc2
668   %resulti16 = lshr <16 x i16> %add, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
669   %result = trunc <16 x i16> %resulti16 to <16 x i8>
670   store <16 x i8> %result, <16 x i8>* %dest, align 16
671   ret void
674 define void @testLowerToUHADD8h(<8 x i16> %src1, <8 x i16> %src2, <8 x i16>* %dest) nounwind {
675 ; CHECK-LABEL: testLowerToUHADD8h:
676 ; CHECK:       // %bb.0:
677 ; CHECK-NEXT:    uhadd.8h v0, v0, v1
678 ; CHECK-NEXT:    str q0, [x0]
679 ; CHECK-NEXT:    ret
680   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
681   %zextsrc2 = zext <8 x i16> %src2 to <8 x i32>
682   %add = add <8 x i32> %zextsrc1, %zextsrc2
683   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
684   %result = trunc <8 x i32> %resulti16 to <8 x i16>
685   store <8 x i16> %result, <8 x i16>* %dest, align 16
686   ret void
689 define void @testLowerToUHADD4s(<4 x i32> %src1, <4 x i32> %src2, <4 x i32>* %dest) nounwind {
690 ; CHECK-LABEL: testLowerToUHADD4s:
691 ; CHECK:       // %bb.0:
692 ; CHECK-NEXT:    uhadd.4s v0, v0, v1
693 ; CHECK-NEXT:    str q0, [x0]
694 ; CHECK-NEXT:    ret
695   %zextsrc1 = zext <4 x i32> %src1 to <4 x i64>
696   %zextsrc2 = zext <4 x i32> %src2 to <4 x i64>
697   %add = add <4 x i64> %zextsrc1, %zextsrc2
698   %resulti16 = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
699   %result = trunc <4 x i64> %resulti16 to <4 x i32>
700   store <4 x i32> %result, <4 x i32>* %dest, align 16
701   ret void
705 define <4 x i32> @hadd16_sext_asr(<4 x i16> %src1, <4 x i16> %src2) nounwind {
706 ; CHECK-LABEL: hadd16_sext_asr:
707 ; CHECK:       // %bb.0:
708 ; CHECK-NEXT:    saddl.4s v0, v0, v1
709 ; CHECK-NEXT:    sshr.4s v0, v0, #1
710 ; CHECK-NEXT:    ret
711   %zextsrc1 = sext <4 x i16> %src1 to <4 x i32>
712   %zextsrc2 = sext <4 x i16> %src2 to <4 x i32>
713   %add = add <4 x i32> %zextsrc1, %zextsrc2
714   %resulti16 = ashr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
715   ret <4 x i32> %resulti16
718 define <4 x i32> @hadd16_zext_asr(<4 x i16> %src1, <4 x i16> %src2) nounwind {
719 ; CHECK-LABEL: hadd16_zext_asr:
720 ; CHECK:       // %bb.0:
721 ; CHECK-NEXT:    uaddl.4s v0, v0, v1
722 ; CHECK-NEXT:    ushr.4s v0, v0, #1
723 ; CHECK-NEXT:    ret
724   %zextsrc1 = zext <4 x i16> %src1 to <4 x i32>
725   %zextsrc2 = zext <4 x i16> %src2 to <4 x i32>
726   %add = add <4 x i32> %zextsrc1, %zextsrc2
727   %resulti16 = ashr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
728   ret <4 x i32> %resulti16
731 define <4 x i32> @hadd16_sext_lsr(<4 x i16> %src1, <4 x i16> %src2) nounwind {
732 ; CHECK-LABEL: hadd16_sext_lsr:
733 ; CHECK:       // %bb.0:
734 ; CHECK-NEXT:    saddl.4s v0, v0, v1
735 ; CHECK-NEXT:    ushr.4s v0, v0, #1
736 ; CHECK-NEXT:    ret
737   %zextsrc1 = sext <4 x i16> %src1 to <4 x i32>
738   %zextsrc2 = sext <4 x i16> %src2 to <4 x i32>
739   %add = add <4 x i32> %zextsrc1, %zextsrc2
740   %resulti16 = lshr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
741   ret <4 x i32> %resulti16
744 define <4 x i32> @hadd16_zext_lsr(<4 x i16> %src1, <4 x i16> %src2) nounwind {
745 ; CHECK-LABEL: hadd16_zext_lsr:
746 ; CHECK:       // %bb.0:
747 ; CHECK-NEXT:    uaddl.4s v0, v0, v1
748 ; CHECK-NEXT:    ushr.4s v0, v0, #1
749 ; CHECK-NEXT:    ret
750   %zextsrc1 = zext <4 x i16> %src1 to <4 x i32>
751   %zextsrc2 = zext <4 x i16> %src2 to <4 x i32>
752   %add = add <4 x i32> %zextsrc1, %zextsrc2
753   %resulti16 = lshr <4 x i32> %add, <i32 1, i32 1, i32 1, i32 1>
754   ret <4 x i32> %resulti16
759 define <4 x i64> @hadd32_sext_asr(<4 x i32> %src1, <4 x i32> %src2) nounwind {
760 ; CHECK-LABEL: hadd32_sext_asr:
761 ; CHECK:       // %bb.0:
762 ; CHECK-NEXT:    saddl.2d v2, v0, v1
763 ; CHECK-NEXT:    saddl2.2d v0, v0, v1
764 ; CHECK-NEXT:    sshr.2d v1, v0, #1
765 ; CHECK-NEXT:    sshr.2d v0, v2, #1
766 ; CHECK-NEXT:    ret
767   %zextsrc1 = sext <4 x i32> %src1 to <4 x i64>
768   %zextsrc2 = sext <4 x i32> %src2 to <4 x i64>
769   %add = add <4 x i64> %zextsrc1, %zextsrc2
770   %resulti32 = ashr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
771   ret <4 x i64> %resulti32
774 define <4 x i64> @hadd32_zext_asr(<4 x i32> %src1, <4 x i32> %src2) nounwind {
775 ; CHECK-LABEL: hadd32_zext_asr:
776 ; CHECK:       // %bb.0:
777 ; CHECK-NEXT:    uaddl.2d v2, v0, v1
778 ; CHECK-NEXT:    uaddl2.2d v0, v0, v1
779 ; CHECK-NEXT:    ushr.2d v1, v0, #1
780 ; CHECK-NEXT:    ushr.2d v0, v2, #1
781 ; CHECK-NEXT:    ret
782   %zextsrc1 = zext <4 x i32> %src1 to <4 x i64>
783   %zextsrc2 = zext <4 x i32> %src2 to <4 x i64>
784   %add = add <4 x i64> %zextsrc1, %zextsrc2
785   %resulti32 = ashr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
786   ret <4 x i64> %resulti32
789 define <4 x i64> @hadd32_sext_lsr(<4 x i32> %src1, <4 x i32> %src2) nounwind {
790 ; CHECK-LABEL: hadd32_sext_lsr:
791 ; CHECK:       // %bb.0:
792 ; CHECK-NEXT:    saddl.2d v2, v0, v1
793 ; CHECK-NEXT:    saddl2.2d v0, v0, v1
794 ; CHECK-NEXT:    ushr.2d v1, v0, #1
795 ; CHECK-NEXT:    ushr.2d v0, v2, #1
796 ; CHECK-NEXT:    ret
797   %zextsrc1 = sext <4 x i32> %src1 to <4 x i64>
798   %zextsrc2 = sext <4 x i32> %src2 to <4 x i64>
799   %add = add <4 x i64> %zextsrc1, %zextsrc2
800   %resulti32 = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
801   ret <4 x i64> %resulti32
804 define <4 x i64> @hadd32_zext_lsr(<4 x i32> %src1, <4 x i32> %src2) nounwind {
805 ; CHECK-LABEL: hadd32_zext_lsr:
806 ; CHECK:       // %bb.0:
807 ; CHECK-NEXT:    uaddl.2d v2, v0, v1
808 ; CHECK-NEXT:    uaddl2.2d v0, v0, v1
809 ; CHECK-NEXT:    ushr.2d v1, v0, #1
810 ; CHECK-NEXT:    ushr.2d v0, v2, #1
811 ; CHECK-NEXT:    ret
812   %zextsrc1 = zext <4 x i32> %src1 to <4 x i64>
813   %zextsrc2 = zext <4 x i32> %src2 to <4 x i64>
814   %add = add <4 x i64> %zextsrc1, %zextsrc2
815   %resulti32 = lshr <4 x i64> %add, <i64 1, i64 1, i64 1, i64 1>
816   ret <4 x i64> %resulti32
820 declare <8 x i8>  @llvm.aarch64.neon.srhadd.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
821 declare <4 x i16> @llvm.aarch64.neon.srhadd.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
822 declare <2 x i32> @llvm.aarch64.neon.srhadd.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
824 declare <8 x i8>  @llvm.aarch64.neon.urhadd.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
825 declare <4 x i16> @llvm.aarch64.neon.urhadd.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
826 declare <2 x i32> @llvm.aarch64.neon.urhadd.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
828 declare <16 x i8> @llvm.aarch64.neon.srhadd.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
829 declare <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
830 declare <4 x i32> @llvm.aarch64.neon.srhadd.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
832 declare <16 x i8> @llvm.aarch64.neon.urhadd.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
833 declare <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
834 declare <4 x i32> @llvm.aarch64.neon.urhadd.v4i32(<4 x i32>, <4 x i32>) nounwind readnone