1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-none-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
6 define i1 @test_redor_v1i1(<1 x i1> %a) {
7 ; CHECK-LABEL: test_redor_v1i1:
9 ; CHECK-NEXT: and w0, w0, #0x1
12 ; GISEL-LABEL: test_redor_v1i1:
14 ; GISEL-NEXT: and w0, w0, #0x1
16 %or_result = call i1 @llvm.vector.reduce.or.v1i1(<1 x i1> %a)
20 define i1 @test_redor_v2i1(<2 x i1> %a) {
21 ; CHECK-LABEL: test_redor_v2i1:
23 ; CHECK-NEXT: shl v0.2s, v0.2s, #31
24 ; CHECK-NEXT: cmlt v0.2s, v0.2s, #0
25 ; CHECK-NEXT: umaxp v0.2s, v0.2s, v0.2s
26 ; CHECK-NEXT: fmov w8, s0
27 ; CHECK-NEXT: and w0, w8, #0x1
30 ; GISEL-LABEL: test_redor_v2i1:
32 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
33 ; GISEL-NEXT: mov s1, v0.s[1]
34 ; GISEL-NEXT: fmov w8, s0
35 ; GISEL-NEXT: fmov w9, s1
36 ; GISEL-NEXT: orr w8, w8, w9
37 ; GISEL-NEXT: and w0, w8, #0x1
39 %or_result = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)
43 define i1 @test_redor_v4i1(<4 x i1> %a) {
44 ; CHECK-LABEL: test_redor_v4i1:
46 ; CHECK-NEXT: shl v0.4h, v0.4h, #15
47 ; CHECK-NEXT: cmlt v0.4h, v0.4h, #0
48 ; CHECK-NEXT: umaxv h0, v0.4h
49 ; CHECK-NEXT: fmov w8, s0
50 ; CHECK-NEXT: and w0, w8, #0x1
53 ; GISEL-LABEL: test_redor_v4i1:
55 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
56 ; GISEL-NEXT: mov h1, v0.h[1]
57 ; GISEL-NEXT: mov h2, v0.h[2]
58 ; GISEL-NEXT: mov h3, v0.h[3]
59 ; GISEL-NEXT: fmov w8, s0
60 ; GISEL-NEXT: fmov w9, s1
61 ; GISEL-NEXT: fmov w10, s2
62 ; GISEL-NEXT: fmov w11, s3
63 ; GISEL-NEXT: orr w8, w8, w9
64 ; GISEL-NEXT: orr w9, w10, w11
65 ; GISEL-NEXT: orr w8, w8, w9
66 ; GISEL-NEXT: and w0, w8, #0x1
68 %or_result = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
72 define i1 @test_redor_v8i1(<8 x i1> %a) {
73 ; CHECK-LABEL: test_redor_v8i1:
75 ; CHECK-NEXT: shl v0.8b, v0.8b, #7
76 ; CHECK-NEXT: cmlt v0.8b, v0.8b, #0
77 ; CHECK-NEXT: umaxv b0, v0.8b
78 ; CHECK-NEXT: fmov w8, s0
79 ; CHECK-NEXT: and w0, w8, #0x1
82 ; GISEL-LABEL: test_redor_v8i1:
84 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
85 ; GISEL-NEXT: mov b1, v0.b[1]
86 ; GISEL-NEXT: mov b2, v0.b[2]
87 ; GISEL-NEXT: mov b3, v0.b[3]
88 ; GISEL-NEXT: mov b4, v0.b[4]
89 ; GISEL-NEXT: mov b5, v0.b[5]
90 ; GISEL-NEXT: mov b6, v0.b[6]
91 ; GISEL-NEXT: mov b7, v0.b[7]
92 ; GISEL-NEXT: fmov w8, s0
93 ; GISEL-NEXT: fmov w9, s1
94 ; GISEL-NEXT: fmov w10, s2
95 ; GISEL-NEXT: fmov w11, s3
96 ; GISEL-NEXT: fmov w12, s4
97 ; GISEL-NEXT: fmov w13, s5
98 ; GISEL-NEXT: fmov w14, s6
99 ; GISEL-NEXT: orr w8, w8, w9
100 ; GISEL-NEXT: fmov w9, s7
101 ; GISEL-NEXT: orr w10, w10, w11
102 ; GISEL-NEXT: orr w11, w12, w13
103 ; GISEL-NEXT: orr w8, w8, w10
104 ; GISEL-NEXT: orr w9, w14, w9
105 ; GISEL-NEXT: orr w9, w11, w9
106 ; GISEL-NEXT: orr w8, w8, w9
107 ; GISEL-NEXT: and w0, w8, #0x1
109 %or_result = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
113 define i1 @test_redor_v16i1(<16 x i1> %a) {
114 ; CHECK-LABEL: test_redor_v16i1:
116 ; CHECK-NEXT: shl v0.16b, v0.16b, #7
117 ; CHECK-NEXT: cmlt v0.16b, v0.16b, #0
118 ; CHECK-NEXT: umaxv b0, v0.16b
119 ; CHECK-NEXT: fmov w8, s0
120 ; CHECK-NEXT: and w0, w8, #0x1
123 ; GISEL-LABEL: test_redor_v16i1:
125 ; GISEL-NEXT: mov b1, v0.b[1]
126 ; GISEL-NEXT: mov b2, v0.b[2]
127 ; GISEL-NEXT: mov b3, v0.b[3]
128 ; GISEL-NEXT: mov b4, v0.b[4]
129 ; GISEL-NEXT: mov b5, v0.b[5]
130 ; GISEL-NEXT: mov b6, v0.b[6]
131 ; GISEL-NEXT: mov b7, v0.b[7]
132 ; GISEL-NEXT: fmov w8, s0
133 ; GISEL-NEXT: mov b16, v0.b[8]
134 ; GISEL-NEXT: mov b17, v0.b[9]
135 ; GISEL-NEXT: mov b18, v0.b[10]
136 ; GISEL-NEXT: mov b19, v0.b[11]
137 ; GISEL-NEXT: fmov w9, s1
138 ; GISEL-NEXT: fmov w10, s2
139 ; GISEL-NEXT: fmov w11, s3
140 ; GISEL-NEXT: fmov w12, s6
141 ; GISEL-NEXT: mov b20, v0.b[12]
142 ; GISEL-NEXT: mov b21, v0.b[13]
143 ; GISEL-NEXT: fmov w13, s7
144 ; GISEL-NEXT: mov b22, v0.b[14]
145 ; GISEL-NEXT: mov b23, v0.b[15]
146 ; GISEL-NEXT: orr w8, w8, w9
147 ; GISEL-NEXT: orr w9, w10, w11
148 ; GISEL-NEXT: fmov w10, s4
149 ; GISEL-NEXT: orr w8, w8, w9
150 ; GISEL-NEXT: fmov w11, s5
151 ; GISEL-NEXT: fmov w14, s18
152 ; GISEL-NEXT: fmov w15, s19
153 ; GISEL-NEXT: fmov w16, s22
154 ; GISEL-NEXT: fmov w17, s23
155 ; GISEL-NEXT: orr w10, w10, w11
156 ; GISEL-NEXT: orr w11, w12, w13
157 ; GISEL-NEXT: fmov w12, s16
158 ; GISEL-NEXT: orr w9, w10, w11
159 ; GISEL-NEXT: fmov w13, s17
160 ; GISEL-NEXT: orr w8, w8, w9
161 ; GISEL-NEXT: orr w12, w12, w13
162 ; GISEL-NEXT: orr w13, w14, w15
163 ; GISEL-NEXT: fmov w14, s20
164 ; GISEL-NEXT: fmov w15, s21
165 ; GISEL-NEXT: orr w10, w12, w13
166 ; GISEL-NEXT: orr w14, w14, w15
167 ; GISEL-NEXT: orr w15, w16, w17
168 ; GISEL-NEXT: orr w11, w14, w15
169 ; GISEL-NEXT: orr w9, w10, w11
170 ; GISEL-NEXT: orr w8, w8, w9
171 ; GISEL-NEXT: and w0, w8, #0x1
173 %or_result = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
177 define <16 x i1> @test_redor_ins_v16i1(<16 x i1> %a) {
178 ; CHECK-LABEL: test_redor_ins_v16i1:
180 ; CHECK-NEXT: shl v0.16b, v0.16b, #7
181 ; CHECK-NEXT: cmlt v0.16b, v0.16b, #0
182 ; CHECK-NEXT: umaxv b0, v0.16b
185 ; GISEL-LABEL: test_redor_ins_v16i1:
187 ; GISEL-NEXT: mov b1, v0.b[1]
188 ; GISEL-NEXT: mov b2, v0.b[2]
189 ; GISEL-NEXT: mov b3, v0.b[3]
190 ; GISEL-NEXT: mov b4, v0.b[4]
191 ; GISEL-NEXT: mov b5, v0.b[5]
192 ; GISEL-NEXT: mov b6, v0.b[6]
193 ; GISEL-NEXT: mov b7, v0.b[7]
194 ; GISEL-NEXT: fmov w8, s0
195 ; GISEL-NEXT: mov b16, v0.b[8]
196 ; GISEL-NEXT: mov b17, v0.b[9]
197 ; GISEL-NEXT: mov b18, v0.b[10]
198 ; GISEL-NEXT: mov b19, v0.b[11]
199 ; GISEL-NEXT: fmov w9, s1
200 ; GISEL-NEXT: fmov w10, s2
201 ; GISEL-NEXT: fmov w11, s3
202 ; GISEL-NEXT: fmov w12, s6
203 ; GISEL-NEXT: mov b20, v0.b[12]
204 ; GISEL-NEXT: mov b21, v0.b[13]
205 ; GISEL-NEXT: fmov w13, s7
206 ; GISEL-NEXT: mov b22, v0.b[14]
207 ; GISEL-NEXT: mov b23, v0.b[15]
208 ; GISEL-NEXT: orr w8, w8, w9
209 ; GISEL-NEXT: orr w9, w10, w11
210 ; GISEL-NEXT: fmov w10, s4
211 ; GISEL-NEXT: orr w8, w8, w9
212 ; GISEL-NEXT: fmov w11, s5
213 ; GISEL-NEXT: fmov w14, s18
214 ; GISEL-NEXT: fmov w15, s19
215 ; GISEL-NEXT: fmov w16, s22
216 ; GISEL-NEXT: fmov w17, s23
217 ; GISEL-NEXT: orr w10, w10, w11
218 ; GISEL-NEXT: orr w11, w12, w13
219 ; GISEL-NEXT: fmov w12, s16
220 ; GISEL-NEXT: orr w9, w10, w11
221 ; GISEL-NEXT: fmov w13, s17
222 ; GISEL-NEXT: orr w8, w8, w9
223 ; GISEL-NEXT: orr w12, w12, w13
224 ; GISEL-NEXT: orr w13, w14, w15
225 ; GISEL-NEXT: fmov w14, s20
226 ; GISEL-NEXT: fmov w15, s21
227 ; GISEL-NEXT: orr w10, w12, w13
228 ; GISEL-NEXT: orr w14, w14, w15
229 ; GISEL-NEXT: orr w15, w16, w17
230 ; GISEL-NEXT: orr w11, w14, w15
231 ; GISEL-NEXT: orr w9, w10, w11
232 ; GISEL-NEXT: orr w8, w8, w9
233 ; GISEL-NEXT: fmov s0, w8
235 %or_result = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
236 %ins = insertelement <16 x i1> poison, i1 %or_result, i64 0
240 define i8 @test_redor_v1i8(<1 x i8> %a) {
241 ; CHECK-LABEL: test_redor_v1i8:
243 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
244 ; CHECK-NEXT: umov w0, v0.b[0]
247 ; GISEL-LABEL: test_redor_v1i8:
249 ; GISEL-NEXT: fmov x0, d0
250 ; GISEL-NEXT: // kill: def $w0 killed $w0 killed $x0
252 %or_result = call i8 @llvm.vector.reduce.or.v1i8(<1 x i8> %a)
256 define i8 @test_redor_v3i8(<3 x i8> %a) {
257 ; CHECK-LABEL: test_redor_v3i8:
259 ; CHECK-NEXT: movi v0.2d, #0000000000000000
260 ; CHECK-NEXT: mov v0.h[0], w0
261 ; CHECK-NEXT: mov v0.h[1], w1
262 ; CHECK-NEXT: fmov x8, d0
263 ; CHECK-NEXT: mov v0.h[2], w2
264 ; CHECK-NEXT: fmov x9, d0
265 ; CHECK-NEXT: lsr x10, x9, #32
266 ; CHECK-NEXT: lsr x9, x9, #16
267 ; CHECK-NEXT: orr w8, w8, w10
268 ; CHECK-NEXT: orr w0, w8, w9
271 ; GISEL-LABEL: test_redor_v3i8:
273 ; GISEL-NEXT: orr w8, w0, w1
274 ; GISEL-NEXT: orr w0, w8, w2
276 %or_result = call i8 @llvm.vector.reduce.or.v3i8(<3 x i8> %a)
280 define i8 @test_redor_v4i8(<4 x i8> %a) {
281 ; CHECK-LABEL: test_redor_v4i8:
283 ; CHECK-NEXT: fmov x8, d0
284 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
285 ; CHECK-NEXT: lsr x9, x8, #16
286 ; CHECK-NEXT: orr w0, w8, w9
289 ; GISEL-LABEL: test_redor_v4i8:
291 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
292 ; GISEL-NEXT: mov h1, v0.h[1]
293 ; GISEL-NEXT: mov h2, v0.h[2]
294 ; GISEL-NEXT: mov h3, v0.h[3]
295 ; GISEL-NEXT: fmov w8, s0
296 ; GISEL-NEXT: fmov w9, s1
297 ; GISEL-NEXT: fmov w10, s2
298 ; GISEL-NEXT: fmov w11, s3
299 ; GISEL-NEXT: orr w8, w8, w9
300 ; GISEL-NEXT: orr w9, w10, w11
301 ; GISEL-NEXT: orr w0, w8, w9
303 %or_result = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a)
307 define i8 @test_redor_v8i8(<8 x i8> %a) {
308 ; CHECK-LABEL: test_redor_v8i8:
310 ; CHECK-NEXT: fmov x8, d0
311 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
312 ; CHECK-NEXT: orr x8, x8, x8, lsr #16
313 ; CHECK-NEXT: lsr x9, x8, #8
314 ; CHECK-NEXT: orr w0, w8, w9
317 ; GISEL-LABEL: test_redor_v8i8:
319 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
320 ; GISEL-NEXT: mov b1, v0.b[1]
321 ; GISEL-NEXT: mov b2, v0.b[2]
322 ; GISEL-NEXT: mov b3, v0.b[3]
323 ; GISEL-NEXT: mov b4, v0.b[4]
324 ; GISEL-NEXT: mov b5, v0.b[5]
325 ; GISEL-NEXT: mov b6, v0.b[6]
326 ; GISEL-NEXT: mov b7, v0.b[7]
327 ; GISEL-NEXT: fmov w8, s0
328 ; GISEL-NEXT: fmov w9, s1
329 ; GISEL-NEXT: fmov w10, s2
330 ; GISEL-NEXT: fmov w11, s3
331 ; GISEL-NEXT: fmov w12, s4
332 ; GISEL-NEXT: fmov w13, s5
333 ; GISEL-NEXT: fmov w14, s6
334 ; GISEL-NEXT: orr w8, w8, w9
335 ; GISEL-NEXT: fmov w9, s7
336 ; GISEL-NEXT: orr w10, w10, w11
337 ; GISEL-NEXT: orr w11, w12, w13
338 ; GISEL-NEXT: orr w8, w8, w10
339 ; GISEL-NEXT: orr w9, w14, w9
340 ; GISEL-NEXT: orr w9, w11, w9
341 ; GISEL-NEXT: orr w0, w8, w9
343 %or_result = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a)
347 define i8 @test_redor_v16i8(<16 x i8> %a) {
348 ; CHECK-LABEL: test_redor_v16i8:
350 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
351 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
352 ; CHECK-NEXT: fmov x8, d0
353 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
354 ; CHECK-NEXT: orr x8, x8, x8, lsr #16
355 ; CHECK-NEXT: lsr x9, x8, #8
356 ; CHECK-NEXT: orr w0, w8, w9
359 ; GISEL-LABEL: test_redor_v16i8:
361 ; GISEL-NEXT: mov d1, v0.d[1]
362 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
363 ; GISEL-NEXT: mov b1, v0.b[1]
364 ; GISEL-NEXT: mov b2, v0.b[2]
365 ; GISEL-NEXT: mov b3, v0.b[3]
366 ; GISEL-NEXT: mov b4, v0.b[4]
367 ; GISEL-NEXT: mov b5, v0.b[5]
368 ; GISEL-NEXT: mov b6, v0.b[6]
369 ; GISEL-NEXT: mov b7, v0.b[7]
370 ; GISEL-NEXT: fmov w8, s0
371 ; GISEL-NEXT: fmov w9, s1
372 ; GISEL-NEXT: fmov w10, s2
373 ; GISEL-NEXT: fmov w11, s3
374 ; GISEL-NEXT: fmov w12, s4
375 ; GISEL-NEXT: fmov w13, s5
376 ; GISEL-NEXT: fmov w14, s6
377 ; GISEL-NEXT: orr w8, w8, w9
378 ; GISEL-NEXT: fmov w9, s7
379 ; GISEL-NEXT: orr w10, w10, w11
380 ; GISEL-NEXT: orr w11, w12, w13
381 ; GISEL-NEXT: orr w8, w8, w10
382 ; GISEL-NEXT: orr w9, w14, w9
383 ; GISEL-NEXT: orr w9, w11, w9
384 ; GISEL-NEXT: orr w0, w8, w9
386 %or_result = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a)
390 define i8 @test_redor_v32i8(<32 x i8> %a) {
391 ; CHECK-LABEL: test_redor_v32i8:
393 ; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
394 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
395 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
396 ; CHECK-NEXT: fmov x8, d0
397 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
398 ; CHECK-NEXT: orr x8, x8, x8, lsr #16
399 ; CHECK-NEXT: lsr x9, x8, #8
400 ; CHECK-NEXT: orr w0, w8, w9
403 ; GISEL-LABEL: test_redor_v32i8:
405 ; GISEL-NEXT: orr v0.16b, v0.16b, v1.16b
406 ; GISEL-NEXT: mov d1, v0.d[1]
407 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
408 ; GISEL-NEXT: mov b1, v0.b[1]
409 ; GISEL-NEXT: mov b2, v0.b[2]
410 ; GISEL-NEXT: mov b3, v0.b[3]
411 ; GISEL-NEXT: mov b4, v0.b[4]
412 ; GISEL-NEXT: mov b5, v0.b[5]
413 ; GISEL-NEXT: mov b6, v0.b[6]
414 ; GISEL-NEXT: mov b7, v0.b[7]
415 ; GISEL-NEXT: fmov w8, s0
416 ; GISEL-NEXT: fmov w9, s1
417 ; GISEL-NEXT: fmov w10, s2
418 ; GISEL-NEXT: fmov w11, s3
419 ; GISEL-NEXT: fmov w12, s4
420 ; GISEL-NEXT: fmov w13, s5
421 ; GISEL-NEXT: fmov w14, s6
422 ; GISEL-NEXT: orr w8, w8, w9
423 ; GISEL-NEXT: fmov w9, s7
424 ; GISEL-NEXT: orr w10, w10, w11
425 ; GISEL-NEXT: orr w11, w12, w13
426 ; GISEL-NEXT: orr w8, w8, w10
427 ; GISEL-NEXT: orr w9, w14, w9
428 ; GISEL-NEXT: orr w9, w11, w9
429 ; GISEL-NEXT: orr w0, w8, w9
431 %or_result = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a)
435 define i16 @test_redor_v4i16(<4 x i16> %a) {
436 ; CHECK-LABEL: test_redor_v4i16:
438 ; CHECK-NEXT: fmov x8, d0
439 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
440 ; CHECK-NEXT: lsr x9, x8, #16
441 ; CHECK-NEXT: orr w0, w8, w9
444 ; GISEL-LABEL: test_redor_v4i16:
446 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
447 ; GISEL-NEXT: mov h1, v0.h[1]
448 ; GISEL-NEXT: mov h2, v0.h[2]
449 ; GISEL-NEXT: mov h3, v0.h[3]
450 ; GISEL-NEXT: fmov w8, s0
451 ; GISEL-NEXT: fmov w9, s1
452 ; GISEL-NEXT: fmov w10, s2
453 ; GISEL-NEXT: fmov w11, s3
454 ; GISEL-NEXT: orr w8, w8, w9
455 ; GISEL-NEXT: orr w9, w10, w11
456 ; GISEL-NEXT: orr w0, w8, w9
458 %or_result = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a)
462 define i16 @test_redor_v8i16(<8 x i16> %a) {
463 ; CHECK-LABEL: test_redor_v8i16:
465 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
466 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
467 ; CHECK-NEXT: fmov x8, d0
468 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
469 ; CHECK-NEXT: lsr x9, x8, #16
470 ; CHECK-NEXT: orr w0, w8, w9
473 ; GISEL-LABEL: test_redor_v8i16:
475 ; GISEL-NEXT: mov d1, v0.d[1]
476 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
477 ; GISEL-NEXT: mov h1, v0.h[1]
478 ; GISEL-NEXT: mov h2, v0.h[2]
479 ; GISEL-NEXT: mov h3, v0.h[3]
480 ; GISEL-NEXT: fmov w8, s0
481 ; GISEL-NEXT: fmov w9, s1
482 ; GISEL-NEXT: fmov w10, s2
483 ; GISEL-NEXT: fmov w11, s3
484 ; GISEL-NEXT: orr w8, w8, w9
485 ; GISEL-NEXT: orr w9, w10, w11
486 ; GISEL-NEXT: orr w0, w8, w9
488 %or_result = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a)
492 define i16 @test_redor_v16i16(<16 x i16> %a) {
493 ; CHECK-LABEL: test_redor_v16i16:
495 ; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
496 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
497 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
498 ; CHECK-NEXT: fmov x8, d0
499 ; CHECK-NEXT: orr x8, x8, x8, lsr #32
500 ; CHECK-NEXT: lsr x9, x8, #16
501 ; CHECK-NEXT: orr w0, w8, w9
504 ; GISEL-LABEL: test_redor_v16i16:
506 ; GISEL-NEXT: orr v0.16b, v0.16b, v1.16b
507 ; GISEL-NEXT: mov d1, v0.d[1]
508 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
509 ; GISEL-NEXT: mov h1, v0.h[1]
510 ; GISEL-NEXT: mov h2, v0.h[2]
511 ; GISEL-NEXT: mov h3, v0.h[3]
512 ; GISEL-NEXT: fmov w8, s0
513 ; GISEL-NEXT: fmov w9, s1
514 ; GISEL-NEXT: fmov w10, s2
515 ; GISEL-NEXT: fmov w11, s3
516 ; GISEL-NEXT: orr w8, w8, w9
517 ; GISEL-NEXT: orr w9, w10, w11
518 ; GISEL-NEXT: orr w0, w8, w9
520 %or_result = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a)
524 define i32 @test_redor_v2i32(<2 x i32> %a) {
525 ; CHECK-LABEL: test_redor_v2i32:
527 ; CHECK-NEXT: fmov x8, d0
528 ; CHECK-NEXT: lsr x9, x8, #32
529 ; CHECK-NEXT: orr w0, w8, w9
532 ; GISEL-LABEL: test_redor_v2i32:
534 ; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
535 ; GISEL-NEXT: mov s1, v0.s[1]
536 ; GISEL-NEXT: fmov w8, s0
537 ; GISEL-NEXT: fmov w9, s1
538 ; GISEL-NEXT: orr w0, w8, w9
540 %or_result = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a)
544 define i32 @test_redor_v4i32(<4 x i32> %a) {
545 ; CHECK-LABEL: test_redor_v4i32:
547 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
548 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
549 ; CHECK-NEXT: fmov x8, d0
550 ; CHECK-NEXT: lsr x9, x8, #32
551 ; CHECK-NEXT: orr w0, w8, w9
554 ; GISEL-LABEL: test_redor_v4i32:
556 ; GISEL-NEXT: mov d1, v0.d[1]
557 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
558 ; GISEL-NEXT: mov s1, v0.s[1]
559 ; GISEL-NEXT: fmov w8, s0
560 ; GISEL-NEXT: fmov w9, s1
561 ; GISEL-NEXT: orr w0, w8, w9
563 %or_result = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a)
567 define i32 @test_redor_v8i32(<8 x i32> %a) {
568 ; CHECK-LABEL: test_redor_v8i32:
570 ; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
571 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
572 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
573 ; CHECK-NEXT: fmov x8, d0
574 ; CHECK-NEXT: lsr x9, x8, #32
575 ; CHECK-NEXT: orr w0, w8, w9
578 ; GISEL-LABEL: test_redor_v8i32:
580 ; GISEL-NEXT: orr v0.16b, v0.16b, v1.16b
581 ; GISEL-NEXT: mov d1, v0.d[1]
582 ; GISEL-NEXT: orr v0.8b, v0.8b, v1.8b
583 ; GISEL-NEXT: mov s1, v0.s[1]
584 ; GISEL-NEXT: fmov w8, s0
585 ; GISEL-NEXT: fmov w9, s1
586 ; GISEL-NEXT: orr w0, w8, w9
588 %or_result = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a)
592 define i64 @test_redor_v2i64(<2 x i64> %a) {
593 ; CHECK-LABEL: test_redor_v2i64:
595 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
596 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
597 ; CHECK-NEXT: fmov x0, d0
600 ; GISEL-LABEL: test_redor_v2i64:
602 ; GISEL-NEXT: mov d1, v0.d[1]
603 ; GISEL-NEXT: fmov x8, d0
604 ; GISEL-NEXT: fmov x9, d1
605 ; GISEL-NEXT: orr x0, x8, x9
607 %or_result = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a)
611 define i64 @test_redor_v4i64(<4 x i64> %a) {
612 ; CHECK-LABEL: test_redor_v4i64:
614 ; CHECK-NEXT: orr v0.16b, v0.16b, v1.16b
615 ; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8
616 ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b
617 ; CHECK-NEXT: fmov x0, d0
620 ; GISEL-LABEL: test_redor_v4i64:
622 ; GISEL-NEXT: orr v0.16b, v0.16b, v1.16b
623 ; GISEL-NEXT: mov d1, v0.d[1]
624 ; GISEL-NEXT: fmov x8, d0
625 ; GISEL-NEXT: fmov x9, d1
626 ; GISEL-NEXT: orr x0, x8, x9
628 %or_result = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a)
632 declare i1 @llvm.vector.reduce.or.v1i1(<1 x i1>)
633 declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
634 declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)
635 declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)
636 declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)
637 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
638 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
639 declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
640 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
641 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
642 declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
643 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
644 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
645 declare i8 @llvm.vector.reduce.or.v1i8(<1 x i8>)
646 declare i8 @llvm.vector.reduce.or.v3i8(<3 x i8>)
647 declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
648 declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
649 declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
650 declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)