[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / reduce-xor.ll
blobc74b3734a1b76c3547897db7b973ec2a71614f38
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:
7 ; CHECK:       // %bb.0:
8 ; CHECK-NEXT:    and w0, w0, #0x1
9 ; CHECK-NEXT:    ret
11 ; GISEL-LABEL: test_redxor_v1i1:
12 ; GISEL:       // %bb.0:
13 ; GISEL-NEXT:    and w0, w0, #0x1
14 ; GISEL-NEXT:    ret
15   %or_result = call i1 @llvm.vector.reduce.xor.v1i1(<1 x i1> %a)
16   ret i1 %or_result
19 define i1 @test_redxor_v2i1(<2 x i1> %a) {
20 ; CHECK-LABEL: test_redxor_v2i1:
21 ; CHECK:       // %bb.0:
22 ; CHECK-NEXT:    addp v0.2s, v0.2s, v0.2s
23 ; CHECK-NEXT:    fmov w8, s0
24 ; CHECK-NEXT:    and w0, w8, #0x1
25 ; CHECK-NEXT:    ret
27 ; GISEL-LABEL: test_redxor_v2i1:
28 ; GISEL:       // %bb.0:
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
35 ; GISEL-NEXT:    ret
36   %or_result = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %a)
37   ret i1 %or_result
40 define i1 @test_redxor_v4i1(<4 x i1> %a) {
41 ; CHECK-LABEL: test_redxor_v4i1:
42 ; CHECK:       // %bb.0:
43 ; CHECK-NEXT:    addv h0, v0.4h
44 ; CHECK-NEXT:    fmov w8, s0
45 ; CHECK-NEXT:    and w0, w8, #0x1
46 ; CHECK-NEXT:    ret
48 ; GISEL-LABEL: test_redxor_v4i1:
49 ; GISEL:       // %bb.0:
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
62 ; GISEL-NEXT:    ret
63   %or_result = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %a)
64   ret i1 %or_result
67 define i1 @test_redxor_v8i1(<8 x i1> %a) {
68 ; CHECK-LABEL: test_redxor_v8i1:
69 ; CHECK:       // %bb.0:
70 ; CHECK-NEXT:    addv b0, v0.8b
71 ; CHECK-NEXT:    fmov w8, s0
72 ; CHECK-NEXT:    and w0, w8, #0x1
73 ; CHECK-NEXT:    ret
75 ; GISEL-LABEL: test_redxor_v8i1:
76 ; GISEL:       // %bb.0:
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
101 ; GISEL-NEXT:    ret
102   %or_result = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %a)
103   ret i1 %or_result
106 define i1 @test_redxor_v16i1(<16 x i1> %a) {
107 ; CHECK-LABEL: test_redxor_v16i1:
108 ; CHECK:       // %bb.0:
109 ; CHECK-NEXT:    addv b0, v0.16b
110 ; CHECK-NEXT:    fmov w8, s0
111 ; CHECK-NEXT:    and w0, w8, #0x1
112 ; CHECK-NEXT:    ret
114 ; GISEL-LABEL: test_redxor_v16i1:
115 ; GISEL:       // %bb.0:
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
163 ; GISEL-NEXT:    ret
164   %or_result = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
165   ret i1 %or_result
168 define <16 x i1> @test_redxor_ins_v16i1(<16 x i1> %a) {
169 ; CHECK-LABEL: test_redxor_ins_v16i1:
170 ; CHECK:       // %bb.0:
171 ; CHECK-NEXT:    addv b0, v0.16b
172 ; CHECK-NEXT:    ret
174 ; GISEL-LABEL: test_redxor_ins_v16i1:
175 ; GISEL:       // %bb.0:
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
223 ; GISEL-NEXT:    ret
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
226   ret <16 x i1> %ins
229 define i8 @test_redxor_v1i8(<1 x i8> %a) {
230 ; CHECK-LABEL: test_redxor_v1i8:
231 ; CHECK:       // %bb.0:
232 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
233 ; CHECK-NEXT:    umov w0, v0.b[0]
234 ; CHECK-NEXT:    ret
236 ; GISEL-LABEL: test_redxor_v1i8:
237 ; GISEL:       // %bb.0:
238 ; GISEL-NEXT:    fmov x0, d0
239 ; GISEL-NEXT:    // kill: def $w0 killed $w0 killed $x0
240 ; GISEL-NEXT:    ret
241   %xor_result = call i8 @llvm.vector.reduce.xor.v1i8(<1 x i8> %a)
242   ret i8 %xor_result
245 define i8 @test_redxor_v3i8(<3 x i8> %a) {
246 ; CHECK-LABEL: test_redxor_v3i8:
247 ; CHECK:       // %bb.0:
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
258 ; CHECK-NEXT:    ret
260 ; GISEL-LABEL: test_redxor_v3i8:
261 ; GISEL:       // %bb.0:
262 ; GISEL-NEXT:    eor w8, w0, w1
263 ; GISEL-NEXT:    eor w0, w8, w2
264 ; GISEL-NEXT:    ret
265   %xor_result = call i8 @llvm.vector.reduce.xor.v3i8(<3 x i8> %a)
266   ret i8 %xor_result
269 define i8 @test_redxor_v4i8(<4 x i8> %a) {
270 ; CHECK-LABEL: test_redxor_v4i8:
271 ; CHECK:       // %bb.0:
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
276 ; CHECK-NEXT:    ret
278 ; GISEL-LABEL: test_redxor_v4i8:
279 ; GISEL:       // %bb.0:
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
291 ; GISEL-NEXT:    ret
292   %xor_result = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> %a)
293   ret i8 %xor_result
296 define i8 @test_redxor_v8i8(<8 x i8> %a) {
297 ; CHECK-LABEL: test_redxor_v8i8:
298 ; CHECK:       // %bb.0:
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
304 ; CHECK-NEXT:    ret
306 ; GISEL-LABEL: test_redxor_v8i8:
307 ; GISEL:       // %bb.0:
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
331 ; GISEL-NEXT:    ret
332   %xor_result = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> %a)
333   ret i8 %xor_result
336 define i8 @test_redxor_v16i8(<16 x i8> %a) {
337 ; CHECK-LABEL: test_redxor_v16i8:
338 ; CHECK:       // %bb.0:
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
346 ; CHECK-NEXT:    ret
348 ; GISEL-LABEL: test_redxor_v16i8:
349 ; GISEL:       // %bb.0:
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
374 ; GISEL-NEXT:    ret
375   %xor_result = call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %a)
376   ret i8 %xor_result
379 define i8 @test_redxor_v32i8(<32 x i8> %a) {
380 ; CHECK-LABEL: test_redxor_v32i8:
381 ; CHECK:       // %bb.0:
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
390 ; CHECK-NEXT:    ret
392 ; GISEL-LABEL: test_redxor_v32i8:
393 ; GISEL:       // %bb.0:
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
419 ; GISEL-NEXT:    ret
420   %xor_result = call i8 @llvm.vector.reduce.xor.v32i8(<32 x i8> %a)
421   ret i8 %xor_result
424 define i16 @test_redxor_v4i16(<4 x i16> %a) {
425 ; CHECK-LABEL: test_redxor_v4i16:
426 ; CHECK:       // %bb.0:
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
431 ; CHECK-NEXT:    ret
433 ; GISEL-LABEL: test_redxor_v4i16:
434 ; GISEL:       // %bb.0:
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
446 ; GISEL-NEXT:    ret
447   %xor_result = call i16 @llvm.vector.reduce.xor.v4i16(<4 x i16> %a)
448   ret i16 %xor_result
451 define i16 @test_redxor_v8i16(<8 x i16> %a) {
452 ; CHECK-LABEL: test_redxor_v8i16:
453 ; CHECK:       // %bb.0:
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
460 ; CHECK-NEXT:    ret
462 ; GISEL-LABEL: test_redxor_v8i16:
463 ; GISEL:       // %bb.0:
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
476 ; GISEL-NEXT:    ret
477   %xor_result = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %a)
478   ret i16 %xor_result
481 define i16 @test_redxor_v16i16(<16 x i16> %a) {
482 ; CHECK-LABEL: test_redxor_v16i16:
483 ; CHECK:       // %bb.0:
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
491 ; CHECK-NEXT:    ret
493 ; GISEL-LABEL: test_redxor_v16i16:
494 ; GISEL:       // %bb.0:
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
508 ; GISEL-NEXT:    ret
509   %xor_result = call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %a)
510   ret i16 %xor_result
513 define i32 @test_redxor_v2i32(<2 x i32> %a) {
514 ; CHECK-LABEL: test_redxor_v2i32:
515 ; CHECK:       // %bb.0:
516 ; CHECK-NEXT:    fmov x8, d0
517 ; CHECK-NEXT:    lsr x9, x8, #32
518 ; CHECK-NEXT:    eor w0, w8, w9
519 ; CHECK-NEXT:    ret
521 ; GISEL-LABEL: test_redxor_v2i32:
522 ; GISEL:       // %bb.0:
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
528 ; GISEL-NEXT:    ret
529   %xor_result = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %a)
530   ret i32 %xor_result
533 define i32 @test_redxor_v4i32(<4 x i32> %a) {
534 ; CHECK-LABEL: test_redxor_v4i32:
535 ; CHECK:       // %bb.0:
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
541 ; CHECK-NEXT:    ret
543 ; GISEL-LABEL: test_redxor_v4i32:
544 ; GISEL:       // %bb.0:
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
551 ; GISEL-NEXT:    ret
552   %xor_result = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %a)
553   ret i32 %xor_result
556 define i32 @test_redxor_v8i32(<8 x i32> %a) {
557 ; CHECK-LABEL: test_redxor_v8i32:
558 ; CHECK:       // %bb.0:
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
565 ; CHECK-NEXT:    ret
567 ; GISEL-LABEL: test_redxor_v8i32:
568 ; GISEL:       // %bb.0:
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
576 ; GISEL-NEXT:    ret
577   %xor_result = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> %a)
578   ret i32 %xor_result
581 define i64 @test_redxor_v2i64(<2 x i64> %a) {
582 ; CHECK-LABEL: test_redxor_v2i64:
583 ; CHECK:       // %bb.0:
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
587 ; CHECK-NEXT:    ret
589 ; GISEL-LABEL: test_redxor_v2i64:
590 ; GISEL:       // %bb.0:
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
595 ; GISEL-NEXT:    ret
596   %xor_result = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %a)
597   ret i64 %xor_result
600 define i64 @test_redxor_v4i64(<4 x i64> %a) {
601 ; CHECK-LABEL: test_redxor_v4i64:
602 ; CHECK:       // %bb.0:
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
607 ; CHECK-NEXT:    ret
609 ; GISEL-LABEL: test_redxor_v4i64:
610 ; GISEL:       // %bb.0:
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
616 ; GISEL-NEXT:    ret
617   %xor_result = call i64 @llvm.vector.reduce.xor.v4i64(<4 x i64> %a)
618   ret i64 %xor_result
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>)