[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / reduce-or.ll
blob659b062b5cc9432903e627c0d1a0e4e281c70c67
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:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    and w0, w0, #0x1
10 ; CHECK-NEXT:    ret
12 ; GISEL-LABEL: test_redor_v1i1:
13 ; GISEL:       // %bb.0:
14 ; GISEL-NEXT:    and w0, w0, #0x1
15 ; GISEL-NEXT:    ret
16   %or_result = call i1 @llvm.vector.reduce.or.v1i1(<1 x i1> %a)
17   ret i1 %or_result
20 define i1 @test_redor_v2i1(<2 x i1> %a) {
21 ; CHECK-LABEL: test_redor_v2i1:
22 ; CHECK:       // %bb.0:
23 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
24 ; CHECK-NEXT:    mov w8, v0.s[1]
25 ; CHECK-NEXT:    fmov w9, s0
26 ; CHECK-NEXT:    orr w8, w9, w8
27 ; CHECK-NEXT:    and w0, w8, #0x1
28 ; CHECK-NEXT:    ret
30 ; GISEL-LABEL: test_redor_v2i1:
31 ; GISEL:       // %bb.0:
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
38 ; GISEL-NEXT:    ret
39   %or_result = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %a)
40   ret i1 %or_result
43 define i1 @test_redor_v4i1(<4 x i1> %a) {
44 ; CHECK-LABEL: test_redor_v4i1:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
47 ; CHECK-NEXT:    umov w10, v0.h[1]
48 ; CHECK-NEXT:    umov w11, v0.h[0]
49 ; CHECK-NEXT:    umov w9, v0.h[2]
50 ; CHECK-NEXT:    orr w10, w11, w10
51 ; CHECK-NEXT:    umov w8, v0.h[3]
52 ; CHECK-NEXT:    orr w9, w10, w9
53 ; CHECK-NEXT:    orr w8, w9, w8
54 ; CHECK-NEXT:    and w0, w8, #0x1
55 ; CHECK-NEXT:    ret
57 ; GISEL-LABEL: test_redor_v4i1:
58 ; GISEL:       // %bb.0:
59 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
60 ; GISEL-NEXT:    mov h1, v0.h[1]
61 ; GISEL-NEXT:    mov h2, v0.h[2]
62 ; GISEL-NEXT:    mov h3, v0.h[3]
63 ; GISEL-NEXT:    fmov w8, s0
64 ; GISEL-NEXT:    fmov w9, s1
65 ; GISEL-NEXT:    orr w8, w8, w9
66 ; GISEL-NEXT:    fmov w9, s2
67 ; GISEL-NEXT:    fmov w10, s3
68 ; GISEL-NEXT:    orr w9, w9, w10
69 ; GISEL-NEXT:    orr w8, w8, w9
70 ; GISEL-NEXT:    and w0, w8, #0x1
71 ; GISEL-NEXT:    ret
72   %or_result = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %a)
73   ret i1 %or_result
76 define i1 @test_redor_v8i1(<8 x i1> %a) {
77 ; CHECK-LABEL: test_redor_v8i1:
78 ; CHECK:       // %bb.0:
79 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
80 ; CHECK-NEXT:    umov w14, v0.b[1]
81 ; CHECK-NEXT:    umov w15, v0.b[0]
82 ; CHECK-NEXT:    umov w13, v0.b[2]
83 ; CHECK-NEXT:    orr w14, w15, w14
84 ; CHECK-NEXT:    umov w12, v0.b[3]
85 ; CHECK-NEXT:    orr w13, w14, w13
86 ; CHECK-NEXT:    umov w11, v0.b[4]
87 ; CHECK-NEXT:    orr w12, w13, w12
88 ; CHECK-NEXT:    umov w10, v0.b[5]
89 ; CHECK-NEXT:    orr w11, w12, w11
90 ; CHECK-NEXT:    umov w9, v0.b[6]
91 ; CHECK-NEXT:    orr w10, w11, w10
92 ; CHECK-NEXT:    umov w8, v0.b[7]
93 ; CHECK-NEXT:    orr w9, w10, w9
94 ; CHECK-NEXT:    orr w8, w9, w8
95 ; CHECK-NEXT:    and w0, w8, #0x1
96 ; CHECK-NEXT:    ret
98 ; GISEL-LABEL: test_redor_v8i1:
99 ; GISEL:       // %bb.0:
100 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
101 ; GISEL-NEXT:    mov b1, v0.b[1]
102 ; GISEL-NEXT:    mov b2, v0.b[2]
103 ; GISEL-NEXT:    mov b3, v0.b[3]
104 ; GISEL-NEXT:    fmov w8, s0
105 ; GISEL-NEXT:    fmov w9, s1
106 ; GISEL-NEXT:    mov b4, v0.b[4]
107 ; GISEL-NEXT:    mov b5, v0.b[5]
108 ; GISEL-NEXT:    orr w8, w8, w9
109 ; GISEL-NEXT:    fmov w9, s2
110 ; GISEL-NEXT:    fmov w10, s3
111 ; GISEL-NEXT:    mov b6, v0.b[6]
112 ; GISEL-NEXT:    mov b7, v0.b[7]
113 ; GISEL-NEXT:    orr w9, w9, w10
114 ; GISEL-NEXT:    fmov w10, s4
115 ; GISEL-NEXT:    fmov w11, s5
116 ; GISEL-NEXT:    orr w10, w10, w11
117 ; GISEL-NEXT:    fmov w11, s6
118 ; GISEL-NEXT:    fmov w12, s7
119 ; GISEL-NEXT:    orr w11, w11, w12
120 ; GISEL-NEXT:    orr w8, w8, w9
121 ; GISEL-NEXT:    orr w9, w10, w11
122 ; GISEL-NEXT:    orr w8, w8, w9
123 ; GISEL-NEXT:    and w0, w8, #0x1
124 ; GISEL-NEXT:    ret
125   %or_result = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %a)
126   ret i1 %or_result
129 define i1 @test_redor_v16i1(<16 x i1> %a) {
130 ; CHECK-LABEL: test_redor_v16i1:
131 ; CHECK:       // %bb.0:
132 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
133 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
134 ; CHECK-NEXT:    umov w8, v0.b[1]
135 ; CHECK-NEXT:    umov w9, v0.b[0]
136 ; CHECK-NEXT:    orr w8, w9, w8
137 ; CHECK-NEXT:    umov w9, v0.b[2]
138 ; CHECK-NEXT:    orr w8, w8, w9
139 ; CHECK-NEXT:    umov w9, v0.b[3]
140 ; CHECK-NEXT:    orr w8, w8, w9
141 ; CHECK-NEXT:    umov w9, v0.b[4]
142 ; CHECK-NEXT:    orr w8, w8, w9
143 ; CHECK-NEXT:    umov w9, v0.b[5]
144 ; CHECK-NEXT:    orr w8, w8, w9
145 ; CHECK-NEXT:    umov w9, v0.b[6]
146 ; CHECK-NEXT:    orr w8, w8, w9
147 ; CHECK-NEXT:    umov w9, v0.b[7]
148 ; CHECK-NEXT:    orr w8, w8, w9
149 ; CHECK-NEXT:    and w0, w8, #0x1
150 ; CHECK-NEXT:    ret
152 ; GISEL-LABEL: test_redor_v16i1:
153 ; GISEL:       // %bb.0:
154 ; GISEL-NEXT:    mov b1, v0.b[1]
155 ; GISEL-NEXT:    mov b2, v0.b[2]
156 ; GISEL-NEXT:    mov b3, v0.b[3]
157 ; GISEL-NEXT:    fmov w8, s0
158 ; GISEL-NEXT:    fmov w9, s1
159 ; GISEL-NEXT:    mov b4, v0.b[4]
160 ; GISEL-NEXT:    mov b5, v0.b[5]
161 ; GISEL-NEXT:    orr w8, w8, w9
162 ; GISEL-NEXT:    fmov w9, s2
163 ; GISEL-NEXT:    fmov w10, s3
164 ; GISEL-NEXT:    mov b6, v0.b[6]
165 ; GISEL-NEXT:    mov b7, v0.b[7]
166 ; GISEL-NEXT:    orr w9, w9, w10
167 ; GISEL-NEXT:    fmov w10, s4
168 ; GISEL-NEXT:    fmov w11, s5
169 ; GISEL-NEXT:    mov b16, v0.b[8]
170 ; GISEL-NEXT:    mov b17, v0.b[9]
171 ; GISEL-NEXT:    orr w10, w10, w11
172 ; GISEL-NEXT:    fmov w11, s6
173 ; GISEL-NEXT:    fmov w12, s7
174 ; GISEL-NEXT:    mov b18, v0.b[10]
175 ; GISEL-NEXT:    mov b19, v0.b[11]
176 ; GISEL-NEXT:    orr w11, w11, w12
177 ; GISEL-NEXT:    fmov w12, s16
178 ; GISEL-NEXT:    fmov w13, s17
179 ; GISEL-NEXT:    mov b20, v0.b[12]
180 ; GISEL-NEXT:    mov b21, v0.b[13]
181 ; GISEL-NEXT:    orr w12, w12, w13
182 ; GISEL-NEXT:    fmov w13, s18
183 ; GISEL-NEXT:    fmov w14, s19
184 ; GISEL-NEXT:    mov b22, v0.b[14]
185 ; GISEL-NEXT:    mov b23, v0.b[15]
186 ; GISEL-NEXT:    orr w13, w13, w14
187 ; GISEL-NEXT:    fmov w14, s20
188 ; GISEL-NEXT:    fmov w15, s21
189 ; GISEL-NEXT:    orr w14, w14, w15
190 ; GISEL-NEXT:    fmov w15, s22
191 ; GISEL-NEXT:    fmov w16, s23
192 ; GISEL-NEXT:    orr w15, w15, w16
193 ; GISEL-NEXT:    orr w8, w8, w9
194 ; GISEL-NEXT:    orr w9, w10, w11
195 ; GISEL-NEXT:    orr w10, w12, w13
196 ; GISEL-NEXT:    orr w11, w14, w15
197 ; GISEL-NEXT:    orr w8, w8, w9
198 ; GISEL-NEXT:    orr w9, w10, w11
199 ; GISEL-NEXT:    orr w8, w8, w9
200 ; GISEL-NEXT:    and w0, w8, #0x1
201 ; GISEL-NEXT:    ret
202   %or_result = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %a)
203   ret i1 %or_result
206 define i8 @test_redor_v1i8(<1 x i8> %a) {
207 ; CHECK-LABEL: test_redor_v1i8:
208 ; CHECK:       // %bb.0:
209 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
210 ; CHECK-NEXT:    umov w0, v0.b[0]
211 ; CHECK-NEXT:    ret
213 ; GISEL-LABEL: test_redor_v1i8:
214 ; GISEL:       // %bb.0:
215 ; GISEL-NEXT:    fmov x0, d0
216 ; GISEL-NEXT:    // kill: def $w0 killed $w0 killed $x0
217 ; GISEL-NEXT:    ret
218   %or_result = call i8 @llvm.vector.reduce.or.v1i8(<1 x i8> %a)
219   ret i8 %or_result
222 define i8 @test_redor_v3i8(<3 x i8> %a) {
223 ; CHECK-LABEL: test_redor_v3i8:
224 ; CHECK:       // %bb.0:
225 ; CHECK-NEXT:    orr w8, w0, w1
226 ; CHECK-NEXT:    orr w0, w8, w2
227 ; CHECK-NEXT:    ret
229 ; GISEL-LABEL: test_redor_v3i8:
230 ; GISEL:       // %bb.0:
231 ; GISEL-NEXT:    orr w8, w0, w1
232 ; GISEL-NEXT:    orr w0, w8, w2
233 ; GISEL-NEXT:    ret
234   %or_result = call i8 @llvm.vector.reduce.or.v3i8(<3 x i8> %a)
235   ret i8 %or_result
238 define i8 @test_redor_v4i8(<4 x i8> %a) {
239 ; CHECK-LABEL: test_redor_v4i8:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
242 ; CHECK-NEXT:    umov w10, v0.h[1]
243 ; CHECK-NEXT:    umov w11, v0.h[0]
244 ; CHECK-NEXT:    umov w9, v0.h[2]
245 ; CHECK-NEXT:    orr w10, w11, w10
246 ; CHECK-NEXT:    umov w8, v0.h[3]
247 ; CHECK-NEXT:    orr w9, w10, w9
248 ; CHECK-NEXT:    orr w0, w9, w8
249 ; CHECK-NEXT:    ret
251 ; GISEL-LABEL: test_redor_v4i8:
252 ; GISEL:       // %bb.0:
253 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
254 ; GISEL-NEXT:    mov h1, v0.h[1]
255 ; GISEL-NEXT:    mov h2, v0.h[2]
256 ; GISEL-NEXT:    mov h3, v0.h[3]
257 ; GISEL-NEXT:    fmov w8, s0
258 ; GISEL-NEXT:    fmov w9, s1
259 ; GISEL-NEXT:    orr w8, w8, w9
260 ; GISEL-NEXT:    fmov w9, s2
261 ; GISEL-NEXT:    fmov w10, s3
262 ; GISEL-NEXT:    orr w9, w9, w10
263 ; GISEL-NEXT:    orr w0, w8, w9
264 ; GISEL-NEXT:    ret
265   %or_result = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a)
266   ret i8 %or_result
269 define i8 @test_redor_v8i8(<8 x i8> %a) {
270 ; CHECK-LABEL: test_redor_v8i8:
271 ; CHECK:       // %bb.0:
272 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
273 ; CHECK-NEXT:    umov w14, v0.b[1]
274 ; CHECK-NEXT:    umov w15, v0.b[0]
275 ; CHECK-NEXT:    umov w13, v0.b[2]
276 ; CHECK-NEXT:    orr w14, w15, w14
277 ; CHECK-NEXT:    umov w12, v0.b[3]
278 ; CHECK-NEXT:    orr w13, w14, w13
279 ; CHECK-NEXT:    umov w11, v0.b[4]
280 ; CHECK-NEXT:    orr w12, w13, w12
281 ; CHECK-NEXT:    umov w10, v0.b[5]
282 ; CHECK-NEXT:    orr w11, w12, w11
283 ; CHECK-NEXT:    umov w9, v0.b[6]
284 ; CHECK-NEXT:    orr w10, w11, w10
285 ; CHECK-NEXT:    umov w8, v0.b[7]
286 ; CHECK-NEXT:    orr w9, w10, w9
287 ; CHECK-NEXT:    orr w0, w9, w8
288 ; CHECK-NEXT:    ret
290 ; GISEL-LABEL: test_redor_v8i8:
291 ; GISEL:       // %bb.0:
292 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
293 ; GISEL-NEXT:    mov b1, v0.b[1]
294 ; GISEL-NEXT:    mov b2, v0.b[2]
295 ; GISEL-NEXT:    mov b3, v0.b[3]
296 ; GISEL-NEXT:    fmov w8, s0
297 ; GISEL-NEXT:    fmov w9, s1
298 ; GISEL-NEXT:    mov b4, v0.b[4]
299 ; GISEL-NEXT:    mov b5, v0.b[5]
300 ; GISEL-NEXT:    orr w8, w8, w9
301 ; GISEL-NEXT:    fmov w9, s2
302 ; GISEL-NEXT:    fmov w10, s3
303 ; GISEL-NEXT:    mov b6, v0.b[6]
304 ; GISEL-NEXT:    mov b7, v0.b[7]
305 ; GISEL-NEXT:    orr w9, w9, w10
306 ; GISEL-NEXT:    fmov w10, s4
307 ; GISEL-NEXT:    fmov w11, s5
308 ; GISEL-NEXT:    orr w10, w10, w11
309 ; GISEL-NEXT:    fmov w11, s6
310 ; GISEL-NEXT:    fmov w12, s7
311 ; GISEL-NEXT:    orr w11, w11, w12
312 ; GISEL-NEXT:    orr w8, w8, w9
313 ; GISEL-NEXT:    orr w9, w10, w11
314 ; GISEL-NEXT:    orr w0, w8, w9
315 ; GISEL-NEXT:    ret
316   %or_result = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a)
317   ret i8 %or_result
320 define i8 @test_redor_v16i8(<16 x i8> %a) {
321 ; CHECK-LABEL: test_redor_v16i8:
322 ; CHECK:       // %bb.0:
323 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
324 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
325 ; CHECK-NEXT:    umov w8, v0.b[1]
326 ; CHECK-NEXT:    umov w9, v0.b[0]
327 ; CHECK-NEXT:    orr w8, w9, w8
328 ; CHECK-NEXT:    umov w9, v0.b[2]
329 ; CHECK-NEXT:    orr w8, w8, w9
330 ; CHECK-NEXT:    umov w9, v0.b[3]
331 ; CHECK-NEXT:    orr w8, w8, w9
332 ; CHECK-NEXT:    umov w9, v0.b[4]
333 ; CHECK-NEXT:    orr w8, w8, w9
334 ; CHECK-NEXT:    umov w9, v0.b[5]
335 ; CHECK-NEXT:    orr w8, w8, w9
336 ; CHECK-NEXT:    umov w9, v0.b[6]
337 ; CHECK-NEXT:    orr w8, w8, w9
338 ; CHECK-NEXT:    umov w9, v0.b[7]
339 ; CHECK-NEXT:    orr w0, w8, w9
340 ; CHECK-NEXT:    ret
342 ; GISEL-LABEL: test_redor_v16i8:
343 ; GISEL:       // %bb.0:
344 ; GISEL-NEXT:    mov d1, v0.d[1]
345 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
346 ; GISEL-NEXT:    mov b1, v0.b[1]
347 ; GISEL-NEXT:    mov b2, v0.b[2]
348 ; GISEL-NEXT:    mov b3, v0.b[3]
349 ; GISEL-NEXT:    fmov w8, s0
350 ; GISEL-NEXT:    fmov w9, s1
351 ; GISEL-NEXT:    mov b4, v0.b[4]
352 ; GISEL-NEXT:    mov b5, v0.b[5]
353 ; GISEL-NEXT:    orr w8, w8, w9
354 ; GISEL-NEXT:    fmov w9, s2
355 ; GISEL-NEXT:    fmov w10, s3
356 ; GISEL-NEXT:    mov b6, v0.b[6]
357 ; GISEL-NEXT:    mov b7, v0.b[7]
358 ; GISEL-NEXT:    orr w9, w9, w10
359 ; GISEL-NEXT:    fmov w10, s4
360 ; GISEL-NEXT:    fmov w11, s5
361 ; GISEL-NEXT:    orr w10, w10, w11
362 ; GISEL-NEXT:    fmov w11, s6
363 ; GISEL-NEXT:    fmov w12, s7
364 ; GISEL-NEXT:    orr w11, w11, w12
365 ; GISEL-NEXT:    orr w8, w8, w9
366 ; GISEL-NEXT:    orr w9, w10, w11
367 ; GISEL-NEXT:    orr w0, w8, w9
368 ; GISEL-NEXT:    ret
369   %or_result = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a)
370   ret i8 %or_result
373 define i8 @test_redor_v32i8(<32 x i8> %a) {
374 ; CHECK-LABEL: test_redor_v32i8:
375 ; CHECK:       // %bb.0:
376 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
377 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
378 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
379 ; CHECK-NEXT:    umov w8, v0.b[1]
380 ; CHECK-NEXT:    umov w9, v0.b[0]
381 ; CHECK-NEXT:    orr w8, w9, w8
382 ; CHECK-NEXT:    umov w9, v0.b[2]
383 ; CHECK-NEXT:    orr w8, w8, w9
384 ; CHECK-NEXT:    umov w9, v0.b[3]
385 ; CHECK-NEXT:    orr w8, w8, w9
386 ; CHECK-NEXT:    umov w9, v0.b[4]
387 ; CHECK-NEXT:    orr w8, w8, w9
388 ; CHECK-NEXT:    umov w9, v0.b[5]
389 ; CHECK-NEXT:    orr w8, w8, w9
390 ; CHECK-NEXT:    umov w9, v0.b[6]
391 ; CHECK-NEXT:    orr w8, w8, w9
392 ; CHECK-NEXT:    umov w9, v0.b[7]
393 ; CHECK-NEXT:    orr w0, w8, w9
394 ; CHECK-NEXT:    ret
396 ; GISEL-LABEL: test_redor_v32i8:
397 ; GISEL:       // %bb.0:
398 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
399 ; GISEL-NEXT:    mov d1, v0.d[1]
400 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
401 ; GISEL-NEXT:    mov b1, v0.b[1]
402 ; GISEL-NEXT:    mov b2, v0.b[2]
403 ; GISEL-NEXT:    mov b3, v0.b[3]
404 ; GISEL-NEXT:    fmov w8, s0
405 ; GISEL-NEXT:    fmov w9, s1
406 ; GISEL-NEXT:    mov b4, v0.b[4]
407 ; GISEL-NEXT:    mov b5, v0.b[5]
408 ; GISEL-NEXT:    orr w8, w8, w9
409 ; GISEL-NEXT:    fmov w9, s2
410 ; GISEL-NEXT:    fmov w10, s3
411 ; GISEL-NEXT:    mov b6, v0.b[6]
412 ; GISEL-NEXT:    mov b7, v0.b[7]
413 ; GISEL-NEXT:    orr w9, w9, w10
414 ; GISEL-NEXT:    fmov w10, s4
415 ; GISEL-NEXT:    fmov w11, s5
416 ; GISEL-NEXT:    orr w10, w10, w11
417 ; GISEL-NEXT:    fmov w11, s6
418 ; GISEL-NEXT:    fmov w12, s7
419 ; GISEL-NEXT:    orr w11, w11, w12
420 ; GISEL-NEXT:    orr w8, w8, w9
421 ; GISEL-NEXT:    orr w9, w10, w11
422 ; GISEL-NEXT:    orr w0, w8, w9
423 ; GISEL-NEXT:    ret
424   %or_result = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a)
425   ret i8 %or_result
428 define i16 @test_redor_v4i16(<4 x i16> %a) {
429 ; CHECK-LABEL: test_redor_v4i16:
430 ; CHECK:       // %bb.0:
431 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
432 ; CHECK-NEXT:    umov w10, v0.h[1]
433 ; CHECK-NEXT:    umov w11, v0.h[0]
434 ; CHECK-NEXT:    umov w9, v0.h[2]
435 ; CHECK-NEXT:    orr w10, w11, w10
436 ; CHECK-NEXT:    umov w8, v0.h[3]
437 ; CHECK-NEXT:    orr w9, w10, w9
438 ; CHECK-NEXT:    orr w0, w9, w8
439 ; CHECK-NEXT:    ret
441 ; GISEL-LABEL: test_redor_v4i16:
442 ; GISEL:       // %bb.0:
443 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
444 ; GISEL-NEXT:    mov h1, v0.h[1]
445 ; GISEL-NEXT:    mov h2, v0.h[2]
446 ; GISEL-NEXT:    mov h3, v0.h[3]
447 ; GISEL-NEXT:    fmov w8, s0
448 ; GISEL-NEXT:    fmov w9, s1
449 ; GISEL-NEXT:    orr w8, w8, w9
450 ; GISEL-NEXT:    fmov w9, s2
451 ; GISEL-NEXT:    fmov w10, s3
452 ; GISEL-NEXT:    orr w9, w9, w10
453 ; GISEL-NEXT:    orr w0, w8, w9
454 ; GISEL-NEXT:    ret
455   %or_result = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a)
456   ret i16 %or_result
459 define i16 @test_redor_v8i16(<8 x i16> %a) {
460 ; CHECK-LABEL: test_redor_v8i16:
461 ; CHECK:       // %bb.0:
462 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
463 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
464 ; CHECK-NEXT:    umov w8, v0.h[1]
465 ; CHECK-NEXT:    umov w9, v0.h[0]
466 ; CHECK-NEXT:    umov w10, v0.h[2]
467 ; CHECK-NEXT:    orr w8, w9, w8
468 ; CHECK-NEXT:    orr w8, w8, w10
469 ; CHECK-NEXT:    umov w9, v0.h[3]
470 ; CHECK-NEXT:    orr w0, w8, w9
471 ; CHECK-NEXT:    ret
473 ; GISEL-LABEL: test_redor_v8i16:
474 ; GISEL:       // %bb.0:
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:    orr w8, w8, w9
483 ; GISEL-NEXT:    fmov w9, s2
484 ; GISEL-NEXT:    fmov w10, s3
485 ; GISEL-NEXT:    orr w9, w9, w10
486 ; GISEL-NEXT:    orr w0, w8, w9
487 ; GISEL-NEXT:    ret
488   %or_result = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a)
489   ret i16 %or_result
492 define i16 @test_redor_v16i16(<16 x i16> %a) {
493 ; CHECK-LABEL: test_redor_v16i16:
494 ; CHECK:       // %bb.0:
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:    umov w8, v0.h[1]
499 ; CHECK-NEXT:    umov w9, v0.h[0]
500 ; CHECK-NEXT:    umov w10, v0.h[2]
501 ; CHECK-NEXT:    orr w8, w9, w8
502 ; CHECK-NEXT:    orr w8, w8, w10
503 ; CHECK-NEXT:    umov w9, v0.h[3]
504 ; CHECK-NEXT:    orr w0, w8, w9
505 ; CHECK-NEXT:    ret
507 ; GISEL-LABEL: test_redor_v16i16:
508 ; GISEL:       // %bb.0:
509 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
510 ; GISEL-NEXT:    mov d1, v0.d[1]
511 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
512 ; GISEL-NEXT:    mov h1, v0.h[1]
513 ; GISEL-NEXT:    mov h2, v0.h[2]
514 ; GISEL-NEXT:    mov h3, v0.h[3]
515 ; GISEL-NEXT:    fmov w8, s0
516 ; GISEL-NEXT:    fmov w9, s1
517 ; GISEL-NEXT:    orr w8, w8, w9
518 ; GISEL-NEXT:    fmov w9, s2
519 ; GISEL-NEXT:    fmov w10, s3
520 ; GISEL-NEXT:    orr w9, w9, w10
521 ; GISEL-NEXT:    orr w0, w8, w9
522 ; GISEL-NEXT:    ret
523   %or_result = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a)
524   ret i16 %or_result
527 define i32 @test_redor_v2i32(<2 x i32> %a) {
528 ; CHECK-LABEL: test_redor_v2i32:
529 ; CHECK:       // %bb.0:
530 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
531 ; CHECK-NEXT:    mov w8, v0.s[1]
532 ; CHECK-NEXT:    fmov w9, s0
533 ; CHECK-NEXT:    orr w0, w9, w8
534 ; CHECK-NEXT:    ret
536 ; GISEL-LABEL: test_redor_v2i32:
537 ; GISEL:       // %bb.0:
538 ; GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
539 ; GISEL-NEXT:    mov s1, v0.s[1]
540 ; GISEL-NEXT:    fmov w8, s0
541 ; GISEL-NEXT:    fmov w9, s1
542 ; GISEL-NEXT:    orr w0, w8, w9
543 ; GISEL-NEXT:    ret
544   %or_result = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a)
545   ret i32 %or_result
548 define i32 @test_redor_v4i32(<4 x i32> %a) {
549 ; CHECK-LABEL: test_redor_v4i32:
550 ; CHECK:       // %bb.0:
551 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
552 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
553 ; CHECK-NEXT:    mov w8, v0.s[1]
554 ; CHECK-NEXT:    fmov w9, s0
555 ; CHECK-NEXT:    orr w0, w9, w8
556 ; CHECK-NEXT:    ret
558 ; GISEL-LABEL: test_redor_v4i32:
559 ; GISEL:       // %bb.0:
560 ; GISEL-NEXT:    mov d1, v0.d[1]
561 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
562 ; GISEL-NEXT:    mov s1, v0.s[1]
563 ; GISEL-NEXT:    fmov w8, s0
564 ; GISEL-NEXT:    fmov w9, s1
565 ; GISEL-NEXT:    orr w0, w8, w9
566 ; GISEL-NEXT:    ret
567   %or_result = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a)
568   ret i32 %or_result
571 define i32 @test_redor_v8i32(<8 x i32> %a) {
572 ; CHECK-LABEL: test_redor_v8i32:
573 ; CHECK:       // %bb.0:
574 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
575 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
576 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
577 ; CHECK-NEXT:    mov w8, v0.s[1]
578 ; CHECK-NEXT:    fmov w9, s0
579 ; CHECK-NEXT:    orr w0, w9, w8
580 ; CHECK-NEXT:    ret
582 ; GISEL-LABEL: test_redor_v8i32:
583 ; GISEL:       // %bb.0:
584 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
585 ; GISEL-NEXT:    mov d1, v0.d[1]
586 ; GISEL-NEXT:    orr v0.8b, v0.8b, v1.8b
587 ; GISEL-NEXT:    mov s1, v0.s[1]
588 ; GISEL-NEXT:    fmov w8, s0
589 ; GISEL-NEXT:    fmov w9, s1
590 ; GISEL-NEXT:    orr w0, w8, w9
591 ; GISEL-NEXT:    ret
592   %or_result = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a)
593   ret i32 %or_result
596 define i64 @test_redor_v2i64(<2 x i64> %a) {
597 ; CHECK-LABEL: test_redor_v2i64:
598 ; CHECK:       // %bb.0:
599 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
600 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
601 ; CHECK-NEXT:    fmov x0, d0
602 ; CHECK-NEXT:    ret
604 ; GISEL-LABEL: test_redor_v2i64:
605 ; GISEL:       // %bb.0:
606 ; GISEL-NEXT:    mov d1, v0.d[1]
607 ; GISEL-NEXT:    fmov x8, d0
608 ; GISEL-NEXT:    fmov x9, d1
609 ; GISEL-NEXT:    orr x0, x8, x9
610 ; GISEL-NEXT:    ret
611   %or_result = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a)
612   ret i64 %or_result
615 define i64 @test_redor_v4i64(<4 x i64> %a) {
616 ; CHECK-LABEL: test_redor_v4i64:
617 ; CHECK:       // %bb.0:
618 ; CHECK-NEXT:    orr v0.16b, v0.16b, v1.16b
619 ; CHECK-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
620 ; CHECK-NEXT:    orr v0.8b, v0.8b, v1.8b
621 ; CHECK-NEXT:    fmov x0, d0
622 ; CHECK-NEXT:    ret
624 ; GISEL-LABEL: test_redor_v4i64:
625 ; GISEL:       // %bb.0:
626 ; GISEL-NEXT:    orr v0.16b, v0.16b, v1.16b
627 ; GISEL-NEXT:    mov d1, v0.d[1]
628 ; GISEL-NEXT:    fmov x8, d0
629 ; GISEL-NEXT:    fmov x9, d1
630 ; GISEL-NEXT:    orr x0, x8, x9
631 ; GISEL-NEXT:    ret
632   %or_result = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a)
633   ret i64 %or_result
636 declare i1 @llvm.vector.reduce.or.v1i1(<1 x i1>)
637 declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
638 declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)
639 declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)
640 declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)
641 declare i64 @llvm.vector.reduce.or.v2i64(<2 x i64>)
642 declare i64 @llvm.vector.reduce.or.v4i64(<4 x i64>)
643 declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
644 declare i32 @llvm.vector.reduce.or.v4i32(<4 x i32>)
645 declare i32 @llvm.vector.reduce.or.v8i32(<8 x i32>)
646 declare i16 @llvm.vector.reduce.or.v4i16(<4 x i16>)
647 declare i16 @llvm.vector.reduce.or.v8i16(<8 x i16>)
648 declare i16 @llvm.vector.reduce.or.v16i16(<16 x i16>)
649 declare i8 @llvm.vector.reduce.or.v1i8(<1 x i8>)
650 declare i8 @llvm.vector.reduce.or.v3i8(<3 x i8>)
651 declare i8 @llvm.vector.reduce.or.v4i8(<4 x i8>)
652 declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
653 declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
654 declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)