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 s1, v0.s[1]
31 ; GISEL-NEXT: fmov w8, s0
32 ; GISEL-NEXT: fmov w9, s1
33 ; GISEL-NEXT: eor w8, w8, w9
34 ; GISEL-NEXT: and w0, w8, #0x1
36 %or_result = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)
40 define i1 @test_redxor_v4i1(<4 x i1> %a) {
41 ; CHECK-LABEL: test_redxor_v4i1:
43 ; CHECK-NEXT: addv h0, v0.4h
44 ; CHECK-NEXT: fmov w8, s0
45 ; CHECK-NEXT: and w0, w8, #0x1
48 ; GISEL-LABEL: test_redxor_v4i1:
50 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
51 ; GISEL-NEXT: mov h1, v0.h[1]
52 ; GISEL-NEXT: mov h2, v0.h[2]
53 ; GISEL-NEXT: mov h3, v0.h[3]
54 ; GISEL-NEXT: fmov w8, s0
55 ; GISEL-NEXT: fmov w9, s1
56 ; GISEL-NEXT: fmov w10, s2
57 ; GISEL-NEXT: fmov w11, s3
58 ; GISEL-NEXT: eor w8, w8, w9
59 ; GISEL-NEXT: eor w9, w10, w11
60 ; GISEL-NEXT: eor w8, w8, w9
61 ; GISEL-NEXT: and w0, w8, #0x1
63 %or_result = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)
67 define i1 @test_redxor_v8i1(<8 x i1> %a) {
68 ; CHECK-LABEL: test_redxor_v8i1:
70 ; CHECK-NEXT: addv b0, v0.8b
71 ; CHECK-NEXT: fmov w8, s0
72 ; CHECK-NEXT: and w0, w8, #0x1
75 ; GISEL-LABEL: test_redxor_v8i1:
77 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
78 ; GISEL-NEXT: mov b1, v0.b[1]
79 ; GISEL-NEXT: mov b2, v0.b[2]
80 ; GISEL-NEXT: mov b3, v0.b[3]
81 ; GISEL-NEXT: mov b4, v0.b[4]
82 ; GISEL-NEXT: mov b5, v0.b[5]
83 ; GISEL-NEXT: mov b6, v0.b[6]
84 ; GISEL-NEXT: mov b7, v0.b[7]
85 ; GISEL-NEXT: fmov w8, s0
86 ; GISEL-NEXT: fmov w9, s1
87 ; GISEL-NEXT: fmov w10, s2
88 ; GISEL-NEXT: fmov w11, s3
89 ; GISEL-NEXT: fmov w12, s4
90 ; GISEL-NEXT: fmov w13, s5
91 ; GISEL-NEXT: fmov w14, s6
92 ; GISEL-NEXT: eor w8, w8, w9
93 ; GISEL-NEXT: fmov w9, s7
94 ; GISEL-NEXT: eor w10, w10, w11
95 ; GISEL-NEXT: eor w11, w12, w13
96 ; GISEL-NEXT: eor w8, w8, w10
97 ; GISEL-NEXT: eor w9, w14, w9
98 ; GISEL-NEXT: eor w9, w11, w9
99 ; GISEL-NEXT: eor w8, w8, w9
100 ; GISEL-NEXT: and w0, w8, #0x1
102 %or_result = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)
106 define i1 @test_redxor_v16i1(<16 x i1> %a) {
107 ; CHECK-LABEL: test_redxor_v16i1:
109 ; CHECK-NEXT: addv b0, v0.16b
110 ; CHECK-NEXT: fmov w8, s0
111 ; CHECK-NEXT: and w0, w8, #0x1
114 ; GISEL-LABEL: test_redxor_v16i1:
116 ; GISEL-NEXT: mov b1, v0.b[1]
117 ; GISEL-NEXT: mov b2, v0.b[2]
118 ; GISEL-NEXT: mov b3, v0.b[3]
119 ; GISEL-NEXT: mov b4, v0.b[4]
120 ; GISEL-NEXT: mov b5, v0.b[5]
121 ; GISEL-NEXT: mov b6, v0.b[6]
122 ; GISEL-NEXT: mov b7, v0.b[7]
123 ; GISEL-NEXT: fmov w8, s0
124 ; GISEL-NEXT: mov b16, v0.b[8]
125 ; GISEL-NEXT: mov b17, v0.b[9]
126 ; GISEL-NEXT: mov b18, v0.b[10]
127 ; GISEL-NEXT: mov b19, v0.b[11]
128 ; GISEL-NEXT: fmov w9, s1
129 ; GISEL-NEXT: fmov w10, s2
130 ; GISEL-NEXT: fmov w11, s3
131 ; GISEL-NEXT: fmov w12, s6
132 ; GISEL-NEXT: mov b20, v0.b[12]
133 ; GISEL-NEXT: mov b21, v0.b[13]
134 ; GISEL-NEXT: fmov w13, s7
135 ; GISEL-NEXT: mov b22, v0.b[14]
136 ; GISEL-NEXT: mov b23, v0.b[15]
137 ; GISEL-NEXT: eor w8, w8, w9
138 ; GISEL-NEXT: eor w9, w10, w11
139 ; GISEL-NEXT: fmov w10, s4
140 ; GISEL-NEXT: eor w8, w8, w9
141 ; GISEL-NEXT: fmov w11, s5
142 ; GISEL-NEXT: fmov w14, s18
143 ; GISEL-NEXT: fmov w15, s19
144 ; GISEL-NEXT: fmov w16, s22
145 ; GISEL-NEXT: fmov w17, s23
146 ; GISEL-NEXT: eor w10, w10, w11
147 ; GISEL-NEXT: eor w11, w12, w13
148 ; GISEL-NEXT: fmov w12, s16
149 ; GISEL-NEXT: eor w9, w10, w11
150 ; GISEL-NEXT: fmov w13, s17
151 ; GISEL-NEXT: eor w8, w8, w9
152 ; GISEL-NEXT: eor w12, w12, w13
153 ; GISEL-NEXT: eor w13, w14, w15
154 ; GISEL-NEXT: fmov w14, s20
155 ; GISEL-NEXT: fmov w15, s21
156 ; GISEL-NEXT: eor w10, w12, w13
157 ; GISEL-NEXT: eor w14, w14, w15
158 ; GISEL-NEXT: eor w15, w16, w17
159 ; GISEL-NEXT: eor w11, w14, w15
160 ; GISEL-NEXT: eor w9, w10, w11
161 ; GISEL-NEXT: eor w8, w8, w9
162 ; GISEL-NEXT: and w0, w8, #0x1
164 %or_result = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
168 define <16 x i1> @test_redxor_ins_v16i1(<16 x i1> %a) {
169 ; CHECK-LABEL: test_redxor_ins_v16i1:
171 ; CHECK-NEXT: addv b0, v0.16b
174 ; GISEL-LABEL: test_redxor_ins_v16i1:
176 ; GISEL-NEXT: mov b1, v0.b[1]
177 ; GISEL-NEXT: mov b2, v0.b[2]
178 ; GISEL-NEXT: mov b3, v0.b[3]
179 ; GISEL-NEXT: mov b4, v0.b[4]
180 ; GISEL-NEXT: mov b5, v0.b[5]
181 ; GISEL-NEXT: mov b6, v0.b[6]
182 ; GISEL-NEXT: mov b7, v0.b[7]
183 ; GISEL-NEXT: fmov w8, s0
184 ; GISEL-NEXT: mov b16, v0.b[8]
185 ; GISEL-NEXT: mov b17, v0.b[9]
186 ; GISEL-NEXT: mov b18, v0.b[10]
187 ; GISEL-NEXT: mov b19, v0.b[11]
188 ; GISEL-NEXT: fmov w9, s1
189 ; GISEL-NEXT: fmov w10, s2
190 ; GISEL-NEXT: fmov w11, s3
191 ; GISEL-NEXT: fmov w12, s6
192 ; GISEL-NEXT: mov b20, v0.b[12]
193 ; GISEL-NEXT: mov b21, v0.b[13]
194 ; GISEL-NEXT: fmov w13, s7
195 ; GISEL-NEXT: mov b22, v0.b[14]
196 ; GISEL-NEXT: mov b23, v0.b[15]
197 ; GISEL-NEXT: eor w8, w8, w9
198 ; GISEL-NEXT: eor w9, w10, w11
199 ; GISEL-NEXT: fmov w10, s4
200 ; GISEL-NEXT: eor w8, w8, w9
201 ; GISEL-NEXT: fmov w11, s5
202 ; GISEL-NEXT: fmov w14, s18
203 ; GISEL-NEXT: fmov w15, s19
204 ; GISEL-NEXT: fmov w16, s22
205 ; GISEL-NEXT: fmov w17, s23
206 ; GISEL-NEXT: eor w10, w10, w11
207 ; GISEL-NEXT: eor w11, w12, w13
208 ; GISEL-NEXT: fmov w12, s16
209 ; GISEL-NEXT: eor w9, w10, w11
210 ; GISEL-NEXT: fmov w13, s17
211 ; GISEL-NEXT: eor w8, w8, w9
212 ; GISEL-NEXT: eor w12, w12, w13
213 ; GISEL-NEXT: eor w13, w14, w15
214 ; GISEL-NEXT: fmov w14, s20
215 ; GISEL-NEXT: fmov w15, s21
216 ; GISEL-NEXT: eor w10, w12, w13
217 ; GISEL-NEXT: eor w14, w14, w15
218 ; GISEL-NEXT: eor w15, w16, w17
219 ; GISEL-NEXT: eor w11, w14, w15
220 ; GISEL-NEXT: eor w9, w10, w11
221 ; GISEL-NEXT: eor w8, w8, w9
222 ; GISEL-NEXT: fmov s0, w8
224 %xor_result = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
225 %ins = insertelement <16 x i1> poison, i1 %xor_result, i64 0
229 define i8 @test_redxor_v1i8(<1 x i8> %a) {
230 ; CHECK-LABEL: test_redxor_v1i8:
232 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
233 ; CHECK-NEXT: umov w0, v0.b[0]
236 ; GISEL-LABEL: test_redxor_v1i8:
238 ; GISEL-NEXT: fmov x0, d0
239 ; GISEL-NEXT: // kill: def $w0 killed $w0 killed $x0
241 %xor_result = call i8 @llvm.vector.reduce.xor.v1i8(<1 x i8> %a)
245 define i8 @test_redxor_v3i8(<3 x i8> %a) {
246 ; CHECK-LABEL: test_redxor_v3i8:
248 ; CHECK-NEXT: movi v0.2d, #0000000000000000
249 ; CHECK-NEXT: mov v0.h[0], w0
250 ; CHECK-NEXT: mov v0.h[1], w1
251 ; CHECK-NEXT: fmov x8, d0
252 ; CHECK-NEXT: mov v0.h[2], w2
253 ; CHECK-NEXT: fmov x9, d0
254 ; CHECK-NEXT: lsr x10, x9, #32
255 ; CHECK-NEXT: lsr x9, x9, #16
256 ; CHECK-NEXT: eor w8, w8, w10
257 ; CHECK-NEXT: eor w0, w8, w9
260 ; GISEL-LABEL: test_redxor_v3i8:
262 ; GISEL-NEXT: eor w8, w0, w1
263 ; GISEL-NEXT: eor w0, w8, w2
265 %xor_result = call i8 @llvm.vector.reduce.xor.v3i8(<3 x i8> %a)
269 define i8 @test_redxor_v4i8(<4 x i8> %a) {
270 ; CHECK-LABEL: test_redxor_v4i8:
272 ; CHECK-NEXT: fmov x8, d0
273 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
274 ; CHECK-NEXT: lsr x9, x8, #16
275 ; CHECK-NEXT: eor w0, w8, w9
278 ; GISEL-LABEL: test_redxor_v4i8:
280 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
281 ; GISEL-NEXT: mov h1, v0.h[1]
282 ; GISEL-NEXT: mov h2, v0.h[2]
283 ; GISEL-NEXT: mov h3, v0.h[3]
284 ; GISEL-NEXT: fmov w8, s0
285 ; GISEL-NEXT: fmov w9, s1
286 ; GISEL-NEXT: fmov w10, s2
287 ; GISEL-NEXT: fmov w11, s3
288 ; GISEL-NEXT: eor w8, w8, w9
289 ; GISEL-NEXT: eor w9, w10, w11
290 ; GISEL-NEXT: eor w0, w8, w9
292 %xor_result = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> %a)
296 define i8 @test_redxor_v8i8(<8 x i8> %a) {
297 ; CHECK-LABEL: test_redxor_v8i8:
299 ; CHECK-NEXT: fmov x8, d0
300 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
301 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
302 ; CHECK-NEXT: lsr x9, x8, #8
303 ; CHECK-NEXT: eor w0, w8, w9
306 ; GISEL-LABEL: test_redxor_v8i8:
308 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
309 ; GISEL-NEXT: mov b1, v0.b[1]
310 ; GISEL-NEXT: mov b2, v0.b[2]
311 ; GISEL-NEXT: mov b3, v0.b[3]
312 ; GISEL-NEXT: mov b4, v0.b[4]
313 ; GISEL-NEXT: mov b5, v0.b[5]
314 ; GISEL-NEXT: mov b6, v0.b[6]
315 ; GISEL-NEXT: mov b7, v0.b[7]
316 ; GISEL-NEXT: fmov w8, s0
317 ; GISEL-NEXT: fmov w9, s1
318 ; GISEL-NEXT: fmov w10, s2
319 ; GISEL-NEXT: fmov w11, s3
320 ; GISEL-NEXT: fmov w12, s4
321 ; GISEL-NEXT: fmov w13, s5
322 ; GISEL-NEXT: fmov w14, s6
323 ; GISEL-NEXT: eor w8, w8, w9
324 ; GISEL-NEXT: fmov w9, s7
325 ; GISEL-NEXT: eor w10, w10, w11
326 ; GISEL-NEXT: eor w11, w12, w13
327 ; GISEL-NEXT: eor w8, w8, w10
328 ; GISEL-NEXT: eor w9, w14, w9
329 ; GISEL-NEXT: eor w9, w11, w9
330 ; GISEL-NEXT: eor w0, w8, w9
332 %xor_result = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> %a)
336 define i8 @test_redxor_v16i8(<16 x i8> %a) {
337 ; CHECK-LABEL: test_redxor_v16i8:
339 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
340 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
341 ; CHECK-NEXT: fmov x8, d0
342 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
343 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
344 ; CHECK-NEXT: lsr x9, x8, #8
345 ; CHECK-NEXT: eor w0, w8, w9
348 ; GISEL-LABEL: test_redxor_v16i8:
350 ; GISEL-NEXT: mov d1, v0.d[1]
351 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
352 ; GISEL-NEXT: mov b1, v0.b[1]
353 ; GISEL-NEXT: mov b2, v0.b[2]
354 ; GISEL-NEXT: mov b3, v0.b[3]
355 ; GISEL-NEXT: mov b4, v0.b[4]
356 ; GISEL-NEXT: mov b5, v0.b[5]
357 ; GISEL-NEXT: mov b6, v0.b[6]
358 ; GISEL-NEXT: mov b7, v0.b[7]
359 ; GISEL-NEXT: fmov w8, s0
360 ; GISEL-NEXT: fmov w9, s1
361 ; GISEL-NEXT: fmov w10, s2
362 ; GISEL-NEXT: fmov w11, s3
363 ; GISEL-NEXT: fmov w12, s4
364 ; GISEL-NEXT: fmov w13, s5
365 ; GISEL-NEXT: fmov w14, s6
366 ; GISEL-NEXT: eor w8, w8, w9
367 ; GISEL-NEXT: fmov w9, s7
368 ; GISEL-NEXT: eor w10, w10, w11
369 ; GISEL-NEXT: eor w11, w12, w13
370 ; GISEL-NEXT: eor w8, w8, w10
371 ; GISEL-NEXT: eor w9, w14, w9
372 ; GISEL-NEXT: eor w9, w11, w9
373 ; GISEL-NEXT: eor w0, w8, w9
375 %xor_result = call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %a)
379 define i8 @test_redxor_v32i8(<32 x i8> %a) {
380 ; CHECK-LABEL: test_redxor_v32i8:
382 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
383 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
384 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
385 ; CHECK-NEXT: fmov x8, d0
386 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
387 ; CHECK-NEXT: eor x8, x8, x8, lsr #16
388 ; CHECK-NEXT: lsr x9, x8, #8
389 ; CHECK-NEXT: eor w0, w8, w9
392 ; GISEL-LABEL: test_redxor_v32i8:
394 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
395 ; GISEL-NEXT: mov d1, v0.d[1]
396 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
397 ; GISEL-NEXT: mov b1, v0.b[1]
398 ; GISEL-NEXT: mov b2, v0.b[2]
399 ; GISEL-NEXT: mov b3, v0.b[3]
400 ; GISEL-NEXT: mov b4, v0.b[4]
401 ; GISEL-NEXT: mov b5, v0.b[5]
402 ; GISEL-NEXT: mov b6, v0.b[6]
403 ; GISEL-NEXT: mov b7, v0.b[7]
404 ; GISEL-NEXT: fmov w8, s0
405 ; GISEL-NEXT: fmov w9, s1
406 ; GISEL-NEXT: fmov w10, s2
407 ; GISEL-NEXT: fmov w11, s3
408 ; GISEL-NEXT: fmov w12, s4
409 ; GISEL-NEXT: fmov w13, s5
410 ; GISEL-NEXT: fmov w14, s6
411 ; GISEL-NEXT: eor w8, w8, w9
412 ; GISEL-NEXT: fmov w9, s7
413 ; GISEL-NEXT: eor w10, w10, w11
414 ; GISEL-NEXT: eor w11, w12, w13
415 ; GISEL-NEXT: eor w8, w8, w10
416 ; GISEL-NEXT: eor w9, w14, w9
417 ; GISEL-NEXT: eor w9, w11, w9
418 ; GISEL-NEXT: eor w0, w8, w9
420 %xor_result = call i8 @llvm.vector.reduce.xor.v32i8(<32 x i8> %a)
424 define i16 @test_redxor_v4i16(<4 x i16> %a) {
425 ; CHECK-LABEL: test_redxor_v4i16:
427 ; CHECK-NEXT: fmov x8, d0
428 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
429 ; CHECK-NEXT: lsr x9, x8, #16
430 ; CHECK-NEXT: eor w0, w8, w9
433 ; GISEL-LABEL: test_redxor_v4i16:
435 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
436 ; GISEL-NEXT: mov h1, v0.h[1]
437 ; GISEL-NEXT: mov h2, v0.h[2]
438 ; GISEL-NEXT: mov h3, v0.h[3]
439 ; GISEL-NEXT: fmov w8, s0
440 ; GISEL-NEXT: fmov w9, s1
441 ; GISEL-NEXT: fmov w10, s2
442 ; GISEL-NEXT: fmov w11, s3
443 ; GISEL-NEXT: eor w8, w8, w9
444 ; GISEL-NEXT: eor w9, w10, w11
445 ; GISEL-NEXT: eor w0, w8, w9
447 %xor_result = call i16 @llvm.vector.reduce.xor.v4i16(<4 x i16> %a)
451 define i16 @test_redxor_v8i16(<8 x i16> %a) {
452 ; CHECK-LABEL: test_redxor_v8i16:
454 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
455 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
456 ; CHECK-NEXT: fmov x8, d0
457 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
458 ; CHECK-NEXT: lsr x9, x8, #16
459 ; CHECK-NEXT: eor w0, w8, w9
462 ; GISEL-LABEL: test_redxor_v8i16:
464 ; GISEL-NEXT: mov d1, v0.d[1]
465 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
466 ; GISEL-NEXT: mov h1, v0.h[1]
467 ; GISEL-NEXT: mov h2, v0.h[2]
468 ; GISEL-NEXT: mov h3, v0.h[3]
469 ; GISEL-NEXT: fmov w8, s0
470 ; GISEL-NEXT: fmov w9, s1
471 ; GISEL-NEXT: fmov w10, s2
472 ; GISEL-NEXT: fmov w11, s3
473 ; GISEL-NEXT: eor w8, w8, w9
474 ; GISEL-NEXT: eor w9, w10, w11
475 ; GISEL-NEXT: eor w0, w8, w9
477 %xor_result = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %a)
481 define i16 @test_redxor_v16i16(<16 x i16> %a) {
482 ; CHECK-LABEL: test_redxor_v16i16:
484 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
485 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
486 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
487 ; CHECK-NEXT: fmov x8, d0
488 ; CHECK-NEXT: eor x8, x8, x8, lsr #32
489 ; CHECK-NEXT: lsr x9, x8, #16
490 ; CHECK-NEXT: eor w0, w8, w9
493 ; GISEL-LABEL: test_redxor_v16i16:
495 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
496 ; GISEL-NEXT: mov d1, v0.d[1]
497 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
498 ; GISEL-NEXT: mov h1, v0.h[1]
499 ; GISEL-NEXT: mov h2, v0.h[2]
500 ; GISEL-NEXT: mov h3, v0.h[3]
501 ; GISEL-NEXT: fmov w8, s0
502 ; GISEL-NEXT: fmov w9, s1
503 ; GISEL-NEXT: fmov w10, s2
504 ; GISEL-NEXT: fmov w11, s3
505 ; GISEL-NEXT: eor w8, w8, w9
506 ; GISEL-NEXT: eor w9, w10, w11
507 ; GISEL-NEXT: eor w0, w8, w9
509 %xor_result = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %a)
513 define i32 @test_redxor_v2i32(<2 x i32> %a) {
514 ; CHECK-LABEL: test_redxor_v2i32:
516 ; CHECK-NEXT: fmov x8, d0
517 ; CHECK-NEXT: lsr x9, x8, #32
518 ; CHECK-NEXT: eor w0, w8, w9
521 ; GISEL-LABEL: test_redxor_v2i32:
523 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
524 ; GISEL-NEXT: mov s1, v0.s[1]
525 ; GISEL-NEXT: fmov w8, s0
526 ; GISEL-NEXT: fmov w9, s1
527 ; GISEL-NEXT: eor w0, w8, w9
529 %xor_result = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %a)
533 define i32 @test_redxor_v4i32(<4 x i32> %a) {
534 ; CHECK-LABEL: test_redxor_v4i32:
536 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
537 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
538 ; CHECK-NEXT: fmov x8, d0
539 ; CHECK-NEXT: lsr x9, x8, #32
540 ; CHECK-NEXT: eor w0, w8, w9
543 ; GISEL-LABEL: test_redxor_v4i32:
545 ; GISEL-NEXT: mov d1, v0.d[1]
546 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
547 ; GISEL-NEXT: mov s1, v0.s[1]
548 ; GISEL-NEXT: fmov w8, s0
549 ; GISEL-NEXT: fmov w9, s1
550 ; GISEL-NEXT: eor w0, w8, w9
552 %xor_result = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %a)
556 define i32 @test_redxor_v8i32(<8 x i32> %a) {
557 ; CHECK-LABEL: test_redxor_v8i32:
559 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
560 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
561 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
562 ; CHECK-NEXT: fmov x8, d0
563 ; CHECK-NEXT: lsr x9, x8, #32
564 ; CHECK-NEXT: eor w0, w8, w9
567 ; GISEL-LABEL: test_redxor_v8i32:
569 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
570 ; GISEL-NEXT: mov d1, v0.d[1]
571 ; GISEL-NEXT: eor v0.8b, v0.8b, v1.8b
572 ; GISEL-NEXT: mov s1, v0.s[1]
573 ; GISEL-NEXT: fmov w8, s0
574 ; GISEL-NEXT: fmov w9, s1
575 ; GISEL-NEXT: eor w0, w8, w9
577 %xor_result = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %a)
581 define i64 @test_redxor_v2i64(<2 x i64> %a) {
582 ; CHECK-LABEL: test_redxor_v2i64:
584 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
585 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
586 ; CHECK-NEXT: fmov x0, d0
589 ; GISEL-LABEL: test_redxor_v2i64:
591 ; GISEL-NEXT: mov d1, v0.d[1]
592 ; GISEL-NEXT: fmov x8, d0
593 ; GISEL-NEXT: fmov x9, d1
594 ; GISEL-NEXT: eor x0, x8, x9
596 %xor_result = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %a)
600 define i64 @test_redxor_v4i64(<4 x i64> %a) {
601 ; CHECK-LABEL: test_redxor_v4i64:
603 ; CHECK-NEXT: eor v0.16b, v0.16b, v1.16b
604 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
605 ; CHECK-NEXT: eor v0.8b, v0.8b, v1.8b
606 ; CHECK-NEXT: fmov x0, d0
609 ; GISEL-LABEL: test_redxor_v4i64:
611 ; GISEL-NEXT: eor v0.16b, v0.16b, v1.16b
612 ; GISEL-NEXT: mov d1, v0.d[1]
613 ; GISEL-NEXT: fmov x8, d0
614 ; GISEL-NEXT: fmov x9, d1
615 ; GISEL-NEXT: eor x0, x8, x9
617 %xor_result = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %a)
621 declare i1 @llvm.vector.reduce.xor.v1i1(<1 x i1>)
622 declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)
623 declare i1 @llvm.vector.reduce.xor.v4i1(<4 x i1>)
624 declare i1 @llvm.vector.reduce.xor.v8i1(<8 x i1>)
625 declare i1 @llvm.vector.reduce.xor.v16i1(<16 x i1>)
626 declare i64 @llvm.vector.reduce.xor.v2i64(<2 x i64>)
627 declare i64 @llvm.vector.reduce.xor.v4i64(<4 x i64>)
628 declare i32 @llvm.vector.reduce.xor.v2i32(<2 x i32>)
629 declare i32 @llvm.vector.reduce.xor.v4i32(<4 x i32>)
630 declare i32 @llvm.vector.reduce.xor.v8i32(<8 x i32>)
631 declare i16 @llvm.vector.reduce.xor.v4i16(<4 x i16>)
632 declare i16 @llvm.vector.reduce.xor.v8i16(<8 x i16>)
633 declare i16 @llvm.vector.reduce.xor.v16i16(<16 x i16>)
634 declare i8 @llvm.vector.reduce.xor.v1i8(<1 x i8>)
635 declare i8 @llvm.vector.reduce.xor.v3i8(<3 x i8>)
636 declare i8 @llvm.vector.reduce.xor.v4i8(<4 x i8>)
637 declare i8 @llvm.vector.reduce.xor.v8i8(<8 x i8>)
638 declare i8 @llvm.vector.reduce.xor.v16i8(<16 x i8>)
639 declare i8 @llvm.vector.reduce.xor.v32i8(<32 x i8>)