1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon | FileCheck %s
3 ; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+neon -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL
5 define i1 @test_redxor_v1i1(<1 x i1> %a) {
6 ; CHECK-LABEL: test_redxor_v1i1:
8 ; CHECK-NEXT: and w0, w0, #0x1
11 ; GISEL-LABEL: test_redxor_v1i1:
13 ; GISEL-NEXT: and w0, w0, #0x1
15 %or_result = call i1 @llvm.vector.reduce.xor.v1i1(<1 x i1> %a)
19 define i1 @test_redxor_v2i1(<2 x i1> %a) {
20 ; CHECK-LABEL: test_redxor_v2i1:
22 ; CHECK-NEXT: addp v0.2s, v0.2s, v0.2s
23 ; CHECK-NEXT: fmov w8, s0
24 ; CHECK-NEXT: and w0, w8, #0x1
27 ; GISEL-LABEL: test_redxor_v2i1:
29 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
30 ; GISEL-NEXT: mov w8, v0.s[1]
31 ; GISEL-NEXT: fmov w9, s0
32 ; GISEL-NEXT: eor w8, w9, w8
33 ; GISEL-NEXT: and w0, w8, #0x1
35 %or_result = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)
39 define i1 @test_redxor_v4i1(<4 x i1> %a) {
40 ; CHECK-LABEL: test_redxor_v4i1:
42 ; CHECK-NEXT: addv h0, v0.4h
43 ; CHECK-NEXT: fmov w8, s0
44 ; CHECK-NEXT: and w0, w8, #0x1
47 ; GISEL-LABEL: test_redxor_v4i1:
49 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
50 ; GISEL-NEXT: umov w8, v0.h[0]
51 ; GISEL-NEXT: umov w9, v0.h[1]
52 ; GISEL-NEXT: umov w10, v0.h[2]
53 ; GISEL-NEXT: umov w11, v0.h[3]
54 ; GISEL-NEXT: eor w8, w8, w9
55 ; GISEL-NEXT: eor w9, w10, w11
56 ; GISEL-NEXT: eor w8, w8, w9
57 ; GISEL-NEXT: and w0, w8, #0x1
59 %or_result = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)
63 define i1 @test_redxor_v8i1(<8 x i1> %a) {
64 ; CHECK-LABEL: test_redxor_v8i1:
66 ; CHECK-NEXT: addv b0, v0.8b
67 ; CHECK-NEXT: fmov w8, s0
68 ; CHECK-NEXT: and w0, w8, #0x1
71 ; GISEL-LABEL: test_redxor_v8i1:
73 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
74 ; GISEL-NEXT: umov w8, v0.b[0]
75 ; GISEL-NEXT: umov w9, v0.b[1]
76 ; GISEL-NEXT: umov w10, v0.b[2]
77 ; GISEL-NEXT: umov w11, v0.b[3]
78 ; GISEL-NEXT: umov w12, v0.b[4]
79 ; GISEL-NEXT: umov w13, v0.b[5]
80 ; GISEL-NEXT: umov w14, v0.b[6]
81 ; GISEL-NEXT: umov w15, v0.b[7]
82 ; GISEL-NEXT: eor w8, w8, w9
83 ; GISEL-NEXT: eor w9, w10, w11
84 ; GISEL-NEXT: eor w10, w12, w13
85 ; GISEL-NEXT: eor w11, w14, w15
86 ; GISEL-NEXT: eor w8, w8, w9
87 ; GISEL-NEXT: eor w9, w10, w11
88 ; GISEL-NEXT: eor w8, w8, w9
89 ; GISEL-NEXT: and w0, w8, #0x1
91 %or_result = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)
95 define i1 @test_redxor_v16i1(<16 x i1> %a) {
96 ; CHECK-LABEL: test_redxor_v16i1:
98 ; CHECK-NEXT: addv b0, v0.16b
99 ; CHECK-NEXT: fmov w8, s0
100 ; CHECK-NEXT: and w0, w8, #0x1
103 ; GISEL-LABEL: test_redxor_v16i1:
105 ; GISEL-NEXT: umov w8, v0.b[0]
106 ; GISEL-NEXT: umov w9, v0.b[1]
107 ; GISEL-NEXT: umov w10, v0.b[2]
108 ; GISEL-NEXT: umov w11, v0.b[3]
109 ; GISEL-NEXT: umov w12, v0.b[4]
110 ; GISEL-NEXT: umov w13, v0.b[5]
111 ; GISEL-NEXT: umov w14, v0.b[6]
112 ; GISEL-NEXT: umov w15, v0.b[7]
113 ; GISEL-NEXT: umov w16, v0.b[8]
114 ; GISEL-NEXT: umov w17, v0.b[9]
115 ; GISEL-NEXT: umov w18, v0.b[10]
116 ; GISEL-NEXT: umov w0, v0.b[11]
117 ; GISEL-NEXT: eor w8, w8, w9
118 ; GISEL-NEXT: umov w1, v0.b[12]
119 ; GISEL-NEXT: umov w2, v0.b[13]
120 ; GISEL-NEXT: eor w9, w10, w11
121 ; GISEL-NEXT: eor w10, w12, w13
122 ; GISEL-NEXT: umov w3, v0.b[14]
123 ; GISEL-NEXT: eor w11, w14, w15
124 ; GISEL-NEXT: eor w8, w8, w9
125 ; GISEL-NEXT: umov w4, v0.b[15]
126 ; GISEL-NEXT: eor w12, w16, w17
127 ; GISEL-NEXT: eor w13, w18, w0
128 ; GISEL-NEXT: eor w9, w10, w11
129 ; GISEL-NEXT: eor w14, w1, w2
130 ; GISEL-NEXT: eor w10, w12, w13
131 ; GISEL-NEXT: eor w8, w8, w9
132 ; GISEL-NEXT: eor w15, w3, w4
133 ; GISEL-NEXT: eor w11, w14, w15
134 ; GISEL-NEXT: eor w9, w10, w11
135 ; GISEL-NEXT: eor w8, w8, w9
136 ; GISEL-NEXT: and w0, w8, #0x1
138 %or_result = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
142 define <16 x i1> @test_redxor_ins_v16i1(<16 x i1> %a) {
143 ; CHECK-LABEL: test_redxor_ins_v16i1:
145 ; CHECK-NEXT: addv b0, v0.16b
148 ; GISEL-LABEL: test_redxor_ins_v16i1:
150 ; GISEL-NEXT: umov w8, v0.b[0]
151 ; GISEL-NEXT: umov w9, v0.b[1]
152 ; GISEL-NEXT: umov w10, v0.b[2]
153 ; GISEL-NEXT: umov w11, v0.b[3]
154 ; GISEL-NEXT: umov w12, v0.b[4]
155 ; GISEL-NEXT: umov w13, v0.b[5]
156 ; GISEL-NEXT: umov w14, v0.b[6]
157 ; GISEL-NEXT: umov w15, v0.b[7]
158 ; GISEL-NEXT: umov w16, v0.b[8]
159 ; GISEL-NEXT: umov w17, v0.b[9]
160 ; GISEL-NEXT: umov w18, v0.b[10]
161 ; GISEL-NEXT: umov w0, v0.b[11]
162 ; GISEL-NEXT: eor w8, w8, w9
163 ; GISEL-NEXT: umov w1, v0.b[12]
164 ; GISEL-NEXT: umov w2, v0.b[13]
165 ; GISEL-NEXT: eor w9, w10, w11
166 ; GISEL-NEXT: eor w10, w12, w13
167 ; GISEL-NEXT: umov w3, v0.b[14]
168 ; GISEL-NEXT: eor w11, w14, w15
169 ; GISEL-NEXT: eor w8, w8, w9
170 ; GISEL-NEXT: umov w4, v0.b[15]
171 ; GISEL-NEXT: eor w12, w16, w17
172 ; GISEL-NEXT: eor w13, w18, w0
173 ; GISEL-NEXT: eor w9, w10, w11
174 ; GISEL-NEXT: eor w14, w1, w2
175 ; GISEL-NEXT: eor w10, w12, w13
176 ; GISEL-NEXT: eor w8, w8, w9
177 ; GISEL-NEXT: eor w15, w3, w4
178 ; GISEL-NEXT: eor w11, w14, w15
179 ; GISEL-NEXT: eor w9, w10, w11
180 ; GISEL-NEXT: eor w8, w8, w9
181 ; GISEL-NEXT: fmov s0, w8
183 %xor_result = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
184 %ins = insertelement <16 x i1> poison, i1 %xor_result, i64 0
188 define i8 @test_redxor_v1i8(<1 x i8> %a) {
189 ; CHECK-LABEL: test_redxor_v1i8:
191 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
192 ; CHECK-NEXT: umov w0, v0.b[0]
195 ; GISEL-LABEL: test_redxor_v1i8:
197 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
198 ; GISEL-NEXT: umov w0, v0.b[0]
200 %xor_result = call i8 @llvm.vector.reduce.xor.v1i8(<1 x i8> %a)
204 define i8 @test_redxor_v3i8(<3 x i8> %a) {
205 ; CHECK-LABEL: test_redxor_v3i8:
207 ; CHECK-NEXT: movi v0.2d, #0000000000000000
208 ; CHECK-NEXT: mov v0.h[0], w0
209 ; CHECK-NEXT: mov v0.h[1], w1
210 ; CHECK-NEXT: fmov x8, d0
211 ; CHECK-NEXT: mov v0.h[2], w2
212 ; CHECK-NEXT: fmov x9, d0
213 ; CHECK-NEXT: lsr x10, x9, #32
214 ; CHECK-NEXT: lsr x9, x9, #16
215 ; CHECK-NEXT: eor w8, w8, w10
216 ; CHECK-NEXT: eor w0, w8, w9
219 ; GISEL-LABEL: test_redxor_v3i8:
221 ; GISEL-NEXT: eor w8, w0, w1
222 ; GISEL-NEXT: eor w0, w8, w2
224 %xor_result = call i8 @llvm.vector.reduce.xor.v3i8(<3 x i8> %a)
228 define i8 @test_redxor_v4i8(<4 x i8> %a) {
229 ; CHECK-LABEL: test_redxor_v4i8:
231 ; CHECK-NEXT: fmov x8, d0
232 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
233 ; CHECK-NEXT: lsr x9, x8, #16
234 ; CHECK-NEXT: eor w0, w8, w9
237 ; GISEL-LABEL: test_redxor_v4i8:
239 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
240 ; GISEL-NEXT: umov w8, v0.h[0]
241 ; GISEL-NEXT: umov w9, v0.h[1]
242 ; GISEL-NEXT: umov w10, v0.h[2]
243 ; GISEL-NEXT: umov w11, v0.h[3]
244 ; GISEL-NEXT: eor w8, w8, w9
245 ; GISEL-NEXT: eor w9, w10, w11
246 ; GISEL-NEXT: eor w0, w8, w9
248 %xor_result = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> %a)
252 define i8 @test_redxor_v8i8(<8 x i8> %a) {
253 ; CHECK-LABEL: test_redxor_v8i8:
255 ; CHECK-NEXT: fmov x8, d0
256 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
257 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
258 ; CHECK-NEXT: lsr x9, x8, #8
259 ; CHECK-NEXT: eor w0, w8, w9
262 ; GISEL-LABEL: test_redxor_v8i8:
264 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
265 ; GISEL-NEXT: umov w8, v0.b[0]
266 ; GISEL-NEXT: umov w9, v0.b[1]
267 ; GISEL-NEXT: umov w10, v0.b[2]
268 ; GISEL-NEXT: umov w11, v0.b[3]
269 ; GISEL-NEXT: umov w12, v0.b[4]
270 ; GISEL-NEXT: umov w13, v0.b[5]
271 ; GISEL-NEXT: umov w14, v0.b[6]
272 ; GISEL-NEXT: umov w15, v0.b[7]
273 ; GISEL-NEXT: eor w8, w8, w9
274 ; GISEL-NEXT: eor w9, w10, w11
275 ; GISEL-NEXT: eor w10, w12, w13
276 ; GISEL-NEXT: eor w11, w14, w15
277 ; GISEL-NEXT: eor w8, w8, w9
278 ; GISEL-NEXT: eor w9, w10, w11
279 ; GISEL-NEXT: eor w0, w8, w9
281 %xor_result = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> %a)
285 define i8 @test_redxor_v16i8(<16 x i8> %a) {
286 ; CHECK-LABEL: test_redxor_v16i8:
288 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
289 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
290 ; CHECK-NEXT: fmov x8, d0
291 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
292 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
293 ; CHECK-NEXT: lsr x9, x8, #8
294 ; CHECK-NEXT: eor w0, w8, w9
297 ; GISEL-LABEL: test_redxor_v16i8:
299 ; GISEL-NEXT: mov d1, v0.d[1]
300 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
301 ; GISEL-NEXT: umov w8, v0.b[0]
302 ; GISEL-NEXT: umov w9, v0.b[1]
303 ; GISEL-NEXT: umov w10, v0.b[2]
304 ; GISEL-NEXT: umov w11, v0.b[3]
305 ; GISEL-NEXT: umov w12, v0.b[4]
306 ; GISEL-NEXT: umov w13, v0.b[5]
307 ; GISEL-NEXT: umov w14, v0.b[6]
308 ; GISEL-NEXT: umov w15, v0.b[7]
309 ; GISEL-NEXT: eor w8, w8, w9
310 ; GISEL-NEXT: eor w9, w10, w11
311 ; GISEL-NEXT: eor w10, w12, w13
312 ; GISEL-NEXT: eor w11, w14, w15
313 ; GISEL-NEXT: eor w8, w8, w9
314 ; GISEL-NEXT: eor w9, w10, w11
315 ; GISEL-NEXT: eor w0, w8, w9
317 %xor_result = call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %a)
321 define i8 @test_redxor_v32i8(<32 x i8> %a) {
322 ; CHECK-LABEL: test_redxor_v32i8:
324 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
325 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
326 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
327 ; CHECK-NEXT: fmov x8, d0
328 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
329 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
330 ; CHECK-NEXT: lsr x9, x8, #8
331 ; CHECK-NEXT: eor w0, w8, w9
334 ; GISEL-LABEL: test_redxor_v32i8:
336 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
337 ; GISEL-NEXT: mov d1, v0.d[1]
338 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
339 ; GISEL-NEXT: umov w8, v0.b[0]
340 ; GISEL-NEXT: umov w9, v0.b[1]
341 ; GISEL-NEXT: umov w10, v0.b[2]
342 ; GISEL-NEXT: umov w11, v0.b[3]
343 ; GISEL-NEXT: umov w12, v0.b[4]
344 ; GISEL-NEXT: umov w13, v0.b[5]
345 ; GISEL-NEXT: umov w14, v0.b[6]
346 ; GISEL-NEXT: umov w15, v0.b[7]
347 ; GISEL-NEXT: eor w8, w8, w9
348 ; GISEL-NEXT: eor w9, w10, w11
349 ; GISEL-NEXT: eor w10, w12, w13
350 ; GISEL-NEXT: eor w11, w14, w15
351 ; GISEL-NEXT: eor w8, w8, w9
352 ; GISEL-NEXT: eor w9, w10, w11
353 ; GISEL-NEXT: eor w0, w8, w9
355 %xor_result = call i8 @llvm.vector.reduce.xor.v32i8(<32 x i8> %a)
359 define i16 @test_redxor_v4i16(<4 x i16> %a) {
360 ; CHECK-LABEL: test_redxor_v4i16:
362 ; CHECK-NEXT: fmov x8, d0
363 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
364 ; CHECK-NEXT: lsr x9, x8, #16
365 ; CHECK-NEXT: eor w0, w8, w9
368 ; GISEL-LABEL: test_redxor_v4i16:
370 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
371 ; GISEL-NEXT: umov w8, v0.h[0]
372 ; GISEL-NEXT: umov w9, v0.h[1]
373 ; GISEL-NEXT: umov w10, v0.h[2]
374 ; GISEL-NEXT: umov w11, v0.h[3]
375 ; GISEL-NEXT: eor w8, w8, w9
376 ; GISEL-NEXT: eor w9, w10, w11
377 ; GISEL-NEXT: eor w0, w8, w9
379 %xor_result = call i16 @llvm.vector.reduce.xor.v4i16(<4 x i16> %a)
383 define i16 @test_redxor_v8i16(<8 x i16> %a) {
384 ; CHECK-LABEL: test_redxor_v8i16:
386 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
387 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
388 ; CHECK-NEXT: fmov x8, d0
389 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
390 ; CHECK-NEXT: lsr x9, x8, #16
391 ; CHECK-NEXT: eor w0, w8, w9
394 ; GISEL-LABEL: test_redxor_v8i16:
396 ; GISEL-NEXT: mov d1, v0.d[1]
397 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
398 ; GISEL-NEXT: umov w8, v0.h[0]
399 ; GISEL-NEXT: umov w9, v0.h[1]
400 ; GISEL-NEXT: umov w10, v0.h[2]
401 ; GISEL-NEXT: umov w11, v0.h[3]
402 ; GISEL-NEXT: eor w8, w8, w9
403 ; GISEL-NEXT: eor w9, w10, w11
404 ; GISEL-NEXT: eor w0, w8, w9
406 %xor_result = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %a)
410 define i16 @test_redxor_v16i16(<16 x i16> %a) {
411 ; CHECK-LABEL: test_redxor_v16i16:
413 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
414 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
415 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
416 ; CHECK-NEXT: fmov x8, d0
417 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
418 ; CHECK-NEXT: lsr x9, x8, #16
419 ; CHECK-NEXT: eor w0, w8, w9
422 ; GISEL-LABEL: test_redxor_v16i16:
424 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
425 ; GISEL-NEXT: mov d1, v0.d[1]
426 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
427 ; GISEL-NEXT: umov w8, v0.h[0]
428 ; GISEL-NEXT: umov w9, v0.h[1]
429 ; GISEL-NEXT: umov w10, v0.h[2]
430 ; GISEL-NEXT: umov w11, v0.h[3]
431 ; GISEL-NEXT: eor w8, w8, w9
432 ; GISEL-NEXT: eor w9, w10, w11
433 ; GISEL-NEXT: eor w0, w8, w9
435 %xor_result = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %a)
439 define i32 @test_redxor_v2i32(<2 x i32> %a) {
440 ; CHECK-LABEL: test_redxor_v2i32:
442 ; CHECK-NEXT: fmov x8, d0
443 ; CHECK-NEXT: lsr x9, x8, #32
444 ; CHECK-NEXT: eor w0, w8, w9
447 ; GISEL-LABEL: test_redxor_v2i32:
449 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
450 ; GISEL-NEXT: mov w8, v0.s[1]
451 ; GISEL-NEXT: fmov w9, s0
452 ; GISEL-NEXT: eor w0, w9, w8
454 %xor_result = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %a)
458 define i32 @test_redxor_v4i32(<4 x i32> %a) {
459 ; CHECK-LABEL: test_redxor_v4i32:
461 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
462 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
463 ; CHECK-NEXT: fmov x8, d0
464 ; CHECK-NEXT: lsr x9, x8, #32
465 ; CHECK-NEXT: eor w0, w8, w9
468 ; GISEL-LABEL: test_redxor_v4i32:
470 ; GISEL-NEXT: mov d1, v0.d[1]
471 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
472 ; GISEL-NEXT: mov w8, v0.s[1]
473 ; GISEL-NEXT: fmov w9, s0
474 ; GISEL-NEXT: eor w0, w9, w8
476 %xor_result = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %a)
480 define i32 @test_redxor_v8i32(<8 x i32> %a) {
481 ; CHECK-LABEL: test_redxor_v8i32:
483 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
484 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
485 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
486 ; CHECK-NEXT: fmov x8, d0
487 ; CHECK-NEXT: lsr x9, x8, #32
488 ; CHECK-NEXT: eor w0, w8, w9
491 ; GISEL-LABEL: test_redxor_v8i32:
493 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
494 ; GISEL-NEXT: mov d1, v0.d[1]
495 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
496 ; GISEL-NEXT: mov w8, v0.s[1]
497 ; GISEL-NEXT: fmov w9, s0
498 ; GISEL-NEXT: eor w0, w9, w8
500 %xor_result = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %a)
504 define i64 @test_redxor_v2i64(<2 x i64> %a) {
505 ; CHECK-LABEL: test_redxor_v2i64:
507 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
508 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
509 ; CHECK-NEXT: fmov x0, d0
512 ; GISEL-LABEL: test_redxor_v2i64:
514 ; GISEL-NEXT: mov x8, v0.d[1]
515 ; GISEL-NEXT: fmov x9, d0
516 ; GISEL-NEXT: eor x0, x9, x8
518 %xor_result = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %a)
522 define i64 @test_redxor_v4i64(<4 x i64> %a) {
523 ; CHECK-LABEL: test_redxor_v4i64:
525 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
526 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
527 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
528 ; CHECK-NEXT: fmov x0, d0
531 ; GISEL-LABEL: test_redxor_v4i64:
533 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
534 ; GISEL-NEXT: mov x8, v0.d[1]
535 ; GISEL-NEXT: fmov x9, d0
536 ; GISEL-NEXT: eor x0, x9, x8
538 %xor_result = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %a)
542 declare i1 @llvm.vector.reduce.xor.v1i1(<1 x i1>)
543 declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)
544 declare i1 @llvm.vector.reduce.xor.v4i1(<4 x i1>)
545 declare i1 @llvm.vector.reduce.xor.v8i1(<8 x i1>)
546 declare i1 @llvm.vector.reduce.xor.v16i1(<16 x i1>)
547 declare i64 @llvm.vector.reduce.xor.v2i64(<2 x i64>)
548 declare i64 @llvm.vector.reduce.xor.v4i64(<4 x i64>)
549 declare i32 @llvm.vector.reduce.xor.v2i32(<2 x i32>)
550 declare i32 @llvm.vector.reduce.xor.v4i32(<4 x i32>)
551 declare i32 @llvm.vector.reduce.xor.v8i32(<8 x i32>)
552 declare i16 @llvm.vector.reduce.xor.v4i16(<4 x i16>)
553 declare i16 @llvm.vector.reduce.xor.v8i16(<8 x i16>)
554 declare i16 @llvm.vector.reduce.xor.v16i16(<16 x i16>)
555 declare i8 @llvm.vector.reduce.xor.v1i8(<1 x i8>)
556 declare i8 @llvm.vector.reduce.xor.v3i8(<3 x i8>)
557 declare i8 @llvm.vector.reduce.xor.v4i8(<4 x i8>)
558 declare i8 @llvm.vector.reduce.xor.v8i8(<8 x i8>)
559 declare i8 @llvm.vector.reduce.xor.v16i8(<16 x i8>)
560 declare i8 @llvm.vector.reduce.xor.v32i8(<32 x i8>)