[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / vecreduce-bitext.ll
blobcc65f17b718649f7ca05adb62636a1b8c6f1363c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s
4 define zeroext i16 @and_sext_v8i8_i16(<8 x i8> %x) {
5 ; CHECK-LABEL: and_sext_v8i8_i16:
6 ; CHECK:       // %bb.0: // %entry
7 ; CHECK-NEXT:    fmov x8, d0
8 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
9 ; CHECK-NEXT:    lsr x9, x8, #16
10 ; CHECK-NEXT:    and w8, w8, w9
11 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
12 ; CHECK-NEXT:    sxtb w8, w8
13 ; CHECK-NEXT:    and w0, w8, #0xffff
14 ; CHECK-NEXT:    ret
15 entry:
16   %y = sext <8 x i8> %x to <8 x i16>
17   %z = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %y)
18   ret i16 %z
21 define zeroext i16 @and_zext_v8i8_i16(<8 x i8> %x) {
22 ; CHECK-LABEL: and_zext_v8i8_i16:
23 ; CHECK:       // %bb.0: // %entry
24 ; CHECK-NEXT:    fmov x8, d0
25 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
26 ; CHECK-NEXT:    lsr x9, x8, #16
27 ; CHECK-NEXT:    and w8, w8, w9
28 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
29 ; CHECK-NEXT:    and w0, w8, #0xff
30 ; CHECK-NEXT:    ret
31 entry:
32   %y = zext <8 x i8> %x to <8 x i16>
33   %z = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %y)
34   ret i16 %z
37 define zeroext i16 @and_sext_v16i8_i16(<16 x i8> %x) {
38 ; CHECK-LABEL: and_sext_v16i8_i16:
39 ; CHECK:       // %bb.0: // %entry
40 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
41 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
42 ; CHECK-NEXT:    fmov x8, d0
43 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
44 ; CHECK-NEXT:    lsr x9, x8, #16
45 ; CHECK-NEXT:    and w8, w8, w9
46 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
47 ; CHECK-NEXT:    sxtb w8, w8
48 ; CHECK-NEXT:    and w0, w8, #0xffff
49 ; CHECK-NEXT:    ret
50 entry:
51   %y = sext <16 x i8> %x to <16 x i16>
52   %z = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %y)
53   ret i16 %z
56 define zeroext i16 @and_zext_v16i8_i16(<16 x i8> %x) {
57 ; CHECK-LABEL: and_zext_v16i8_i16:
58 ; CHECK:       // %bb.0: // %entry
59 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
60 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
61 ; CHECK-NEXT:    fmov x8, d0
62 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
63 ; CHECK-NEXT:    lsr x9, x8, #16
64 ; CHECK-NEXT:    and w8, w8, w9
65 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
66 ; CHECK-NEXT:    and w0, w8, #0xff
67 ; CHECK-NEXT:    ret
68 entry:
69   %y = zext <16 x i8> %x to <16 x i16>
70   %z = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %y)
71   ret i16 %z
74 define i32 @and_sext_v8i8_i32(<8 x i8> %x) {
75 ; CHECK-LABEL: and_sext_v8i8_i32:
76 ; CHECK:       // %bb.0: // %entry
77 ; CHECK-NEXT:    fmov x8, d0
78 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
79 ; CHECK-NEXT:    lsr x9, x8, #16
80 ; CHECK-NEXT:    and w8, w8, w9
81 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
82 ; CHECK-NEXT:    sxtb w0, w8
83 ; CHECK-NEXT:    ret
84 entry:
85   %y = sext <8 x i8> %x to <8 x i32>
86   %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
87   ret i32 %z
90 define i32 @and_zext_v8i8_i32(<8 x i8> %x) {
91 ; CHECK-LABEL: and_zext_v8i8_i32:
92 ; CHECK:       // %bb.0: // %entry
93 ; CHECK-NEXT:    fmov x8, d0
94 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
95 ; CHECK-NEXT:    lsr x9, x8, #16
96 ; CHECK-NEXT:    and w8, w8, w9
97 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
98 ; CHECK-NEXT:    and w0, w8, #0xff
99 ; CHECK-NEXT:    ret
100 entry:
101   %y = zext <8 x i8> %x to <8 x i32>
102   %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
103   ret i32 %z
106 define i32 @and_sext_v16i8_i32(<16 x i8> %x) {
107 ; CHECK-LABEL: and_sext_v16i8_i32:
108 ; CHECK:       // %bb.0: // %entry
109 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
110 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
111 ; CHECK-NEXT:    fmov x8, d0
112 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
113 ; CHECK-NEXT:    lsr x9, x8, #16
114 ; CHECK-NEXT:    and w8, w8, w9
115 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
116 ; CHECK-NEXT:    sxtb w0, w8
117 ; CHECK-NEXT:    ret
118 entry:
119   %y = sext <16 x i8> %x to <16 x i32>
120   %z = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %y)
121   ret i32 %z
124 define i32 @and_zext_v16i8_i32(<16 x i8> %x) {
125 ; CHECK-LABEL: and_zext_v16i8_i32:
126 ; CHECK:       // %bb.0: // %entry
127 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
128 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
129 ; CHECK-NEXT:    fmov x8, d0
130 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
131 ; CHECK-NEXT:    lsr x9, x8, #16
132 ; CHECK-NEXT:    and w8, w8, w9
133 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
134 ; CHECK-NEXT:    and w0, w8, #0xff
135 ; CHECK-NEXT:    ret
136 entry:
137   %y = zext <16 x i8> %x to <16 x i32>
138   %z = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %y)
139   ret i32 %z
142 define i64 @and_sext_v8i8_i64(<8 x i8> %x) {
143 ; CHECK-LABEL: and_sext_v8i8_i64:
144 ; CHECK:       // %bb.0: // %entry
145 ; CHECK-NEXT:    fmov x8, d0
146 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
147 ; CHECK-NEXT:    lsr x9, x8, #16
148 ; CHECK-NEXT:    and w8, w8, w9
149 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
150 ; CHECK-NEXT:    sxtb x0, w8
151 ; CHECK-NEXT:    ret
152 entry:
153   %y = sext <8 x i8> %x to <8 x i64>
154   %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
155   ret i64 %z
158 define i64 @and_zext_v8i8_i64(<8 x i8> %x) {
159 ; CHECK-LABEL: and_zext_v8i8_i64:
160 ; CHECK:       // %bb.0: // %entry
161 ; CHECK-NEXT:    fmov x8, d0
162 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
163 ; CHECK-NEXT:    lsr x9, x8, #16
164 ; CHECK-NEXT:    and w8, w8, w9
165 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
166 ; CHECK-NEXT:    and x0, x8, #0xff
167 ; CHECK-NEXT:    ret
168 entry:
169   %y = zext <8 x i8> %x to <8 x i64>
170   %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
171   ret i64 %z
174 define i64 @and_sext_v16i8_i64(<16 x i8> %x) {
175 ; CHECK-LABEL: and_sext_v16i8_i64:
176 ; CHECK:       // %bb.0: // %entry
177 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
178 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
179 ; CHECK-NEXT:    fmov x8, d0
180 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
181 ; CHECK-NEXT:    lsr x9, x8, #16
182 ; CHECK-NEXT:    and w8, w8, w9
183 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
184 ; CHECK-NEXT:    sxtb x0, w8
185 ; CHECK-NEXT:    ret
186 entry:
187   %y = sext <16 x i8> %x to <16 x i64>
188   %z = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %y)
189   ret i64 %z
192 define i64 @and_zext_v16i8_i64(<16 x i8> %x) {
193 ; CHECK-LABEL: and_zext_v16i8_i64:
194 ; CHECK:       // %bb.0: // %entry
195 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
196 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
197 ; CHECK-NEXT:    fmov x8, d0
198 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
199 ; CHECK-NEXT:    lsr x9, x8, #16
200 ; CHECK-NEXT:    and w8, w8, w9
201 ; CHECK-NEXT:    and w8, w8, w8, lsr #8
202 ; CHECK-NEXT:    and x0, x8, #0xff
203 ; CHECK-NEXT:    ret
204 entry:
205   %y = zext <16 x i8> %x to <16 x i64>
206   %z = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %y)
207   ret i64 %z
210 define i32 @and_sext_v4i16_i32(<4 x i16> %x) {
211 ; CHECK-LABEL: and_sext_v4i16_i32:
212 ; CHECK:       // %bb.0: // %entry
213 ; CHECK-NEXT:    fmov x8, d0
214 ; CHECK-NEXT:    lsr x9, x8, #32
215 ; CHECK-NEXT:    and w8, w8, w9
216 ; CHECK-NEXT:    and w8, w8, w8, lsr #16
217 ; CHECK-NEXT:    sxth w0, w8
218 ; CHECK-NEXT:    ret
219 entry:
220   %y = sext <4 x i16> %x to <4 x i32>
221   %z = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %y)
222   ret i32 %z
225 define i32 @and_zext_v4i16_i32(<4 x i16> %x) {
226 ; CHECK-LABEL: and_zext_v4i16_i32:
227 ; CHECK:       // %bb.0: // %entry
228 ; CHECK-NEXT:    fmov x8, d0
229 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
230 ; CHECK-NEXT:    lsr x9, x8, #16
231 ; CHECK-NEXT:    and w0, w8, w9
232 ; CHECK-NEXT:    ret
233 entry:
234   %y = zext <4 x i16> %x to <4 x i32>
235   %z = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %y)
236   ret i32 %z
239 define i32 @and_sext_v8i16_i32(<8 x i16> %x) {
240 ; CHECK-LABEL: and_sext_v8i16_i32:
241 ; CHECK:       // %bb.0: // %entry
242 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
243 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
244 ; CHECK-NEXT:    fmov x8, d0
245 ; CHECK-NEXT:    lsr x9, x8, #32
246 ; CHECK-NEXT:    and w8, w8, w9
247 ; CHECK-NEXT:    and w8, w8, w8, lsr #16
248 ; CHECK-NEXT:    sxth w0, w8
249 ; CHECK-NEXT:    ret
250 entry:
251   %y = sext <8 x i16> %x to <8 x i32>
252   %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
253   ret i32 %z
256 define i32 @and_zext_v8i16_i32(<8 x i16> %x) {
257 ; CHECK-LABEL: and_zext_v8i16_i32:
258 ; CHECK:       // %bb.0: // %entry
259 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
260 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
261 ; CHECK-NEXT:    fmov x8, d0
262 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
263 ; CHECK-NEXT:    lsr x9, x8, #16
264 ; CHECK-NEXT:    and w0, w8, w9
265 ; CHECK-NEXT:    ret
266 entry:
267   %y = zext <8 x i16> %x to <8 x i32>
268   %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
269   ret i32 %z
272 define i64 @and_sext_v4i16_i64(<4 x i16> %x) {
273 ; CHECK-LABEL: and_sext_v4i16_i64:
274 ; CHECK:       // %bb.0: // %entry
275 ; CHECK-NEXT:    fmov x8, d0
276 ; CHECK-NEXT:    lsr x9, x8, #32
277 ; CHECK-NEXT:    and w8, w8, w9
278 ; CHECK-NEXT:    and w8, w8, w8, lsr #16
279 ; CHECK-NEXT:    sxth x0, w8
280 ; CHECK-NEXT:    ret
281 entry:
282   %y = sext <4 x i16> %x to <4 x i64>
283   %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
284   ret i64 %z
287 define i64 @and_zext_v4i16_i64(<4 x i16> %x) {
288 ; CHECK-LABEL: and_zext_v4i16_i64:
289 ; CHECK:       // %bb.0: // %entry
290 ; CHECK-NEXT:    fmov x8, d0
291 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
292 ; CHECK-NEXT:    lsr x9, x8, #16
293 ; CHECK-NEXT:    and w0, w8, w9
294 ; CHECK-NEXT:    ret
295 entry:
296   %y = zext <4 x i16> %x to <4 x i64>
297   %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
298   ret i64 %z
301 define i64 @and_sext_v8i16_i64(<8 x i16> %x) {
302 ; CHECK-LABEL: and_sext_v8i16_i64:
303 ; CHECK:       // %bb.0: // %entry
304 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
305 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
306 ; CHECK-NEXT:    fmov x8, d0
307 ; CHECK-NEXT:    lsr x9, x8, #32
308 ; CHECK-NEXT:    and w8, w8, w9
309 ; CHECK-NEXT:    and w8, w8, w8, lsr #16
310 ; CHECK-NEXT:    sxth x0, w8
311 ; CHECK-NEXT:    ret
312 entry:
313   %y = sext <8 x i16> %x to <8 x i64>
314   %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
315   ret i64 %z
318 define i64 @and_zext_v8i16_i64(<8 x i16> %x) {
319 ; CHECK-LABEL: and_zext_v8i16_i64:
320 ; CHECK:       // %bb.0: // %entry
321 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
322 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
323 ; CHECK-NEXT:    fmov x8, d0
324 ; CHECK-NEXT:    and x8, x8, x8, lsr #32
325 ; CHECK-NEXT:    lsr x9, x8, #16
326 ; CHECK-NEXT:    and w0, w8, w9
327 ; CHECK-NEXT:    ret
328 entry:
329   %y = zext <8 x i16> %x to <8 x i64>
330   %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
331   ret i64 %z
334 define i64 @and_sext_v2i32_i64(<2 x i32> %x) {
335 ; CHECK-LABEL: and_sext_v2i32_i64:
336 ; CHECK:       // %bb.0: // %entry
337 ; CHECK-NEXT:    fmov x8, d0
338 ; CHECK-NEXT:    lsr x9, x8, #32
339 ; CHECK-NEXT:    and w8, w8, w9
340 ; CHECK-NEXT:    sxtw x0, w8
341 ; CHECK-NEXT:    ret
342 entry:
343   %y = sext <2 x i32> %x to <2 x i64>
344   %z = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %y)
345   ret i64 %z
348 define i64 @and_zext_v2i32_i64(<2 x i32> %x) {
349 ; CHECK-LABEL: and_zext_v2i32_i64:
350 ; CHECK:       // %bb.0: // %entry
351 ; CHECK-NEXT:    fmov x8, d0
352 ; CHECK-NEXT:    lsr x9, x8, #32
353 ; CHECK-NEXT:    and w0, w8, w9
354 ; CHECK-NEXT:    ret
355 entry:
356   %y = zext <2 x i32> %x to <2 x i64>
357   %z = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %y)
358   ret i64 %z
361 define i64 @and_sext_v4i32_i64(<4 x i32> %x) {
362 ; CHECK-LABEL: and_sext_v4i32_i64:
363 ; CHECK:       // %bb.0: // %entry
364 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
365 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
366 ; CHECK-NEXT:    fmov x8, d0
367 ; CHECK-NEXT:    lsr x9, x8, #32
368 ; CHECK-NEXT:    and w8, w8, w9
369 ; CHECK-NEXT:    sxtw x0, w8
370 ; CHECK-NEXT:    ret
371 entry:
372   %y = sext <4 x i32> %x to <4 x i64>
373   %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
374   ret i64 %z
377 define i64 @and_zext_v4i32_i64(<4 x i32> %x) {
378 ; CHECK-LABEL: and_zext_v4i32_i64:
379 ; CHECK:       // %bb.0: // %entry
380 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
381 ; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
382 ; CHECK-NEXT:    fmov x8, d0
383 ; CHECK-NEXT:    lsr x9, x8, #32
384 ; CHECK-NEXT:    and w0, w8, w9
385 ; CHECK-NEXT:    ret
386 entry:
387   %y = zext <4 x i32> %x to <4 x i64>
388   %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
389   ret i64 %z
392 define zeroext i16 @or_sext_v8i8_i16(<8 x i8> %x) {
393 ; CHECK-LABEL: or_sext_v8i8_i16:
394 ; CHECK:       // %bb.0: // %entry
395 ; CHECK-NEXT:    fmov x8, d0
396 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
397 ; CHECK-NEXT:    lsr x9, x8, #16
398 ; CHECK-NEXT:    orr w8, w8, w9
399 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
400 ; CHECK-NEXT:    sxtb w8, w8
401 ; CHECK-NEXT:    and w0, w8, #0xffff
402 ; CHECK-NEXT:    ret
403 entry:
404   %y = sext <8 x i8> %x to <8 x i16>
405   %z = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %y)
406   ret i16 %z
409 define zeroext i16 @or_zext_v8i8_i16(<8 x i8> %x) {
410 ; CHECK-LABEL: or_zext_v8i8_i16:
411 ; CHECK:       // %bb.0: // %entry
412 ; CHECK-NEXT:    fmov x8, d0
413 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
414 ; CHECK-NEXT:    lsr x9, x8, #16
415 ; CHECK-NEXT:    orr w8, w8, w9
416 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
417 ; CHECK-NEXT:    and w0, w8, #0xff
418 ; CHECK-NEXT:    ret
419 entry:
420   %y = zext <8 x i8> %x to <8 x i16>
421   %z = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %y)
422   ret i16 %z
425 define zeroext i16 @or_sext_v16i8_i16(<16 x i8> %x) {
426 ; CHECK-LABEL: or_sext_v16i8_i16:
427 ; CHECK:       // %bb.0: // %entry
428 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
429 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
430 ; CHECK-NEXT:    fmov x8, d0
431 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
432 ; CHECK-NEXT:    lsr x9, x8, #16
433 ; CHECK-NEXT:    orr w8, w8, w9
434 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
435 ; CHECK-NEXT:    sxtb w8, w8
436 ; CHECK-NEXT:    and w0, w8, #0xffff
437 ; CHECK-NEXT:    ret
438 entry:
439   %y = sext <16 x i8> %x to <16 x i16>
440   %z = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %y)
441   ret i16 %z
444 define zeroext i16 @or_zext_v16i8_i16(<16 x i8> %x) {
445 ; CHECK-LABEL: or_zext_v16i8_i16:
446 ; CHECK:       // %bb.0: // %entry
447 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
448 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
449 ; CHECK-NEXT:    fmov x8, d0
450 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
451 ; CHECK-NEXT:    lsr x9, x8, #16
452 ; CHECK-NEXT:    orr w8, w8, w9
453 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
454 ; CHECK-NEXT:    and w0, w8, #0xff
455 ; CHECK-NEXT:    ret
456 entry:
457   %y = zext <16 x i8> %x to <16 x i16>
458   %z = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %y)
459   ret i16 %z
462 define i32 @or_sext_v8i8_i32(<8 x i8> %x) {
463 ; CHECK-LABEL: or_sext_v8i8_i32:
464 ; CHECK:       // %bb.0: // %entry
465 ; CHECK-NEXT:    fmov x8, d0
466 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
467 ; CHECK-NEXT:    lsr x9, x8, #16
468 ; CHECK-NEXT:    orr w8, w8, w9
469 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
470 ; CHECK-NEXT:    sxtb w0, w8
471 ; CHECK-NEXT:    ret
472 entry:
473   %y = sext <8 x i8> %x to <8 x i32>
474   %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
475   ret i32 %z
478 define i32 @or_zext_v8i8_i32(<8 x i8> %x) {
479 ; CHECK-LABEL: or_zext_v8i8_i32:
480 ; CHECK:       // %bb.0: // %entry
481 ; CHECK-NEXT:    fmov x8, d0
482 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
483 ; CHECK-NEXT:    lsr x9, x8, #16
484 ; CHECK-NEXT:    orr w8, w8, w9
485 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
486 ; CHECK-NEXT:    and w0, w8, #0xff
487 ; CHECK-NEXT:    ret
488 entry:
489   %y = zext <8 x i8> %x to <8 x i32>
490   %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
491   ret i32 %z
494 define i32 @or_sext_v16i8_i32(<16 x i8> %x) {
495 ; CHECK-LABEL: or_sext_v16i8_i32:
496 ; CHECK:       // %bb.0: // %entry
497 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
498 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
499 ; CHECK-NEXT:    fmov x8, d0
500 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
501 ; CHECK-NEXT:    lsr x9, x8, #16
502 ; CHECK-NEXT:    orr w8, w8, w9
503 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
504 ; CHECK-NEXT:    sxtb w0, w8
505 ; CHECK-NEXT:    ret
506 entry:
507   %y = sext <16 x i8> %x to <16 x i32>
508   %z = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %y)
509   ret i32 %z
512 define i32 @or_zext_v16i8_i32(<16 x i8> %x) {
513 ; CHECK-LABEL: or_zext_v16i8_i32:
514 ; CHECK:       // %bb.0: // %entry
515 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
516 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
517 ; CHECK-NEXT:    fmov x8, d0
518 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
519 ; CHECK-NEXT:    lsr x9, x8, #16
520 ; CHECK-NEXT:    orr w8, w8, w9
521 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
522 ; CHECK-NEXT:    and w0, w8, #0xff
523 ; CHECK-NEXT:    ret
524 entry:
525   %y = zext <16 x i8> %x to <16 x i32>
526   %z = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %y)
527   ret i32 %z
530 define i64 @or_sext_v8i8_i64(<8 x i8> %x) {
531 ; CHECK-LABEL: or_sext_v8i8_i64:
532 ; CHECK:       // %bb.0: // %entry
533 ; CHECK-NEXT:    fmov x8, d0
534 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
535 ; CHECK-NEXT:    lsr x9, x8, #16
536 ; CHECK-NEXT:    orr w8, w8, w9
537 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
538 ; CHECK-NEXT:    sxtb x0, w8
539 ; CHECK-NEXT:    ret
540 entry:
541   %y = sext <8 x i8> %x to <8 x i64>
542   %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
543   ret i64 %z
546 define i64 @or_zext_v8i8_i64(<8 x i8> %x) {
547 ; CHECK-LABEL: or_zext_v8i8_i64:
548 ; CHECK:       // %bb.0: // %entry
549 ; CHECK-NEXT:    fmov x8, d0
550 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
551 ; CHECK-NEXT:    lsr x9, x8, #16
552 ; CHECK-NEXT:    orr w8, w8, w9
553 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
554 ; CHECK-NEXT:    and x0, x8, #0xff
555 ; CHECK-NEXT:    ret
556 entry:
557   %y = zext <8 x i8> %x to <8 x i64>
558   %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
559   ret i64 %z
562 define i64 @or_sext_v16i8_i64(<16 x i8> %x) {
563 ; CHECK-LABEL: or_sext_v16i8_i64:
564 ; CHECK:       // %bb.0: // %entry
565 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
566 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
567 ; CHECK-NEXT:    fmov x8, d0
568 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
569 ; CHECK-NEXT:    lsr x9, x8, #16
570 ; CHECK-NEXT:    orr w8, w8, w9
571 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
572 ; CHECK-NEXT:    sxtb x0, w8
573 ; CHECK-NEXT:    ret
574 entry:
575   %y = sext <16 x i8> %x to <16 x i64>
576   %z = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %y)
577   ret i64 %z
580 define i64 @or_zext_v16i8_i64(<16 x i8> %x) {
581 ; CHECK-LABEL: or_zext_v16i8_i64:
582 ; CHECK:       // %bb.0: // %entry
583 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
584 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
585 ; CHECK-NEXT:    fmov x8, d0
586 ; CHECK-NEXT:    orr x8, x8, x8, lsr #32
587 ; CHECK-NEXT:    lsr x9, x8, #16
588 ; CHECK-NEXT:    orr w8, w8, w9
589 ; CHECK-NEXT:    orr w8, w8, w8, lsr #8
590 ; CHECK-NEXT:    and x0, x8, #0xff
591 ; CHECK-NEXT:    ret
592 entry:
593   %y = zext <16 x i8> %x to <16 x i64>
594   %z = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %y)
595   ret i64 %z
598 define i32 @or_sext_v4i16_i32(<4 x i16> %x) {
599 ; CHECK-LABEL: or_sext_v4i16_i32:
600 ; CHECK:       // %bb.0: // %entry
601 ; CHECK-NEXT:    fmov x8, d0
602 ; CHECK-NEXT:    lsr x9, x8, #32
603 ; CHECK-NEXT:    orr w8, w8, w9
604 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
605 ; CHECK-NEXT:    sxth w0, w8
606 ; CHECK-NEXT:    ret
607 entry:
608   %y = sext <4 x i16> %x to <4 x i32>
609   %z = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %y)
610   ret i32 %z
613 define i32 @or_zext_v4i16_i32(<4 x i16> %x) {
614 ; CHECK-LABEL: or_zext_v4i16_i32:
615 ; CHECK:       // %bb.0: // %entry
616 ; CHECK-NEXT:    fmov x8, d0
617 ; CHECK-NEXT:    lsr x9, x8, #32
618 ; CHECK-NEXT:    orr w8, w8, w9
619 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
620 ; CHECK-NEXT:    and w0, w8, #0xffff
621 ; CHECK-NEXT:    ret
622 entry:
623   %y = zext <4 x i16> %x to <4 x i32>
624   %z = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %y)
625   ret i32 %z
628 define i32 @or_sext_v8i16_i32(<8 x i16> %x) {
629 ; CHECK-LABEL: or_sext_v8i16_i32:
630 ; CHECK:       // %bb.0: // %entry
631 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
632 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
633 ; CHECK-NEXT:    fmov x8, d0
634 ; CHECK-NEXT:    lsr x9, x8, #32
635 ; CHECK-NEXT:    orr w8, w8, w9
636 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
637 ; CHECK-NEXT:    sxth w0, w8
638 ; CHECK-NEXT:    ret
639 entry:
640   %y = sext <8 x i16> %x to <8 x i32>
641   %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
642   ret i32 %z
645 define i32 @or_zext_v8i16_i32(<8 x i16> %x) {
646 ; CHECK-LABEL: or_zext_v8i16_i32:
647 ; CHECK:       // %bb.0: // %entry
648 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
649 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
650 ; CHECK-NEXT:    fmov x8, d0
651 ; CHECK-NEXT:    lsr x9, x8, #32
652 ; CHECK-NEXT:    orr w8, w8, w9
653 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
654 ; CHECK-NEXT:    and w0, w8, #0xffff
655 ; CHECK-NEXT:    ret
656 entry:
657   %y = zext <8 x i16> %x to <8 x i32>
658   %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
659   ret i32 %z
662 define i64 @or_sext_v4i16_i64(<4 x i16> %x) {
663 ; CHECK-LABEL: or_sext_v4i16_i64:
664 ; CHECK:       // %bb.0: // %entry
665 ; CHECK-NEXT:    fmov x8, d0
666 ; CHECK-NEXT:    lsr x9, x8, #32
667 ; CHECK-NEXT:    orr w8, w8, w9
668 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
669 ; CHECK-NEXT:    sxth x0, w8
670 ; CHECK-NEXT:    ret
671 entry:
672   %y = sext <4 x i16> %x to <4 x i64>
673   %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
674   ret i64 %z
677 define i64 @or_zext_v4i16_i64(<4 x i16> %x) {
678 ; CHECK-LABEL: or_zext_v4i16_i64:
679 ; CHECK:       // %bb.0: // %entry
680 ; CHECK-NEXT:    fmov x8, d0
681 ; CHECK-NEXT:    lsr x9, x8, #32
682 ; CHECK-NEXT:    orr w8, w8, w9
683 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
684 ; CHECK-NEXT:    and x0, x8, #0xffff
685 ; CHECK-NEXT:    ret
686 entry:
687   %y = zext <4 x i16> %x to <4 x i64>
688   %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
689   ret i64 %z
692 define i64 @or_sext_v8i16_i64(<8 x i16> %x) {
693 ; CHECK-LABEL: or_sext_v8i16_i64:
694 ; CHECK:       // %bb.0: // %entry
695 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
696 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
697 ; CHECK-NEXT:    fmov x8, d0
698 ; CHECK-NEXT:    lsr x9, x8, #32
699 ; CHECK-NEXT:    orr w8, w8, w9
700 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
701 ; CHECK-NEXT:    sxth x0, w8
702 ; CHECK-NEXT:    ret
703 entry:
704   %y = sext <8 x i16> %x to <8 x i64>
705   %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
706   ret i64 %z
709 define i64 @or_zext_v8i16_i64(<8 x i16> %x) {
710 ; CHECK-LABEL: or_zext_v8i16_i64:
711 ; CHECK:       // %bb.0: // %entry
712 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
713 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
714 ; CHECK-NEXT:    fmov x8, d0
715 ; CHECK-NEXT:    lsr x9, x8, #32
716 ; CHECK-NEXT:    orr w8, w8, w9
717 ; CHECK-NEXT:    orr w8, w8, w8, lsr #16
718 ; CHECK-NEXT:    and x0, x8, #0xffff
719 ; CHECK-NEXT:    ret
720 entry:
721   %y = zext <8 x i16> %x to <8 x i64>
722   %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
723   ret i64 %z
726 define i64 @or_sext_v2i32_i64(<2 x i32> %x) {
727 ; CHECK-LABEL: or_sext_v2i32_i64:
728 ; CHECK:       // %bb.0: // %entry
729 ; CHECK-NEXT:    fmov x8, d0
730 ; CHECK-NEXT:    lsr x9, x8, #32
731 ; CHECK-NEXT:    orr w8, w8, w9
732 ; CHECK-NEXT:    sxtw x0, w8
733 ; CHECK-NEXT:    ret
734 entry:
735   %y = sext <2 x i32> %x to <2 x i64>
736   %z = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %y)
737   ret i64 %z
740 define i64 @or_zext_v2i32_i64(<2 x i32> %x) {
741 ; CHECK-LABEL: or_zext_v2i32_i64:
742 ; CHECK:       // %bb.0: // %entry
743 ; CHECK-NEXT:    fmov x8, d0
744 ; CHECK-NEXT:    lsr x9, x8, #32
745 ; CHECK-NEXT:    orr w0, w8, w9
746 ; CHECK-NEXT:    ret
747 entry:
748   %y = zext <2 x i32> %x to <2 x i64>
749   %z = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %y)
750   ret i64 %z
753 define i64 @or_sext_v4i32_i64(<4 x i32> %x) {
754 ; CHECK-LABEL: or_sext_v4i32_i64:
755 ; CHECK:       // %bb.0: // %entry
756 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
757 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
758 ; CHECK-NEXT:    fmov x8, d0
759 ; CHECK-NEXT:    lsr x9, x8, #32
760 ; CHECK-NEXT:    orr w8, w8, w9
761 ; CHECK-NEXT:    sxtw x0, w8
762 ; CHECK-NEXT:    ret
763 entry:
764   %y = sext <4 x i32> %x to <4 x i64>
765   %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
766   ret i64 %z
769 define i64 @or_zext_v4i32_i64(<4 x i32> %x) {
770 ; CHECK-LABEL: or_zext_v4i32_i64:
771 ; CHECK:       // %bb.0: // %entry
772 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
773 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
774 ; CHECK-NEXT:    fmov x8, d0
775 ; CHECK-NEXT:    lsr x9, x8, #32
776 ; CHECK-NEXT:    orr w0, w8, w9
777 ; CHECK-NEXT:    ret
778 entry:
779   %y = zext <4 x i32> %x to <4 x i64>
780   %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
781   ret i64 %z
784 define zeroext i16 @xor_sext_v8i8_i16(<8 x i8> %x) {
785 ; CHECK-LABEL: xor_sext_v8i8_i16:
786 ; CHECK:       // %bb.0: // %entry
787 ; CHECK-NEXT:    fmov x8, d0
788 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
789 ; CHECK-NEXT:    lsr x9, x8, #16
790 ; CHECK-NEXT:    eor w8, w8, w9
791 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
792 ; CHECK-NEXT:    sxtb w8, w8
793 ; CHECK-NEXT:    and w0, w8, #0xffff
794 ; CHECK-NEXT:    ret
795 entry:
796   %y = sext <8 x i8> %x to <8 x i16>
797   %z = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %y)
798   ret i16 %z
801 define zeroext i16 @xor_zext_v8i8_i16(<8 x i8> %x) {
802 ; CHECK-LABEL: xor_zext_v8i8_i16:
803 ; CHECK:       // %bb.0: // %entry
804 ; CHECK-NEXT:    fmov x8, d0
805 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
806 ; CHECK-NEXT:    lsr x9, x8, #16
807 ; CHECK-NEXT:    eor w8, w8, w9
808 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
809 ; CHECK-NEXT:    and w0, w8, #0xff
810 ; CHECK-NEXT:    ret
811 entry:
812   %y = zext <8 x i8> %x to <8 x i16>
813   %z = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %y)
814   ret i16 %z
817 define zeroext i16 @xor_sext_v16i8_i16(<16 x i8> %x) {
818 ; CHECK-LABEL: xor_sext_v16i8_i16:
819 ; CHECK:       // %bb.0: // %entry
820 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
821 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
822 ; CHECK-NEXT:    fmov x8, d0
823 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
824 ; CHECK-NEXT:    lsr x9, x8, #16
825 ; CHECK-NEXT:    eor w8, w8, w9
826 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
827 ; CHECK-NEXT:    sxtb w8, w8
828 ; CHECK-NEXT:    and w0, w8, #0xffff
829 ; CHECK-NEXT:    ret
830 entry:
831   %y = sext <16 x i8> %x to <16 x i16>
832   %z = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %y)
833   ret i16 %z
836 define zeroext i16 @xor_zext_v16i8_i16(<16 x i8> %x) {
837 ; CHECK-LABEL: xor_zext_v16i8_i16:
838 ; CHECK:       // %bb.0: // %entry
839 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
840 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
841 ; CHECK-NEXT:    fmov x8, d0
842 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
843 ; CHECK-NEXT:    lsr x9, x8, #16
844 ; CHECK-NEXT:    eor w8, w8, w9
845 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
846 ; CHECK-NEXT:    and w0, w8, #0xff
847 ; CHECK-NEXT:    ret
848 entry:
849   %y = zext <16 x i8> %x to <16 x i16>
850   %z = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %y)
851   ret i16 %z
854 define i32 @xor_sext_v8i8_i32(<8 x i8> %x) {
855 ; CHECK-LABEL: xor_sext_v8i8_i32:
856 ; CHECK:       // %bb.0: // %entry
857 ; CHECK-NEXT:    fmov x8, d0
858 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
859 ; CHECK-NEXT:    lsr x9, x8, #16
860 ; CHECK-NEXT:    eor w8, w8, w9
861 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
862 ; CHECK-NEXT:    sxtb w0, w8
863 ; CHECK-NEXT:    ret
864 entry:
865   %y = sext <8 x i8> %x to <8 x i32>
866   %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
867   ret i32 %z
870 define i32 @xor_zext_v8i8_i32(<8 x i8> %x) {
871 ; CHECK-LABEL: xor_zext_v8i8_i32:
872 ; CHECK:       // %bb.0: // %entry
873 ; CHECK-NEXT:    fmov x8, d0
874 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
875 ; CHECK-NEXT:    lsr x9, x8, #16
876 ; CHECK-NEXT:    eor w8, w8, w9
877 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
878 ; CHECK-NEXT:    and w0, w8, #0xff
879 ; CHECK-NEXT:    ret
880 entry:
881   %y = zext <8 x i8> %x to <8 x i32>
882   %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
883   ret i32 %z
886 define i32 @xor_sext_v16i8_i32(<16 x i8> %x) {
887 ; CHECK-LABEL: xor_sext_v16i8_i32:
888 ; CHECK:       // %bb.0: // %entry
889 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
890 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
891 ; CHECK-NEXT:    fmov x8, d0
892 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
893 ; CHECK-NEXT:    lsr x9, x8, #16
894 ; CHECK-NEXT:    eor w8, w8, w9
895 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
896 ; CHECK-NEXT:    sxtb w0, w8
897 ; CHECK-NEXT:    ret
898 entry:
899   %y = sext <16 x i8> %x to <16 x i32>
900   %z = call i32 @llvm.vector.reduce.xor.v16i32(<16 x i32> %y)
901   ret i32 %z
904 define i32 @xor_zext_v16i8_i32(<16 x i8> %x) {
905 ; CHECK-LABEL: xor_zext_v16i8_i32:
906 ; CHECK:       // %bb.0: // %entry
907 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
908 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
909 ; CHECK-NEXT:    fmov x8, d0
910 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
911 ; CHECK-NEXT:    lsr x9, x8, #16
912 ; CHECK-NEXT:    eor w8, w8, w9
913 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
914 ; CHECK-NEXT:    and w0, w8, #0xff
915 ; CHECK-NEXT:    ret
916 entry:
917   %y = zext <16 x i8> %x to <16 x i32>
918   %z = call i32 @llvm.vector.reduce.xor.v16i32(<16 x i32> %y)
919   ret i32 %z
922 define i64 @xor_sext_v8i8_i64(<8 x i8> %x) {
923 ; CHECK-LABEL: xor_sext_v8i8_i64:
924 ; CHECK:       // %bb.0: // %entry
925 ; CHECK-NEXT:    fmov x8, d0
926 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
927 ; CHECK-NEXT:    lsr x9, x8, #16
928 ; CHECK-NEXT:    eor w8, w8, w9
929 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
930 ; CHECK-NEXT:    sxtb x0, w8
931 ; CHECK-NEXT:    ret
932 entry:
933   %y = sext <8 x i8> %x to <8 x i64>
934   %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
935   ret i64 %z
938 define i64 @xor_zext_v8i8_i64(<8 x i8> %x) {
939 ; CHECK-LABEL: xor_zext_v8i8_i64:
940 ; CHECK:       // %bb.0: // %entry
941 ; CHECK-NEXT:    fmov x8, d0
942 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
943 ; CHECK-NEXT:    lsr x9, x8, #16
944 ; CHECK-NEXT:    eor w8, w8, w9
945 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
946 ; CHECK-NEXT:    and x0, x8, #0xff
947 ; CHECK-NEXT:    ret
948 entry:
949   %y = zext <8 x i8> %x to <8 x i64>
950   %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
951   ret i64 %z
954 define i64 @xor_sext_v16i8_i64(<16 x i8> %x) {
955 ; CHECK-LABEL: xor_sext_v16i8_i64:
956 ; CHECK:       // %bb.0: // %entry
957 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
958 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
959 ; CHECK-NEXT:    fmov x8, d0
960 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
961 ; CHECK-NEXT:    lsr x9, x8, #16
962 ; CHECK-NEXT:    eor w8, w8, w9
963 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
964 ; CHECK-NEXT:    sxtb x0, w8
965 ; CHECK-NEXT:    ret
966 entry:
967   %y = sext <16 x i8> %x to <16 x i64>
968   %z = call i64 @llvm.vector.reduce.xor.v16i64(<16 x i64> %y)
969   ret i64 %z
972 define i64 @xor_zext_v16i8_i64(<16 x i8> %x) {
973 ; CHECK-LABEL: xor_zext_v16i8_i64:
974 ; CHECK:       // %bb.0: // %entry
975 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
976 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
977 ; CHECK-NEXT:    fmov x8, d0
978 ; CHECK-NEXT:    eor x8, x8, x8, lsr #32
979 ; CHECK-NEXT:    lsr x9, x8, #16
980 ; CHECK-NEXT:    eor w8, w8, w9
981 ; CHECK-NEXT:    eor w8, w8, w8, lsr #8
982 ; CHECK-NEXT:    and x0, x8, #0xff
983 ; CHECK-NEXT:    ret
984 entry:
985   %y = zext <16 x i8> %x to <16 x i64>
986   %z = call i64 @llvm.vector.reduce.xor.v16i64(<16 x i64> %y)
987   ret i64 %z
990 define i32 @xor_sext_v4i16_i32(<4 x i16> %x) {
991 ; CHECK-LABEL: xor_sext_v4i16_i32:
992 ; CHECK:       // %bb.0: // %entry
993 ; CHECK-NEXT:    fmov x8, d0
994 ; CHECK-NEXT:    lsr x9, x8, #32
995 ; CHECK-NEXT:    eor w8, w8, w9
996 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
997 ; CHECK-NEXT:    sxth w0, w8
998 ; CHECK-NEXT:    ret
999 entry:
1000   %y = sext <4 x i16> %x to <4 x i32>
1001   %z = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %y)
1002   ret i32 %z
1005 define i32 @xor_zext_v4i16_i32(<4 x i16> %x) {
1006 ; CHECK-LABEL: xor_zext_v4i16_i32:
1007 ; CHECK:       // %bb.0: // %entry
1008 ; CHECK-NEXT:    fmov x8, d0
1009 ; CHECK-NEXT:    lsr x9, x8, #32
1010 ; CHECK-NEXT:    eor w8, w8, w9
1011 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1012 ; CHECK-NEXT:    and w0, w8, #0xffff
1013 ; CHECK-NEXT:    ret
1014 entry:
1015   %y = zext <4 x i16> %x to <4 x i32>
1016   %z = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %y)
1017   ret i32 %z
1020 define i32 @xor_sext_v8i16_i32(<8 x i16> %x) {
1021 ; CHECK-LABEL: xor_sext_v8i16_i32:
1022 ; CHECK:       // %bb.0: // %entry
1023 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1024 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1025 ; CHECK-NEXT:    fmov x8, d0
1026 ; CHECK-NEXT:    lsr x9, x8, #32
1027 ; CHECK-NEXT:    eor w8, w8, w9
1028 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1029 ; CHECK-NEXT:    sxth w0, w8
1030 ; CHECK-NEXT:    ret
1031 entry:
1032   %y = sext <8 x i16> %x to <8 x i32>
1033   %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
1034   ret i32 %z
1037 define i32 @xor_zext_v8i16_i32(<8 x i16> %x) {
1038 ; CHECK-LABEL: xor_zext_v8i16_i32:
1039 ; CHECK:       // %bb.0: // %entry
1040 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1041 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1042 ; CHECK-NEXT:    fmov x8, d0
1043 ; CHECK-NEXT:    lsr x9, x8, #32
1044 ; CHECK-NEXT:    eor w8, w8, w9
1045 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1046 ; CHECK-NEXT:    and w0, w8, #0xffff
1047 ; CHECK-NEXT:    ret
1048 entry:
1049   %y = zext <8 x i16> %x to <8 x i32>
1050   %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
1051   ret i32 %z
1054 define i64 @xor_sext_v4i16_i64(<4 x i16> %x) {
1055 ; CHECK-LABEL: xor_sext_v4i16_i64:
1056 ; CHECK:       // %bb.0: // %entry
1057 ; CHECK-NEXT:    fmov x8, d0
1058 ; CHECK-NEXT:    lsr x9, x8, #32
1059 ; CHECK-NEXT:    eor w8, w8, w9
1060 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1061 ; CHECK-NEXT:    sxth x0, w8
1062 ; CHECK-NEXT:    ret
1063 entry:
1064   %y = sext <4 x i16> %x to <4 x i64>
1065   %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
1066   ret i64 %z
1069 define i64 @xor_zext_v4i16_i64(<4 x i16> %x) {
1070 ; CHECK-LABEL: xor_zext_v4i16_i64:
1071 ; CHECK:       // %bb.0: // %entry
1072 ; CHECK-NEXT:    fmov x8, d0
1073 ; CHECK-NEXT:    lsr x9, x8, #32
1074 ; CHECK-NEXT:    eor w8, w8, w9
1075 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1076 ; CHECK-NEXT:    and x0, x8, #0xffff
1077 ; CHECK-NEXT:    ret
1078 entry:
1079   %y = zext <4 x i16> %x to <4 x i64>
1080   %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
1081   ret i64 %z
1084 define i64 @xor_sext_v8i16_i64(<8 x i16> %x) {
1085 ; CHECK-LABEL: xor_sext_v8i16_i64:
1086 ; CHECK:       // %bb.0: // %entry
1087 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1088 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1089 ; CHECK-NEXT:    fmov x8, d0
1090 ; CHECK-NEXT:    lsr x9, x8, #32
1091 ; CHECK-NEXT:    eor w8, w8, w9
1092 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1093 ; CHECK-NEXT:    sxth x0, w8
1094 ; CHECK-NEXT:    ret
1095 entry:
1096   %y = sext <8 x i16> %x to <8 x i64>
1097   %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
1098   ret i64 %z
1101 define i64 @xor_zext_v8i16_i64(<8 x i16> %x) {
1102 ; CHECK-LABEL: xor_zext_v8i16_i64:
1103 ; CHECK:       // %bb.0: // %entry
1104 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1105 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1106 ; CHECK-NEXT:    fmov x8, d0
1107 ; CHECK-NEXT:    lsr x9, x8, #32
1108 ; CHECK-NEXT:    eor w8, w8, w9
1109 ; CHECK-NEXT:    eor w8, w8, w8, lsr #16
1110 ; CHECK-NEXT:    and x0, x8, #0xffff
1111 ; CHECK-NEXT:    ret
1112 entry:
1113   %y = zext <8 x i16> %x to <8 x i64>
1114   %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
1115   ret i64 %z
1118 define i64 @xor_sext_v2i32_i64(<2 x i32> %x) {
1119 ; CHECK-LABEL: xor_sext_v2i32_i64:
1120 ; CHECK:       // %bb.0: // %entry
1121 ; CHECK-NEXT:    fmov x8, d0
1122 ; CHECK-NEXT:    lsr x9, x8, #32
1123 ; CHECK-NEXT:    eor w8, w8, w9
1124 ; CHECK-NEXT:    sxtw x0, w8
1125 ; CHECK-NEXT:    ret
1126 entry:
1127   %y = sext <2 x i32> %x to <2 x i64>
1128   %z = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %y)
1129   ret i64 %z
1132 define i64 @xor_zext_v2i32_i64(<2 x i32> %x) {
1133 ; CHECK-LABEL: xor_zext_v2i32_i64:
1134 ; CHECK:       // %bb.0: // %entry
1135 ; CHECK-NEXT:    fmov x8, d0
1136 ; CHECK-NEXT:    lsr x9, x8, #32
1137 ; CHECK-NEXT:    eor w0, w8, w9
1138 ; CHECK-NEXT:    ret
1139 entry:
1140   %y = zext <2 x i32> %x to <2 x i64>
1141   %z = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %y)
1142   ret i64 %z
1145 define i64 @xor_sext_v4i32_i64(<4 x i32> %x) {
1146 ; CHECK-LABEL: xor_sext_v4i32_i64:
1147 ; CHECK:       // %bb.0: // %entry
1148 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1149 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1150 ; CHECK-NEXT:    fmov x8, d0
1151 ; CHECK-NEXT:    lsr x9, x8, #32
1152 ; CHECK-NEXT:    eor w8, w8, w9
1153 ; CHECK-NEXT:    sxtw x0, w8
1154 ; CHECK-NEXT:    ret
1155 entry:
1156   %y = sext <4 x i32> %x to <4 x i64>
1157   %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
1158   ret i64 %z
1161 define i64 @xor_zext_v4i32_i64(<4 x i32> %x) {
1162 ; CHECK-LABEL: xor_zext_v4i32_i64:
1163 ; CHECK:       // %bb.0: // %entry
1164 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1165 ; CHECK-NEXT:    eor v0.8b, v0.8b, v1.8b
1166 ; CHECK-NEXT:    fmov x8, d0
1167 ; CHECK-NEXT:    lsr x9, x8, #32
1168 ; CHECK-NEXT:    eor w0, w8, w9
1169 ; CHECK-NEXT:    ret
1170 entry:
1171   %y = zext <4 x i32> %x to <4 x i64>
1172   %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
1173   ret i64 %z
1176 declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)
1177 declare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>)
1178 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
1179 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
1180 declare i16 @llvm.vector.reduce.xor.v16i16(<16 x i16>)
1181 declare i16 @llvm.vector.reduce.xor.v8i16(<8 x i16>)
1182 declare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>)
1183 declare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>)
1184 declare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>)
1185 declare i32 @llvm.vector.reduce.or.v16i32(<16 x i32>)
1186 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
1187 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
1188 declare i32 @llvm.vector.reduce.xor.v16i32(<16 x i32>)
1189 declare i32 @llvm.vector.reduce.xor.v4i32(<4 x i32>)
1190 declare i32 @llvm.vector.reduce.xor.v8i32(<8 x i32>)
1191 declare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>)
1192 declare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>)
1193 declare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>)
1194 declare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>)
1195 declare i64 @llvm.vector.reduce.or.v16i64(<16 x i64>)
1196 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
1197 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
1198 declare i64 @llvm.vector.reduce.or.v8i64(<8 x i64>)
1199 declare i64 @llvm.vector.reduce.xor.v16i64(<16 x i64>)
1200 declare i64 @llvm.vector.reduce.xor.v2i64(<2 x i64>)
1201 declare i64 @llvm.vector.reduce.xor.v4i64(<4 x i64>)
1202 declare i64 @llvm.vector.reduce.xor.v8i64(<8 x i64>)