[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / hadd-combine.ll
blob2269d75cdbb9ede2d94bdfc043ca5613471dd91a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64 | FileCheck %s
4 define <8 x i16> @haddu_base(<8 x i16> %src1, <8 x i16> %src2) {
5 ; CHECK-LABEL: haddu_base:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
8 ; CHECK-NEXT:    ret
9   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
10   %zextsrc2 = zext <8 x i16> %src2 to <8 x i32>
11   %add = add <8 x i32> %zextsrc1, %zextsrc2
12   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
13   %result = trunc <8 x i32> %resulti16 to <8 x i16>
14   ret <8 x i16> %result
17 define <8 x i16> @haddu_const(<8 x i16> %src1) {
18 ; CHECK-LABEL: haddu_const:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    movi v1.8h, #1
21 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
22 ; CHECK-NEXT:    ret
23   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
24   %add = add <8 x i32> %zextsrc1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
25   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
26   %result = trunc <8 x i32> %resulti16 to <8 x i16>
27   ret <8 x i16> %result
30 define <8 x i16> @haddu_const_lhs(<8 x i16> %src1) {
31 ; CHECK-LABEL: haddu_const_lhs:
32 ; CHECK:       // %bb.0:
33 ; CHECK-NEXT:    movi v1.8h, #1
34 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
35 ; CHECK-NEXT:    ret
36   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
37   %add = add <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %zextsrc1
38   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
39   %result = trunc <8 x i32> %resulti16 to <8 x i16>
40   ret <8 x i16> %result
43 define <8 x i16> @haddu_const_zero(<8 x i16> %src1) {
44 ; CHECK-LABEL: haddu_const_zero:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    ushll v1.4s, v0.4h, #0
47 ; CHECK-NEXT:    ushll2 v2.4s, v0.8h, #0
48 ; CHECK-NEXT:    shrn v0.4h, v1.4s, #1
49 ; CHECK-NEXT:    shrn2 v0.8h, v2.4s, #1
50 ; CHECK-NEXT:    ret
51   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
52   %add = add <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %zextsrc1
53   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
54   %result = trunc <8 x i32> %resulti16 to <8 x i16>
55   ret <8 x i16> %result
58 define <8 x i16> @haddu_const_both() {
59 ; CHECK-LABEL: haddu_const_both:
60 ; CHECK:       // %bb.0:
61 ; CHECK-NEXT:    movi v0.8h, #2
62 ; CHECK-NEXT:    ret
63   %add = add <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
64   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
65   %result = trunc <8 x i32> %resulti16 to <8 x i16>
66   ret <8 x i16> %result
69 define <8 x i16> @haddu_const_bothhigh() {
70 ; CHECK-LABEL: haddu_const_bothhigh:
71 ; CHECK:       // %bb.0:
72 ; CHECK-NEXT:    mvni v0.8h, #1
73 ; CHECK-NEXT:    ret
74   %ext1 = zext <8 x i16> <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534> to <8 x i32>
75   %ext2 = zext <8 x i16> <i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535> to <8 x i32>
76   %add = add <8 x i32> %ext1, %ext2
77   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
78   %result = trunc <8 x i32> %resulti16 to <8 x i16>
79   ret <8 x i16> %result
82 define <8 x i16> @haddu_undef(<8 x i16> %src1) {
83 ; CHECK-LABEL: haddu_undef:
84 ; CHECK:       // %bb.0:
85 ; CHECK-NEXT:    ushll v1.4s, v0.4h, #0
86 ; CHECK-NEXT:    ushll2 v2.4s, v0.8h, #0
87 ; CHECK-NEXT:    shrn v0.4h, v1.4s, #1
88 ; CHECK-NEXT:    shrn2 v0.8h, v2.4s, #1
89 ; CHECK-NEXT:    ret
90   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
91   %zextsrc2 = zext <8 x i16> undef to <8 x i32>
92   %add = add <8 x i32> %zextsrc2, %zextsrc1
93   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
94   %result = trunc <8 x i32> %resulti16 to <8 x i16>
95   ret <8 x i16> %result
100 define <8 x i16> @haddu_i_base(<8 x i16> %src1, <8 x i16> %src2) {
101 ; CHECK-LABEL: haddu_i_base:
102 ; CHECK:       // %bb.0:
103 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
104 ; CHECK-NEXT:    ret
105   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> %src1, <8 x i16> %src2)
106   ret <8 x i16> %result
109 define <8 x i16> @haddu_i_const(<8 x i16> %src1) {
110 ; CHECK-LABEL: haddu_i_const:
111 ; CHECK:       // %bb.0:
112 ; CHECK-NEXT:    movi v1.8h, #1
113 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
114 ; CHECK-NEXT:    ret
115   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> %src1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
116   ret <8 x i16> %result
119 define <8 x i16> @haddu_i_const_lhs(<8 x i16> %src1) {
120 ; CHECK-LABEL: haddu_i_const_lhs:
121 ; CHECK:       // %bb.0:
122 ; CHECK-NEXT:    movi v1.8h, #1
123 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
124 ; CHECK-NEXT:    ret
125   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %src1)
126   ret <8 x i16> %result
129 define <8 x i16> @haddu_i_const_zero(<8 x i16> %src1) {
130 ; CHECK-LABEL: haddu_i_const_zero:
131 ; CHECK:       // %bb.0:
132 ; CHECK-NEXT:    ushr v0.8h, v0.8h, #1
133 ; CHECK-NEXT:    ret
134   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> %src1)
135   ret <8 x i16> %result
138 define <8 x i16> @haddu_i_const_both() {
139 ; CHECK-LABEL: haddu_i_const_both:
140 ; CHECK:       // %bb.0:
141 ; CHECK-NEXT:    movi v0.8h, #2
142 ; CHECK-NEXT:    ret
143   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
144   ret <8 x i16> %result
147 define <8 x i16> @haddu_i_const_bothhigh() {
148 ; CHECK-LABEL: haddu_i_const_bothhigh:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    mvni v0.8h, #1
151 ; CHECK-NEXT:    ret
152   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>, <8 x i16> <i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535>)
153   ret <8 x i16> %result
156 define <8 x i16> @haddu_i_undef(<8 x i16> %t, <8 x i16> %src1) {
157 ; CHECK-LABEL: haddu_i_undef:
158 ; CHECK:       // %bb.0:
159 ; CHECK-NEXT:    mov v0.16b, v1.16b
160 ; CHECK-NEXT:    ret
161   %result = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> undef, <8 x i16> %src1)
162   ret <8 x i16> %result
169 define <8 x i16> @hadds_base(<8 x i16> %src1, <8 x i16> %src2) {
170 ; CHECK-LABEL: hadds_base:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
173 ; CHECK-NEXT:    ret
174   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
175   %zextsrc2 = sext <8 x i16> %src2 to <8 x i32>
176   %add = add <8 x i32> %zextsrc1, %zextsrc2
177   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
178   %result = trunc <8 x i32> %resulti16 to <8 x i16>
179   ret <8 x i16> %result
182 define <8 x i16> @hadds_const(<8 x i16> %src1) {
183 ; CHECK-LABEL: hadds_const:
184 ; CHECK:       // %bb.0:
185 ; CHECK-NEXT:    movi v1.8h, #1
186 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
187 ; CHECK-NEXT:    ret
188   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
189   %add = add <8 x i32> %zextsrc1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
190   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
191   %result = trunc <8 x i32> %resulti16 to <8 x i16>
192   ret <8 x i16> %result
195 define <8 x i16> @hadds_const_lhs(<8 x i16> %src1) {
196 ; CHECK-LABEL: hadds_const_lhs:
197 ; CHECK:       // %bb.0:
198 ; CHECK-NEXT:    movi v1.8h, #1
199 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
200 ; CHECK-NEXT:    ret
201   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
202   %add = add <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %zextsrc1
203   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
204   %result = trunc <8 x i32> %resulti16 to <8 x i16>
205   ret <8 x i16> %result
208 define <8 x i16> @hadds_const_zero(<8 x i16> %src1) {
209 ; CHECK-LABEL: hadds_const_zero:
210 ; CHECK:       // %bb.0:
211 ; CHECK-NEXT:    sshll v1.4s, v0.4h, #0
212 ; CHECK-NEXT:    sshll2 v2.4s, v0.8h, #0
213 ; CHECK-NEXT:    shrn v0.4h, v1.4s, #1
214 ; CHECK-NEXT:    shrn2 v0.8h, v2.4s, #1
215 ; CHECK-NEXT:    ret
216   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
217   %add = add <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %zextsrc1
218   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
219   %result = trunc <8 x i32> %resulti16 to <8 x i16>
220   ret <8 x i16> %result
223 define <8 x i16> @hadds_const_both() {
224 ; CHECK-LABEL: hadds_const_both:
225 ; CHECK:       // %bb.0:
226 ; CHECK-NEXT:    movi v0.8h, #2
227 ; CHECK-NEXT:    ret
228   %add = add <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
229   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
230   %result = trunc <8 x i32> %resulti16 to <8 x i16>
231   ret <8 x i16> %result
234 define <8 x i16> @hadds_const_bothhigh() {
235 ; CHECK-LABEL: hadds_const_bothhigh:
236 ; CHECK:       // %bb.0:
237 ; CHECK-NEXT:    mov w8, #32766 // =0x7ffe
238 ; CHECK-NEXT:    dup v0.8h, w8
239 ; CHECK-NEXT:    ret
240   %ext1 = sext <8 x i16> <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> to <8 x i32>
241   %ext2 = sext <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767> to <8 x i32>
242   %add = add <8 x i32> %ext1, %ext2
243   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
244   %result = trunc <8 x i32> %resulti16 to <8 x i16>
245   ret <8 x i16> %result
248 define <8 x i16> @hadds_undef(<8 x i16> %src1) {
249 ; CHECK-LABEL: hadds_undef:
250 ; CHECK:       // %bb.0:
251 ; CHECK-NEXT:    sshll v1.4s, v0.4h, #0
252 ; CHECK-NEXT:    sshll2 v2.4s, v0.8h, #0
253 ; CHECK-NEXT:    shrn v0.4h, v1.4s, #1
254 ; CHECK-NEXT:    shrn2 v0.8h, v2.4s, #1
255 ; CHECK-NEXT:    ret
256   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
257   %zextsrc2 = sext <8 x i16> undef to <8 x i32>
258   %add = add <8 x i32> %zextsrc2, %zextsrc1
259   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
260   %result = trunc <8 x i32> %resulti16 to <8 x i16>
261   ret <8 x i16> %result
266 define <8 x i16> @hadds_i_base(<8 x i16> %src1, <8 x i16> %src2) {
267 ; CHECK-LABEL: hadds_i_base:
268 ; CHECK:       // %bb.0:
269 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
270 ; CHECK-NEXT:    ret
271   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %src1, <8 x i16> %src2)
272   ret <8 x i16> %result
275 define <8 x i16> @hadds_i_const(<8 x i16> %src1) {
276 ; CHECK-LABEL: hadds_i_const:
277 ; CHECK:       // %bb.0:
278 ; CHECK-NEXT:    movi v1.8h, #1
279 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
280 ; CHECK-NEXT:    ret
281   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %src1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
282   ret <8 x i16> %result
285 define <8 x i16> @hadds_i_const_lhs(<8 x i16> %src1) {
286 ; CHECK-LABEL: hadds_i_const_lhs:
287 ; CHECK:       // %bb.0:
288 ; CHECK-NEXT:    movi v1.8h, #1
289 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
290 ; CHECK-NEXT:    ret
291   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %src1)
292   ret <8 x i16> %result
295 define <8 x i16> @hadds_i_const_zero(<8 x i16> %src1) {
296 ; CHECK-LABEL: hadds_i_const_zero:
297 ; CHECK:       // %bb.0:
298 ; CHECK-NEXT:    sshr v0.8h, v0.8h, #1
299 ; CHECK-NEXT:    ret
300   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> %src1)
301   ret <8 x i16> %result
304 define <8 x i16> @hadds_i_const_both() {
305 ; CHECK-LABEL: hadds_i_const_both:
306 ; CHECK:       // %bb.0:
307 ; CHECK-NEXT:    movi v0.8h, #2
308 ; CHECK-NEXT:    ret
309   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
310   ret <8 x i16> %result
313 define <8 x i16> @hadds_i_const_bothhigh() {
314 ; CHECK-LABEL: hadds_i_const_bothhigh:
315 ; CHECK:       // %bb.0:
316 ; CHECK-NEXT:    mov w8, #32766 // =0x7ffe
317 ; CHECK-NEXT:    dup v0.8h, w8
318 ; CHECK-NEXT:    ret
319   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>, <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>)
320   ret <8 x i16> %result
323 define <8 x i16> @hadds_i_undef(<8 x i16> %t, <8 x i16> %src1) {
324 ; CHECK-LABEL: hadds_i_undef:
325 ; CHECK:       // %bb.0:
326 ; CHECK-NEXT:    mov v0.16b, v1.16b
327 ; CHECK-NEXT:    ret
328   %result = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> undef, <8 x i16> %src1)
329   ret <8 x i16> %result
336 define <8 x i16> @rhaddu_base(<8 x i16> %src1, <8 x i16> %src2) {
337 ; CHECK-LABEL: rhaddu_base:
338 ; CHECK:       // %bb.0:
339 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
340 ; CHECK-NEXT:    ret
341   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
342   %zextsrc2 = zext <8 x i16> %src2 to <8 x i32>
343   %add1 = add <8 x i32> %zextsrc1, %zextsrc2
344   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
345   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
346   %result = trunc <8 x i32> %resulti16 to <8 x i16>
347   ret <8 x i16> %result
350 define <8 x i16> @rhaddu_const(<8 x i16> %src1) {
351 ; CHECK-LABEL: rhaddu_const:
352 ; CHECK:       // %bb.0:
353 ; CHECK-NEXT:    movi v1.8h, #1
354 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
355 ; CHECK-NEXT:    ret
356   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
357   %add1 = add <8 x i32> %zextsrc1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
358   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
359   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
360   %result = trunc <8 x i32> %resulti16 to <8 x i16>
361   ret <8 x i16> %result
364 define <8 x i16> @rhaddu_const_lhs(<8 x i16> %src1) {
365 ; CHECK-LABEL: rhaddu_const_lhs:
366 ; CHECK:       // %bb.0:
367 ; CHECK-NEXT:    movi v1.8h, #1
368 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
369 ; CHECK-NEXT:    ret
370   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
371   %add1 = add <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %zextsrc1
372   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
373   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
374   %result = trunc <8 x i32> %resulti16 to <8 x i16>
375   ret <8 x i16> %result
378 define <8 x i16> @rhaddu_const_zero(<8 x i16> %src1) {
379 ; CHECK-LABEL: rhaddu_const_zero:
380 ; CHECK:       // %bb.0:
381 ; CHECK-NEXT:    movi v1.8h, #1
382 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
383 ; CHECK-NEXT:    ret
384   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
385   %add1 = add <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %zextsrc1
386   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
387   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
388   %result = trunc <8 x i32> %resulti16 to <8 x i16>
389   ret <8 x i16> %result
392 define <8 x i16> @rhaddu_const_both() {
393 ; CHECK-LABEL: rhaddu_const_both:
394 ; CHECK:       // %bb.0:
395 ; CHECK-NEXT:    movi v0.8h, #2
396 ; CHECK-NEXT:    ret
397   %add1 = add <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
398   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
399   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
400   %result = trunc <8 x i32> %resulti16 to <8 x i16>
401   ret <8 x i16> %result
404 define <8 x i16> @rhaddu_const_bothhigh() {
405 ; CHECK-LABEL: rhaddu_const_bothhigh:
406 ; CHECK:       // %bb.0:
407 ; CHECK-NEXT:    movi v0.2d, #0xffffffffffffffff
408 ; CHECK-NEXT:    ret
409   %ext1 = zext <8 x i16> <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534> to <8 x i32>
410   %ext2 = zext <8 x i16> <i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535> to <8 x i32>
411   %add1 = add <8 x i32> %ext1, %ext2
412   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
413   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
414   %result = trunc <8 x i32> %resulti16 to <8 x i16>
415   ret <8 x i16> %result
418 define <8 x i16> @rhaddu_undef(<8 x i16> %src1) {
419 ; CHECK-LABEL: rhaddu_undef:
420 ; CHECK:       // %bb.0:
421 ; CHECK-NEXT:    movi v1.8h, #1
422 ; CHECK-NEXT:    uhadd v0.8h, v0.8h, v1.8h
423 ; CHECK-NEXT:    ret
424   %zextsrc1 = zext <8 x i16> %src1 to <8 x i32>
425   %zextsrc2 = zext <8 x i16> undef to <8 x i32>
426   %add1 = add <8 x i32> %zextsrc2, %zextsrc1
427   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
428   %resulti16 = lshr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
429   %result = trunc <8 x i32> %resulti16 to <8 x i16>
430   ret <8 x i16> %result
435 define <8 x i16> @rhaddu_i_base(<8 x i16> %src1, <8 x i16> %src2) {
436 ; CHECK-LABEL: rhaddu_i_base:
437 ; CHECK:       // %bb.0:
438 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
439 ; CHECK-NEXT:    ret
440   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> %src1, <8 x i16> %src2)
441   ret <8 x i16> %result
444 define <8 x i16> @rhaddu_i_const(<8 x i16> %src1) {
445 ; CHECK-LABEL: rhaddu_i_const:
446 ; CHECK:       // %bb.0:
447 ; CHECK-NEXT:    movi v1.8h, #1
448 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
449 ; CHECK-NEXT:    ret
450   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> %src1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
451   ret <8 x i16> %result
454 define <8 x i16> @rhaddu_i_const_lhs(<8 x i16> %src1) {
455 ; CHECK-LABEL: rhaddu_i_const_lhs:
456 ; CHECK:       // %bb.0:
457 ; CHECK-NEXT:    movi v1.8h, #1
458 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
459 ; CHECK-NEXT:    ret
460   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %src1)
461   ret <8 x i16> %result
464 define <8 x i16> @rhaddu_i_const_zero(<8 x i16> %src1) {
465 ; CHECK-LABEL: rhaddu_i_const_zero:
466 ; CHECK:       // %bb.0:
467 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
468 ; CHECK-NEXT:    urhadd v0.8h, v0.8h, v1.8h
469 ; CHECK-NEXT:    ret
470   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> %src1)
471   ret <8 x i16> %result
474 define <8 x i16> @rhaddu_i_const_both() {
475 ; CHECK-LABEL: rhaddu_i_const_both:
476 ; CHECK:       // %bb.0:
477 ; CHECK-NEXT:    movi v0.8h, #2
478 ; CHECK-NEXT:    ret
479   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
480   ret <8 x i16> %result
483 define <8 x i16> @rhaddu_i_const_bothhigh() {
484 ; CHECK-LABEL: rhaddu_i_const_bothhigh:
485 ; CHECK:       // %bb.0:
486 ; CHECK-NEXT:    movi v0.2d, #0xffffffffffffffff
487 ; CHECK-NEXT:    ret
488   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> <i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534, i16 65534>, <8 x i16> <i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535, i16 65535>)
489   ret <8 x i16> %result
492 define <8 x i16> @rhaddu_i_undef(<8 x i16> %t, <8 x i16> %src1) {
493 ; CHECK-LABEL: rhaddu_i_undef:
494 ; CHECK:       // %bb.0:
495 ; CHECK-NEXT:    mov v0.16b, v1.16b
496 ; CHECK-NEXT:    ret
497   %result = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> undef, <8 x i16> %src1)
498   ret <8 x i16> %result
505 define <8 x i16> @rhadds_base(<8 x i16> %src1, <8 x i16> %src2) {
506 ; CHECK-LABEL: rhadds_base:
507 ; CHECK:       // %bb.0:
508 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
509 ; CHECK-NEXT:    ret
510   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
511   %zextsrc2 = sext <8 x i16> %src2 to <8 x i32>
512   %add1 = add <8 x i32> %zextsrc1, %zextsrc2
513   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
514   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
515   %result = trunc <8 x i32> %resulti16 to <8 x i16>
516   ret <8 x i16> %result
519 define <8 x i16> @rhadds_const(<8 x i16> %src1) {
520 ; CHECK-LABEL: rhadds_const:
521 ; CHECK:       // %bb.0:
522 ; CHECK-NEXT:    movi v1.8h, #1
523 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
524 ; CHECK-NEXT:    ret
525   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
526   %add1 = add <8 x i32> %zextsrc1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
527   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
528   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
529   %result = trunc <8 x i32> %resulti16 to <8 x i16>
530   ret <8 x i16> %result
533 define <8 x i16> @rhadds_const_lhs(<8 x i16> %src1) {
534 ; CHECK-LABEL: rhadds_const_lhs:
535 ; CHECK:       // %bb.0:
536 ; CHECK-NEXT:    movi v1.8h, #1
537 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
538 ; CHECK-NEXT:    ret
539   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
540   %add1 = add <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %zextsrc1
541   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
542   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
543   %result = trunc <8 x i32> %resulti16 to <8 x i16>
544   ret <8 x i16> %result
547 define <8 x i16> @rhadds_const_zero(<8 x i16> %src1) {
548 ; CHECK-LABEL: rhadds_const_zero:
549 ; CHECK:       // %bb.0:
550 ; CHECK-NEXT:    movi v1.8h, #1
551 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
552 ; CHECK-NEXT:    ret
553   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
554   %add1 = add <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, %zextsrc1
555   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
556   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
557   %result = trunc <8 x i32> %resulti16 to <8 x i16>
558   ret <8 x i16> %result
561 define <8 x i16> @rhadds_const_both() {
562 ; CHECK-LABEL: rhadds_const_both:
563 ; CHECK:       // %bb.0:
564 ; CHECK-NEXT:    movi v0.8h, #2
565 ; CHECK-NEXT:    ret
566   %add1 = add <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
567   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
568   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
569   %result = trunc <8 x i32> %resulti16 to <8 x i16>
570   ret <8 x i16> %result
573 define <8 x i16> @rhadds_const_bothhigh() {
574 ; CHECK-LABEL: rhadds_const_bothhigh:
575 ; CHECK:       // %bb.0:
576 ; CHECK-NEXT:    mvni v0.8h, #128, lsl #8
577 ; CHECK-NEXT:    ret
578   %ext1 = sext <8 x i16> <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766> to <8 x i32>
579   %ext2 = sext <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767> to <8 x i32>
580   %add1 = add <8 x i32> %ext1, %ext2
581   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
582   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
583   %result = trunc <8 x i32> %resulti16 to <8 x i16>
584   ret <8 x i16> %result
587 define <8 x i16> @rhadds_undef(<8 x i16> %src1) {
588 ; CHECK-LABEL: rhadds_undef:
589 ; CHECK:       // %bb.0:
590 ; CHECK-NEXT:    movi v1.8h, #1
591 ; CHECK-NEXT:    shadd v0.8h, v0.8h, v1.8h
592 ; CHECK-NEXT:    ret
593   %zextsrc1 = sext <8 x i16> %src1 to <8 x i32>
594   %zextsrc2 = sext <8 x i16> undef to <8 x i32>
595   %add1 = add <8 x i32> %zextsrc2, %zextsrc1
596   %add = add <8 x i32> %add1, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
597   %resulti16 = ashr <8 x i32> %add, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
598   %result = trunc <8 x i32> %resulti16 to <8 x i16>
599   ret <8 x i16> %result
604 define <8 x i16> @rhadds_i_base(<8 x i16> %src1, <8 x i16> %src2) {
605 ; CHECK-LABEL: rhadds_i_base:
606 ; CHECK:       // %bb.0:
607 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
608 ; CHECK-NEXT:    ret
609   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %src1, <8 x i16> %src2)
610   ret <8 x i16> %result
613 define <8 x i16> @rhadds_i_const(<8 x i16> %src1) {
614 ; CHECK-LABEL: rhadds_i_const:
615 ; CHECK:       // %bb.0:
616 ; CHECK-NEXT:    movi v1.8h, #1
617 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
618 ; CHECK-NEXT:    ret
619   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %src1, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
620   ret <8 x i16> %result
623 define <8 x i16> @rhadds_i_const_lhs(<8 x i16> %src1) {
624 ; CHECK-LABEL: rhadds_i_const_lhs:
625 ; CHECK:       // %bb.0:
626 ; CHECK-NEXT:    movi v1.8h, #1
627 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
628 ; CHECK-NEXT:    ret
629   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %src1)
630   ret <8 x i16> %result
633 define <8 x i16> @rhadds_i_const_zero(<8 x i16> %src1) {
634 ; CHECK-LABEL: rhadds_i_const_zero:
635 ; CHECK:       // %bb.0:
636 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
637 ; CHECK-NEXT:    srhadd v0.8h, v0.8h, v1.8h
638 ; CHECK-NEXT:    ret
639   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> %src1)
640   ret <8 x i16> %result
643 define <8 x i16> @rhadds_i_const_both() {
644 ; CHECK-LABEL: rhadds_i_const_both:
645 ; CHECK:       // %bb.0:
646 ; CHECK-NEXT:    movi v0.8h, #2
647 ; CHECK-NEXT:    ret
648   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>)
649   ret <8 x i16> %result
652 define <8 x i16> @rhadds_i_const_bothhigh() {
653 ; CHECK-LABEL: rhadds_i_const_bothhigh:
654 ; CHECK:       // %bb.0:
655 ; CHECK-NEXT:    mvni v0.8h, #128, lsl #8
656 ; CHECK-NEXT:    ret
657   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> <i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766, i16 32766>, <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>)
658   ret <8 x i16> %result
661 define <8 x i16> @rhadds_i_undef(<8 x i16> %t, <8 x i16> %src1) {
662 ; CHECK-LABEL: rhadds_i_undef:
663 ; CHECK:       // %bb.0:
664 ; CHECK-NEXT:    mov v0.16b, v1.16b
665 ; CHECK-NEXT:    ret
666   %result = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> undef, <8 x i16> %src1)
667   ret <8 x i16> %result
671 define <8 x i8> @shadd_v8i8(<8 x i8> %x) {
672 ; CHECK-LABEL: shadd_v8i8:
673 ; CHECK:       // %bb.0:
674 ; CHECK-NEXT:    ret
675   %r = tail call <8 x i8> @llvm.aarch64.neon.shadd.v8i8(<8 x i8> %x, <8 x i8> %x)
676   ret <8 x i8> %r
679 define <4 x i16> @shadd_v4i16(<4 x i16> %x) {
680 ; CHECK-LABEL: shadd_v4i16:
681 ; CHECK:       // %bb.0:
682 ; CHECK-NEXT:    ret
683   %r = tail call <4 x i16> @llvm.aarch64.neon.shadd.v4i16(<4 x i16> %x, <4 x i16> %x)
684   ret <4 x i16> %r
687 define <2 x i32> @shadd_v2i32(<2 x i32> %x) {
688 ; CHECK-LABEL: shadd_v2i32:
689 ; CHECK:       // %bb.0:
690 ; CHECK-NEXT:    ret
691   %r = tail call <2 x i32> @llvm.aarch64.neon.shadd.v2i32(<2 x i32> %x, <2 x i32> %x)
692   ret <2 x i32> %r
695 define <16 x i8> @shadd_v16i8(<16 x i8> %x) {
696 ; CHECK-LABEL: shadd_v16i8:
697 ; CHECK:       // %bb.0:
698 ; CHECK-NEXT:    ret
699   %r = tail call <16 x i8> @llvm.aarch64.neon.shadd.v16i8(<16 x i8> %x, <16 x i8> %x)
700   ret <16 x i8> %r
703 define <8 x i16> @shadd_v8i16(<8 x i16> %x) {
704 ; CHECK-LABEL: shadd_v8i16:
705 ; CHECK:       // %bb.0:
706 ; CHECK-NEXT:    ret
707   %r = tail call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %x, <8 x i16> %x)
708   ret <8 x i16> %r
711 define <4 x i32> @shadd_v4i32(<4 x i32> %x) {
712 ; CHECK-LABEL: shadd_v4i32:
713 ; CHECK:       // %bb.0:
714 ; CHECK-NEXT:    ret
715   %r = tail call <4 x i32> @llvm.aarch64.neon.shadd.v4i32(<4 x i32> %x, <4 x i32> %x)
716   ret <4 x i32> %r
719 define <8 x i8> @uhadd_v8i8(<8 x i8> %x) {
720 ; CHECK-LABEL: uhadd_v8i8:
721 ; CHECK:       // %bb.0:
722 ; CHECK-NEXT:    ret
723   %r = tail call <8 x i8> @llvm.aarch64.neon.uhadd.v8i8(<8 x i8> %x, <8 x i8> %x)
724   ret <8 x i8> %r
727 define <4 x i16> @uhadd_v4i16(<4 x i16> %x) {
728 ; CHECK-LABEL: uhadd_v4i16:
729 ; CHECK:       // %bb.0:
730 ; CHECK-NEXT:    ret
731   %r = tail call <4 x i16> @llvm.aarch64.neon.uhadd.v4i16(<4 x i16> %x, <4 x i16> %x)
732   ret <4 x i16> %r
735 define <2 x i32> @uhadd_v2i32(<2 x i32> %x) {
736 ; CHECK-LABEL: uhadd_v2i32:
737 ; CHECK:       // %bb.0:
738 ; CHECK-NEXT:    ret
739   %r = tail call <2 x i32> @llvm.aarch64.neon.uhadd.v2i32(<2 x i32> %x, <2 x i32> %x)
740   ret <2 x i32> %r
743 define <16 x i8> @uhadd_v16i8(<16 x i8> %x) {
744 ; CHECK-LABEL: uhadd_v16i8:
745 ; CHECK:       // %bb.0:
746 ; CHECK-NEXT:    ret
747   %r = tail call <16 x i8> @llvm.aarch64.neon.uhadd.v16i8(<16 x i8> %x, <16 x i8> %x)
748   ret <16 x i8> %r
751 define <8 x i16> @uhadd_v8i16(<8 x i16> %x) {
752 ; CHECK-LABEL: uhadd_v8i16:
753 ; CHECK:       // %bb.0:
754 ; CHECK-NEXT:    ret
755   %r = tail call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> %x, <8 x i16> %x)
756   ret <8 x i16> %r
759 define <4 x i32> @uhadd_v4i32(<4 x i32> %x) {
760 ; CHECK-LABEL: uhadd_v4i32:
761 ; CHECK:       // %bb.0:
762 ; CHECK-NEXT:    ret
763   %r = tail call <4 x i32> @llvm.aarch64.neon.uhadd.v4i32(<4 x i32> %x, <4 x i32> %x)
764   ret <4 x i32> %r
766 define <8 x i8> @srhadd_v8i8(<8 x i8> %x) {
767 ; CHECK-LABEL: srhadd_v8i8:
768 ; CHECK:       // %bb.0:
769 ; CHECK-NEXT:    ret
770   %r = tail call <8 x i8> @llvm.aarch64.neon.srhadd.v8i8(<8 x i8> %x, <8 x i8> %x)
771   ret <8 x i8> %r
774 define <4 x i16> @srhadd_v4i16(<4 x i16> %x) {
775 ; CHECK-LABEL: srhadd_v4i16:
776 ; CHECK:       // %bb.0:
777 ; CHECK-NEXT:    ret
778   %r = tail call <4 x i16> @llvm.aarch64.neon.srhadd.v4i16(<4 x i16> %x, <4 x i16> %x)
779   ret <4 x i16> %r
782 define <2 x i32> @srhadd_v2i32(<2 x i32> %x) {
783 ; CHECK-LABEL: srhadd_v2i32:
784 ; CHECK:       // %bb.0:
785 ; CHECK-NEXT:    ret
786   %r = tail call <2 x i32> @llvm.aarch64.neon.srhadd.v2i32(<2 x i32> %x, <2 x i32> %x)
787   ret <2 x i32> %r
790 define <16 x i8> @srhadd_v16i8(<16 x i8> %x) {
791 ; CHECK-LABEL: srhadd_v16i8:
792 ; CHECK:       // %bb.0:
793 ; CHECK-NEXT:    ret
794   %r = tail call <16 x i8> @llvm.aarch64.neon.srhadd.v16i8(<16 x i8> %x, <16 x i8> %x)
795   ret <16 x i8> %r
798 define <8 x i16> @srhadd_v8i16(<8 x i16> %x) {
799 ; CHECK-LABEL: srhadd_v8i16:
800 ; CHECK:       // %bb.0:
801 ; CHECK-NEXT:    ret
802   %r = tail call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %x, <8 x i16> %x)
803   ret <8 x i16> %r
806 define <4 x i32> @srhadd_v4i32(<4 x i32> %x) {
807 ; CHECK-LABEL: srhadd_v4i32:
808 ; CHECK:       // %bb.0:
809 ; CHECK-NEXT:    ret
810   %r = tail call <4 x i32> @llvm.aarch64.neon.srhadd.v4i32(<4 x i32> %x, <4 x i32> %x)
811   ret <4 x i32> %r
814 define <8 x i8> @urhadd_v8i8(<8 x i8> %x) {
815 ; CHECK-LABEL: urhadd_v8i8:
816 ; CHECK:       // %bb.0:
817 ; CHECK-NEXT:    ret
818   %r = tail call <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8> %x, <8 x i8> %x)
819   ret <8 x i8> %r
822 define <4 x i16> @urhadd_v4i16(<4 x i16> %x) {
823 ; CHECK-LABEL: urhadd_v4i16:
824 ; CHECK:       // %bb.0:
825 ; CHECK-NEXT:    ret
826   %r = tail call <4 x i16> @llvm.aarch64.neon.urhadd.v4i16(<4 x i16> %x, <4 x i16> %x)
827   ret <4 x i16> %r
830 define <2 x i32> @urhadd_v2i32(<2 x i32> %x) {
831 ; CHECK-LABEL: urhadd_v2i32:
832 ; CHECK:       // %bb.0:
833 ; CHECK-NEXT:    ret
834   %r = tail call <2 x i32> @llvm.aarch64.neon.urhadd.v2i32(<2 x i32> %x, <2 x i32> %x)
835   ret <2 x i32> %r
838 define <16 x i8> @urhadd_v16i8(<16 x i8> %x) {
839 ; CHECK-LABEL: urhadd_v16i8:
840 ; CHECK:       // %bb.0:
841 ; CHECK-NEXT:    ret
842   %r = tail call <16 x i8> @llvm.aarch64.neon.urhadd.v16i8(<16 x i8> %x, <16 x i8> %x)
843   ret <16 x i8> %r
846 define <8 x i16> @urhadd_v8i16(<8 x i16> %x) {
847 ; CHECK-LABEL: urhadd_v8i16:
848 ; CHECK:       // %bb.0:
849 ; CHECK-NEXT:    ret
850   %r = tail call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> %x, <8 x i16> %x)
851   ret <8 x i16> %r
854 define <4 x i32> @urhadd_v4i32(<4 x i32> %x) {
855 ; CHECK-LABEL: urhadd_v4i32:
856 ; CHECK:       // %bb.0:
857 ; CHECK-NEXT:    ret
858   %r = tail call <4 x i32> @llvm.aarch64.neon.urhadd.v4i32(<4 x i32> %x, <4 x i32> %x)
859   ret <4 x i32> %r
862 declare <8 x i8> @llvm.aarch64.neon.shadd.v8i8(<8 x i8>, <8 x i8>)
863 declare <4 x i16> @llvm.aarch64.neon.shadd.v4i16(<4 x i16>, <4 x i16>)
864 declare <2 x i32> @llvm.aarch64.neon.shadd.v2i32(<2 x i32>, <2 x i32>)
865 declare <8 x i8> @llvm.aarch64.neon.uhadd.v8i8(<8 x i8>, <8 x i8>)
866 declare <4 x i16> @llvm.aarch64.neon.uhadd.v4i16(<4 x i16>, <4 x i16>)
867 declare <2 x i32> @llvm.aarch64.neon.uhadd.v2i32(<2 x i32>, <2 x i32>)
868 declare <16 x i8> @llvm.aarch64.neon.shadd.v16i8(<16 x i8>, <16 x i8>)
869 declare <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16>, <8 x i16>)
870 declare <4 x i32> @llvm.aarch64.neon.shadd.v4i32(<4 x i32>, <4 x i32>)
871 declare <16 x i8> @llvm.aarch64.neon.uhadd.v16i8(<16 x i8>, <16 x i8>)
872 declare <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16>, <8 x i16>)
873 declare <4 x i32> @llvm.aarch64.neon.uhadd.v4i32(<4 x i32>, <4 x i32>)
875 declare <8 x i8> @llvm.aarch64.neon.srhadd.v8i8(<8 x i8>, <8 x i8>)
876 declare <4 x i16> @llvm.aarch64.neon.srhadd.v4i16(<4 x i16>, <4 x i16>)
877 declare <2 x i32> @llvm.aarch64.neon.srhadd.v2i32(<2 x i32>, <2 x i32>)
878 declare <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8>, <8 x i8>)
879 declare <4 x i16> @llvm.aarch64.neon.urhadd.v4i16(<4 x i16>, <4 x i16>)
880 declare <2 x i32> @llvm.aarch64.neon.urhadd.v2i32(<2 x i32>, <2 x i32>)
881 declare <16 x i8> @llvm.aarch64.neon.srhadd.v16i8(<16 x i8>, <16 x i8>)
882 declare <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16>, <8 x i16>)
883 declare <4 x i32> @llvm.aarch64.neon.srhadd.v4i32(<4 x i32>, <4 x i32>)
884 declare <16 x i8> @llvm.aarch64.neon.urhadd.v16i8(<16 x i8>, <16 x i8>)
885 declare <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16>, <8 x i16>)
886 declare <4 x i32> @llvm.aarch64.neon.urhadd.v4i32(<4 x i32>, <4 x i32>)