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
16 %y = sext <8 x i8> %x to <8 x i16>
17 %z = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %y)
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
32 %y = zext <8 x i8> %x to <8 x i16>
33 %z = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %y)
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
51 %y = sext <16 x i8> %x to <16 x i16>
52 %z = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %y)
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
69 %y = zext <16 x i8> %x to <16 x i16>
70 %z = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %y)
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
85 %y = sext <8 x i8> %x to <8 x i32>
86 %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
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
101 %y = zext <8 x i8> %x to <8 x i32>
102 %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
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
119 %y = sext <16 x i8> %x to <16 x i32>
120 %z = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %y)
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
137 %y = zext <16 x i8> %x to <16 x i32>
138 %z = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %y)
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
153 %y = sext <8 x i8> %x to <8 x i64>
154 %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
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
169 %y = zext <8 x i8> %x to <8 x i64>
170 %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
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
187 %y = sext <16 x i8> %x to <16 x i64>
188 %z = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %y)
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
205 %y = zext <16 x i8> %x to <16 x i64>
206 %z = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %y)
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
220 %y = sext <4 x i16> %x to <4 x i32>
221 %z = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %y)
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
234 %y = zext <4 x i16> %x to <4 x i32>
235 %z = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %y)
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
251 %y = sext <8 x i16> %x to <8 x i32>
252 %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
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
267 %y = zext <8 x i16> %x to <8 x i32>
268 %z = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %y)
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
282 %y = sext <4 x i16> %x to <4 x i64>
283 %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
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
296 %y = zext <4 x i16> %x to <4 x i64>
297 %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
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
313 %y = sext <8 x i16> %x to <8 x i64>
314 %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
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
329 %y = zext <8 x i16> %x to <8 x i64>
330 %z = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %y)
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
343 %y = sext <2 x i32> %x to <2 x i64>
344 %z = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %y)
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
356 %y = zext <2 x i32> %x to <2 x i64>
357 %z = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %y)
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
372 %y = sext <4 x i32> %x to <4 x i64>
373 %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
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
387 %y = zext <4 x i32> %x to <4 x i64>
388 %z = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %y)
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
404 %y = sext <8 x i8> %x to <8 x i16>
405 %z = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %y)
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
420 %y = zext <8 x i8> %x to <8 x i16>
421 %z = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %y)
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
439 %y = sext <16 x i8> %x to <16 x i16>
440 %z = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %y)
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
457 %y = zext <16 x i8> %x to <16 x i16>
458 %z = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %y)
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
473 %y = sext <8 x i8> %x to <8 x i32>
474 %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
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
489 %y = zext <8 x i8> %x to <8 x i32>
490 %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
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
507 %y = sext <16 x i8> %x to <16 x i32>
508 %z = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %y)
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
525 %y = zext <16 x i8> %x to <16 x i32>
526 %z = call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %y)
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
541 %y = sext <8 x i8> %x to <8 x i64>
542 %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
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
557 %y = zext <8 x i8> %x to <8 x i64>
558 %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
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
575 %y = sext <16 x i8> %x to <16 x i64>
576 %z = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %y)
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
593 %y = zext <16 x i8> %x to <16 x i64>
594 %z = call i64 @llvm.vector.reduce.or.v16i64(<16 x i64> %y)
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
608 %y = sext <4 x i16> %x to <4 x i32>
609 %z = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %y)
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
623 %y = zext <4 x i16> %x to <4 x i32>
624 %z = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %y)
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
640 %y = sext <8 x i16> %x to <8 x i32>
641 %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
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
657 %y = zext <8 x i16> %x to <8 x i32>
658 %z = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %y)
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
672 %y = sext <4 x i16> %x to <4 x i64>
673 %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
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
687 %y = zext <4 x i16> %x to <4 x i64>
688 %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
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
704 %y = sext <8 x i16> %x to <8 x i64>
705 %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
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
721 %y = zext <8 x i16> %x to <8 x i64>
722 %z = call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %y)
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
735 %y = sext <2 x i32> %x to <2 x i64>
736 %z = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %y)
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
748 %y = zext <2 x i32> %x to <2 x i64>
749 %z = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %y)
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
764 %y = sext <4 x i32> %x to <4 x i64>
765 %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
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
779 %y = zext <4 x i32> %x to <4 x i64>
780 %z = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %y)
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
796 %y = sext <8 x i8> %x to <8 x i16>
797 %z = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %y)
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
812 %y = zext <8 x i8> %x to <8 x i16>
813 %z = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %y)
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
831 %y = sext <16 x i8> %x to <16 x i16>
832 %z = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %y)
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
849 %y = zext <16 x i8> %x to <16 x i16>
850 %z = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %y)
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
865 %y = sext <8 x i8> %x to <8 x i32>
866 %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
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
881 %y = zext <8 x i8> %x to <8 x i32>
882 %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
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
899 %y = sext <16 x i8> %x to <16 x i32>
900 %z = call i32 @llvm.vector.reduce.xor.v16i32(<16 x i32> %y)
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
917 %y = zext <16 x i8> %x to <16 x i32>
918 %z = call i32 @llvm.vector.reduce.xor.v16i32(<16 x i32> %y)
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
933 %y = sext <8 x i8> %x to <8 x i64>
934 %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
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
949 %y = zext <8 x i8> %x to <8 x i64>
950 %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
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
967 %y = sext <16 x i8> %x to <16 x i64>
968 %z = call i64 @llvm.vector.reduce.xor.v16i64(<16 x i64> %y)
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
985 %y = zext <16 x i8> %x to <16 x i64>
986 %z = call i64 @llvm.vector.reduce.xor.v16i64(<16 x i64> %y)
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
1000 %y = sext <4 x i16> %x to <4 x i32>
1001 %z = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %y)
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
1015 %y = zext <4 x i16> %x to <4 x i32>
1016 %z = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %y)
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
1032 %y = sext <8 x i16> %x to <8 x i32>
1033 %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
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
1049 %y = zext <8 x i16> %x to <8 x i32>
1050 %z = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %y)
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
1064 %y = sext <4 x i16> %x to <4 x i64>
1065 %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
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
1079 %y = zext <4 x i16> %x to <4 x i64>
1080 %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
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
1096 %y = sext <8 x i16> %x to <8 x i64>
1097 %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
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
1113 %y = zext <8 x i16> %x to <8 x i64>
1114 %z = call i64 @llvm.vector.reduce.xor.v8i64(<8 x i64> %y)
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
1127 %y = sext <2 x i32> %x to <2 x i64>
1128 %z = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %y)
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
1140 %y = zext <2 x i32> %x to <2 x i64>
1141 %z = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %y)
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
1156 %y = sext <4 x i32> %x to <4 x i64>
1157 %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
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
1171 %y = zext <4 x i32> %x to <4 x i64>
1172 %z = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %y)
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>)