xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vreductions-mask.ll (revision 95b6524e5c84169ecf404f755aeab2202e9916ea)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s
4
5declare i1 @llvm.vector.reduce.or.v1i1(<1 x i1>)
6
7define zeroext i1 @vreduce_or_v1i1(<1 x i1> %v) {
8; CHECK-LABEL: vreduce_or_v1i1:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
11; CHECK-NEXT:    vfirst.m a0, v0
12; CHECK-NEXT:    seqz a0, a0
13; CHECK-NEXT:    ret
14  %red = call i1 @llvm.vector.reduce.or.v1i1(<1 x i1> %v)
15  ret i1 %red
16}
17
18declare i1 @llvm.vector.reduce.xor.v1i1(<1 x i1>)
19
20define zeroext i1 @vreduce_xor_v1i1(<1 x i1> %v) {
21; CHECK-LABEL: vreduce_xor_v1i1:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
24; CHECK-NEXT:    vfirst.m a0, v0
25; CHECK-NEXT:    seqz a0, a0
26; CHECK-NEXT:    ret
27  %red = call i1 @llvm.vector.reduce.xor.v1i1(<1 x i1> %v)
28  ret i1 %red
29}
30
31declare i1 @llvm.vector.reduce.and.v1i1(<1 x i1>)
32
33define zeroext i1 @vreduce_and_v1i1(<1 x i1> %v) {
34; CHECK-LABEL: vreduce_and_v1i1:
35; CHECK:       # %bb.0:
36; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
37; CHECK-NEXT:    vfirst.m a0, v0
38; CHECK-NEXT:    seqz a0, a0
39; CHECK-NEXT:    ret
40  %red = call i1 @llvm.vector.reduce.and.v1i1(<1 x i1> %v)
41  ret i1 %red
42}
43
44declare i1 @llvm.vector.reduce.umax.v1i1(<1 x i1>)
45
46define zeroext i1 @vreduce_umax_v1i1(<1 x i1> %v) {
47; CHECK-LABEL: vreduce_umax_v1i1:
48; CHECK:       # %bb.0:
49; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
50; CHECK-NEXT:    vfirst.m a0, v0
51; CHECK-NEXT:    seqz a0, a0
52; CHECK-NEXT:    ret
53  %red = call i1 @llvm.vector.reduce.umax.v1i1(<1 x i1> %v)
54  ret i1 %red
55}
56
57declare i1 @llvm.vector.reduce.smax.v1i1(<1 x i1>)
58
59define zeroext i1 @vreduce_smax_v1i1(<1 x i1> %v) {
60; CHECK-LABEL: vreduce_smax_v1i1:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
63; CHECK-NEXT:    vfirst.m a0, v0
64; CHECK-NEXT:    seqz a0, a0
65; CHECK-NEXT:    ret
66  %red = call i1 @llvm.vector.reduce.smax.v1i1(<1 x i1> %v)
67  ret i1 %red
68}
69
70declare i1 @llvm.vector.reduce.umin.v1i1(<1 x i1>)
71
72define zeroext i1 @vreduce_umin_v1i1(<1 x i1> %v) {
73; CHECK-LABEL: vreduce_umin_v1i1:
74; CHECK:       # %bb.0:
75; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
76; CHECK-NEXT:    vfirst.m a0, v0
77; CHECK-NEXT:    seqz a0, a0
78; CHECK-NEXT:    ret
79  %red = call i1 @llvm.vector.reduce.umin.v1i1(<1 x i1> %v)
80  ret i1 %red
81}
82
83declare i1 @llvm.vector.reduce.smin.v1i1(<1 x i1>)
84
85define zeroext i1 @vreduce_smin_v1i1(<1 x i1> %v) {
86; CHECK-LABEL: vreduce_smin_v1i1:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
89; CHECK-NEXT:    vfirst.m a0, v0
90; CHECK-NEXT:    seqz a0, a0
91; CHECK-NEXT:    ret
92  %red = call i1 @llvm.vector.reduce.smin.v1i1(<1 x i1> %v)
93  ret i1 %red
94}
95
96declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)
97
98define zeroext i1 @vreduce_or_v2i1(<2 x i1> %v) {
99; CHECK-LABEL: vreduce_or_v2i1:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
102; CHECK-NEXT:    vcpop.m a0, v0
103; CHECK-NEXT:    snez a0, a0
104; CHECK-NEXT:    ret
105  %red = call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %v)
106  ret i1 %red
107}
108
109declare i1 @llvm.vector.reduce.xor.v2i1(<2 x i1>)
110
111define zeroext i1 @vreduce_xor_v2i1(<2 x i1> %v) {
112; CHECK-LABEL: vreduce_xor_v2i1:
113; CHECK:       # %bb.0:
114; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
115; CHECK-NEXT:    vcpop.m a0, v0
116; CHECK-NEXT:    andi a0, a0, 1
117; CHECK-NEXT:    ret
118  %red = call i1 @llvm.vector.reduce.xor.v2i1(<2 x i1> %v)
119  ret i1 %red
120}
121
122declare i1 @llvm.vector.reduce.and.v2i1(<2 x i1>)
123
124define zeroext i1 @vreduce_and_v2i1(<2 x i1> %v) {
125; CHECK-LABEL: vreduce_and_v2i1:
126; CHECK:       # %bb.0:
127; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
128; CHECK-NEXT:    vmnot.m v8, v0
129; CHECK-NEXT:    vcpop.m a0, v8
130; CHECK-NEXT:    seqz a0, a0
131; CHECK-NEXT:    ret
132  %red = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %v)
133  ret i1 %red
134}
135
136declare i1 @llvm.vector.reduce.umax.v2i1(<2 x i1>)
137
138define zeroext i1 @vreduce_umax_v2i1(<2 x i1> %v) {
139; CHECK-LABEL: vreduce_umax_v2i1:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
142; CHECK-NEXT:    vcpop.m a0, v0
143; CHECK-NEXT:    snez a0, a0
144; CHECK-NEXT:    ret
145  %red = call i1 @llvm.vector.reduce.umax.v2i1(<2 x i1> %v)
146  ret i1 %red
147}
148
149declare i1 @llvm.vector.reduce.smax.v2i1(<2 x i1>)
150
151define zeroext i1 @vreduce_smax_v2i1(<2 x i1> %v) {
152; CHECK-LABEL: vreduce_smax_v2i1:
153; CHECK:       # %bb.0:
154; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
155; CHECK-NEXT:    vmnot.m v8, v0
156; CHECK-NEXT:    vcpop.m a0, v8
157; CHECK-NEXT:    seqz a0, a0
158; CHECK-NEXT:    ret
159  %red = call i1 @llvm.vector.reduce.smax.v2i1(<2 x i1> %v)
160  ret i1 %red
161}
162
163declare i1 @llvm.vector.reduce.umin.v2i1(<2 x i1>)
164
165define zeroext i1 @vreduce_umin_v2i1(<2 x i1> %v) {
166; CHECK-LABEL: vreduce_umin_v2i1:
167; CHECK:       # %bb.0:
168; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
169; CHECK-NEXT:    vmnot.m v8, v0
170; CHECK-NEXT:    vcpop.m a0, v8
171; CHECK-NEXT:    seqz a0, a0
172; CHECK-NEXT:    ret
173  %red = call i1 @llvm.vector.reduce.umin.v2i1(<2 x i1> %v)
174  ret i1 %red
175}
176
177declare i1 @llvm.vector.reduce.smin.v2i1(<2 x i1>)
178
179define zeroext i1 @vreduce_smin_v2i1(<2 x i1> %v) {
180; CHECK-LABEL: vreduce_smin_v2i1:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
183; CHECK-NEXT:    vcpop.m a0, v0
184; CHECK-NEXT:    snez a0, a0
185; CHECK-NEXT:    ret
186  %red = call i1 @llvm.vector.reduce.smin.v2i1(<2 x i1> %v)
187  ret i1 %red
188}
189
190declare i1 @llvm.vector.reduce.or.v4i1(<4 x i1>)
191
192define zeroext i1 @vreduce_or_v4i1(<4 x i1> %v) {
193; CHECK-LABEL: vreduce_or_v4i1:
194; CHECK:       # %bb.0:
195; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
196; CHECK-NEXT:    vcpop.m a0, v0
197; CHECK-NEXT:    snez a0, a0
198; CHECK-NEXT:    ret
199  %red = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> %v)
200  ret i1 %red
201}
202
203declare i1 @llvm.vector.reduce.xor.v4i1(<4 x i1>)
204
205define zeroext i1 @vreduce_xor_v4i1(<4 x i1> %v) {
206; CHECK-LABEL: vreduce_xor_v4i1:
207; CHECK:       # %bb.0:
208; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
209; CHECK-NEXT:    vcpop.m a0, v0
210; CHECK-NEXT:    andi a0, a0, 1
211; CHECK-NEXT:    ret
212  %red = call i1 @llvm.vector.reduce.xor.v4i1(<4 x i1> %v)
213  ret i1 %red
214}
215
216declare i1 @llvm.vector.reduce.and.v4i1(<4 x i1>)
217
218define zeroext i1 @vreduce_and_v4i1(<4 x i1> %v) {
219; CHECK-LABEL: vreduce_and_v4i1:
220; CHECK:       # %bb.0:
221; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
222; CHECK-NEXT:    vmnot.m v8, v0
223; CHECK-NEXT:    vcpop.m a0, v8
224; CHECK-NEXT:    seqz a0, a0
225; CHECK-NEXT:    ret
226  %red = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %v)
227  ret i1 %red
228}
229
230declare i1 @llvm.vector.reduce.umax.v4i1(<4 x i1>)
231
232define zeroext i1 @vreduce_umax_v4i1(<4 x i1> %v) {
233; CHECK-LABEL: vreduce_umax_v4i1:
234; CHECK:       # %bb.0:
235; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
236; CHECK-NEXT:    vcpop.m a0, v0
237; CHECK-NEXT:    snez a0, a0
238; CHECK-NEXT:    ret
239  %red = call i1 @llvm.vector.reduce.umax.v4i1(<4 x i1> %v)
240  ret i1 %red
241}
242
243declare i1 @llvm.vector.reduce.smax.v4i1(<4 x i1>)
244
245define zeroext i1 @vreduce_smax_v4i1(<4 x i1> %v) {
246; CHECK-LABEL: vreduce_smax_v4i1:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
249; CHECK-NEXT:    vmnot.m v8, v0
250; CHECK-NEXT:    vcpop.m a0, v8
251; CHECK-NEXT:    seqz a0, a0
252; CHECK-NEXT:    ret
253  %red = call i1 @llvm.vector.reduce.smax.v4i1(<4 x i1> %v)
254  ret i1 %red
255}
256
257declare i1 @llvm.vector.reduce.umin.v4i1(<4 x i1>)
258
259define zeroext i1 @vreduce_umin_v4i1(<4 x i1> %v) {
260; CHECK-LABEL: vreduce_umin_v4i1:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
263; CHECK-NEXT:    vmnot.m v8, v0
264; CHECK-NEXT:    vcpop.m a0, v8
265; CHECK-NEXT:    seqz a0, a0
266; CHECK-NEXT:    ret
267  %red = call i1 @llvm.vector.reduce.umin.v4i1(<4 x i1> %v)
268  ret i1 %red
269}
270
271declare i1 @llvm.vector.reduce.smin.v4i1(<4 x i1>)
272
273define zeroext i1 @vreduce_smin_v4i1(<4 x i1> %v) {
274; CHECK-LABEL: vreduce_smin_v4i1:
275; CHECK:       # %bb.0:
276; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
277; CHECK-NEXT:    vcpop.m a0, v0
278; CHECK-NEXT:    snez a0, a0
279; CHECK-NEXT:    ret
280  %red = call i1 @llvm.vector.reduce.smin.v4i1(<4 x i1> %v)
281  ret i1 %red
282}
283
284declare i1 @llvm.vector.reduce.or.v8i1(<8 x i1>)
285
286define zeroext i1 @vreduce_or_v8i1(<8 x i1> %v) {
287; CHECK-LABEL: vreduce_or_v8i1:
288; CHECK:       # %bb.0:
289; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
290; CHECK-NEXT:    vcpop.m a0, v0
291; CHECK-NEXT:    snez a0, a0
292; CHECK-NEXT:    ret
293  %red = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> %v)
294  ret i1 %red
295}
296
297declare i1 @llvm.vector.reduce.xor.v8i1(<8 x i1>)
298
299define zeroext i1 @vreduce_xor_v8i1(<8 x i1> %v) {
300; CHECK-LABEL: vreduce_xor_v8i1:
301; CHECK:       # %bb.0:
302; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
303; CHECK-NEXT:    vcpop.m a0, v0
304; CHECK-NEXT:    andi a0, a0, 1
305; CHECK-NEXT:    ret
306  %red = call i1 @llvm.vector.reduce.xor.v8i1(<8 x i1> %v)
307  ret i1 %red
308}
309
310declare i1 @llvm.vector.reduce.and.v8i1(<8 x i1>)
311
312define zeroext i1 @vreduce_and_v8i1(<8 x i1> %v) {
313; CHECK-LABEL: vreduce_and_v8i1:
314; CHECK:       # %bb.0:
315; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
316; CHECK-NEXT:    vmnot.m v8, v0
317; CHECK-NEXT:    vcpop.m a0, v8
318; CHECK-NEXT:    seqz a0, a0
319; CHECK-NEXT:    ret
320  %red = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %v)
321  ret i1 %red
322}
323
324declare i1 @llvm.vector.reduce.umax.v8i1(<8 x i1>)
325
326define zeroext i1 @vreduce_umax_v8i1(<8 x i1> %v) {
327; CHECK-LABEL: vreduce_umax_v8i1:
328; CHECK:       # %bb.0:
329; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
330; CHECK-NEXT:    vcpop.m a0, v0
331; CHECK-NEXT:    snez a0, a0
332; CHECK-NEXT:    ret
333  %red = call i1 @llvm.vector.reduce.umax.v8i1(<8 x i1> %v)
334  ret i1 %red
335}
336
337declare i1 @llvm.vector.reduce.smax.v8i1(<8 x i1>)
338
339define zeroext i1 @vreduce_smax_v8i1(<8 x i1> %v) {
340; CHECK-LABEL: vreduce_smax_v8i1:
341; CHECK:       # %bb.0:
342; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
343; CHECK-NEXT:    vmnot.m v8, v0
344; CHECK-NEXT:    vcpop.m a0, v8
345; CHECK-NEXT:    seqz a0, a0
346; CHECK-NEXT:    ret
347  %red = call i1 @llvm.vector.reduce.smax.v8i1(<8 x i1> %v)
348  ret i1 %red
349}
350
351declare i1 @llvm.vector.reduce.umin.v8i1(<8 x i1>)
352
353define zeroext i1 @vreduce_umin_v8i1(<8 x i1> %v) {
354; CHECK-LABEL: vreduce_umin_v8i1:
355; CHECK:       # %bb.0:
356; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
357; CHECK-NEXT:    vmnot.m v8, v0
358; CHECK-NEXT:    vcpop.m a0, v8
359; CHECK-NEXT:    seqz a0, a0
360; CHECK-NEXT:    ret
361  %red = call i1 @llvm.vector.reduce.umin.v8i1(<8 x i1> %v)
362  ret i1 %red
363}
364
365declare i1 @llvm.vector.reduce.smin.v8i1(<8 x i1>)
366
367define zeroext i1 @vreduce_smin_v8i1(<8 x i1> %v) {
368; CHECK-LABEL: vreduce_smin_v8i1:
369; CHECK:       # %bb.0:
370; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
371; CHECK-NEXT:    vcpop.m a0, v0
372; CHECK-NEXT:    snez a0, a0
373; CHECK-NEXT:    ret
374  %red = call i1 @llvm.vector.reduce.smin.v8i1(<8 x i1> %v)
375  ret i1 %red
376}
377
378declare i1 @llvm.vector.reduce.or.v16i1(<16 x i1>)
379
380define zeroext i1 @vreduce_or_v16i1(<16 x i1> %v) {
381; CHECK-LABEL: vreduce_or_v16i1:
382; CHECK:       # %bb.0:
383; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
384; CHECK-NEXT:    vcpop.m a0, v0
385; CHECK-NEXT:    snez a0, a0
386; CHECK-NEXT:    ret
387  %red = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> %v)
388  ret i1 %red
389}
390
391declare i1 @llvm.vector.reduce.xor.v16i1(<16 x i1>)
392
393define zeroext i1 @vreduce_xor_v16i1(<16 x i1> %v) {
394; CHECK-LABEL: vreduce_xor_v16i1:
395; CHECK:       # %bb.0:
396; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
397; CHECK-NEXT:    vcpop.m a0, v0
398; CHECK-NEXT:    andi a0, a0, 1
399; CHECK-NEXT:    ret
400  %red = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %v)
401  ret i1 %red
402}
403
404declare i1 @llvm.vector.reduce.and.v16i1(<16 x i1>)
405
406define zeroext i1 @vreduce_and_v16i1(<16 x i1> %v) {
407; CHECK-LABEL: vreduce_and_v16i1:
408; CHECK:       # %bb.0:
409; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
410; CHECK-NEXT:    vmnot.m v8, v0
411; CHECK-NEXT:    vcpop.m a0, v8
412; CHECK-NEXT:    seqz a0, a0
413; CHECK-NEXT:    ret
414  %red = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %v)
415  ret i1 %red
416}
417
418declare i1 @llvm.vector.reduce.umax.v16i1(<16 x i1>)
419
420define zeroext i1 @vreduce_umax_v16i1(<16 x i1> %v) {
421; CHECK-LABEL: vreduce_umax_v16i1:
422; CHECK:       # %bb.0:
423; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
424; CHECK-NEXT:    vcpop.m a0, v0
425; CHECK-NEXT:    snez a0, a0
426; CHECK-NEXT:    ret
427  %red = call i1 @llvm.vector.reduce.umax.v16i1(<16 x i1> %v)
428  ret i1 %red
429}
430
431declare i1 @llvm.vector.reduce.smax.v16i1(<16 x i1>)
432
433define zeroext i1 @vreduce_smax_v16i1(<16 x i1> %v) {
434; CHECK-LABEL: vreduce_smax_v16i1:
435; CHECK:       # %bb.0:
436; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
437; CHECK-NEXT:    vmnot.m v8, v0
438; CHECK-NEXT:    vcpop.m a0, v8
439; CHECK-NEXT:    seqz a0, a0
440; CHECK-NEXT:    ret
441  %red = call i1 @llvm.vector.reduce.smax.v16i1(<16 x i1> %v)
442  ret i1 %red
443}
444
445declare i1 @llvm.vector.reduce.umin.v16i1(<16 x i1>)
446
447define zeroext i1 @vreduce_umin_v16i1(<16 x i1> %v) {
448; CHECK-LABEL: vreduce_umin_v16i1:
449; CHECK:       # %bb.0:
450; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
451; CHECK-NEXT:    vmnot.m v8, v0
452; CHECK-NEXT:    vcpop.m a0, v8
453; CHECK-NEXT:    seqz a0, a0
454; CHECK-NEXT:    ret
455  %red = call i1 @llvm.vector.reduce.umin.v16i1(<16 x i1> %v)
456  ret i1 %red
457}
458
459declare i1 @llvm.vector.reduce.smin.v16i1(<16 x i1>)
460
461define zeroext i1 @vreduce_smin_v16i1(<16 x i1> %v) {
462; CHECK-LABEL: vreduce_smin_v16i1:
463; CHECK:       # %bb.0:
464; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
465; CHECK-NEXT:    vcpop.m a0, v0
466; CHECK-NEXT:    snez a0, a0
467; CHECK-NEXT:    ret
468  %red = call i1 @llvm.vector.reduce.smin.v16i1(<16 x i1> %v)
469  ret i1 %red
470}
471
472declare i1 @llvm.vector.reduce.or.v32i1(<32 x i1>)
473
474define zeroext i1 @vreduce_or_v32i1(<32 x i1> %v) {
475; CHECK-LABEL: vreduce_or_v32i1:
476; CHECK:       # %bb.0:
477; CHECK-NEXT:    li a0, 32
478; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
479; CHECK-NEXT:    vcpop.m a0, v0
480; CHECK-NEXT:    snez a0, a0
481; CHECK-NEXT:    ret
482  %red = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> %v)
483  ret i1 %red
484}
485
486declare i1 @llvm.vector.reduce.xor.v32i1(<32 x i1>)
487
488define zeroext i1 @vreduce_xor_v32i1(<32 x i1> %v) {
489; CHECK-LABEL: vreduce_xor_v32i1:
490; CHECK:       # %bb.0:
491; CHECK-NEXT:    li a0, 32
492; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
493; CHECK-NEXT:    vcpop.m a0, v0
494; CHECK-NEXT:    andi a0, a0, 1
495; CHECK-NEXT:    ret
496  %red = call i1 @llvm.vector.reduce.xor.v32i1(<32 x i1> %v)
497  ret i1 %red
498}
499
500declare i1 @llvm.vector.reduce.and.v32i1(<32 x i1>)
501
502define zeroext i1 @vreduce_and_v32i1(<32 x i1> %v) {
503; CHECK-LABEL: vreduce_and_v32i1:
504; CHECK:       # %bb.0:
505; CHECK-NEXT:    li a0, 32
506; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
507; CHECK-NEXT:    vmnot.m v8, v0
508; CHECK-NEXT:    vcpop.m a0, v8
509; CHECK-NEXT:    seqz a0, a0
510; CHECK-NEXT:    ret
511  %red = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %v)
512  ret i1 %red
513}
514
515declare i1 @llvm.vector.reduce.umax.v32i1(<32 x i1>)
516
517define zeroext i1 @vreduce_umax_v32i1(<32 x i1> %v) {
518; CHECK-LABEL: vreduce_umax_v32i1:
519; CHECK:       # %bb.0:
520; CHECK-NEXT:    li a0, 32
521; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
522; CHECK-NEXT:    vcpop.m a0, v0
523; CHECK-NEXT:    snez a0, a0
524; CHECK-NEXT:    ret
525  %red = call i1 @llvm.vector.reduce.umax.v32i1(<32 x i1> %v)
526  ret i1 %red
527}
528
529declare i1 @llvm.vector.reduce.smax.v32i1(<32 x i1>)
530
531define zeroext i1 @vreduce_smax_v32i1(<32 x i1> %v) {
532; CHECK-LABEL: vreduce_smax_v32i1:
533; CHECK:       # %bb.0:
534; CHECK-NEXT:    li a0, 32
535; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
536; CHECK-NEXT:    vmnot.m v8, v0
537; CHECK-NEXT:    vcpop.m a0, v8
538; CHECK-NEXT:    seqz a0, a0
539; CHECK-NEXT:    ret
540  %red = call i1 @llvm.vector.reduce.smax.v32i1(<32 x i1> %v)
541  ret i1 %red
542}
543
544declare i1 @llvm.vector.reduce.umin.v32i1(<32 x i1>)
545
546define zeroext i1 @vreduce_umin_v32i1(<32 x i1> %v) {
547; CHECK-LABEL: vreduce_umin_v32i1:
548; CHECK:       # %bb.0:
549; CHECK-NEXT:    li a0, 32
550; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
551; CHECK-NEXT:    vmnot.m v8, v0
552; CHECK-NEXT:    vcpop.m a0, v8
553; CHECK-NEXT:    seqz a0, a0
554; CHECK-NEXT:    ret
555  %red = call i1 @llvm.vector.reduce.umin.v32i1(<32 x i1> %v)
556  ret i1 %red
557}
558
559declare i1 @llvm.vector.reduce.smin.v32i1(<32 x i1>)
560
561define zeroext i1 @vreduce_smin_v32i1(<32 x i1> %v) {
562; CHECK-LABEL: vreduce_smin_v32i1:
563; CHECK:       # %bb.0:
564; CHECK-NEXT:    li a0, 32
565; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
566; CHECK-NEXT:    vcpop.m a0, v0
567; CHECK-NEXT:    snez a0, a0
568; CHECK-NEXT:    ret
569  %red = call i1 @llvm.vector.reduce.smin.v32i1(<32 x i1> %v)
570  ret i1 %red
571}
572
573declare i1 @llvm.vector.reduce.or.v64i1(<64 x i1>)
574
575define zeroext i1 @vreduce_or_v64i1(<64 x i1> %v) {
576; CHECK-LABEL: vreduce_or_v64i1:
577; CHECK:       # %bb.0:
578; CHECK-NEXT:    li a0, 64
579; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
580; CHECK-NEXT:    vcpop.m a0, v0
581; CHECK-NEXT:    snez a0, a0
582; CHECK-NEXT:    ret
583  %red = call i1 @llvm.vector.reduce.or.v64i1(<64 x i1> %v)
584  ret i1 %red
585}
586
587declare i1 @llvm.vector.reduce.xor.v64i1(<64 x i1>)
588
589define zeroext i1 @vreduce_xor_v64i1(<64 x i1> %v) {
590; CHECK-LABEL: vreduce_xor_v64i1:
591; CHECK:       # %bb.0:
592; CHECK-NEXT:    li a0, 64
593; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
594; CHECK-NEXT:    vcpop.m a0, v0
595; CHECK-NEXT:    andi a0, a0, 1
596; CHECK-NEXT:    ret
597  %red = call i1 @llvm.vector.reduce.xor.v64i1(<64 x i1> %v)
598  ret i1 %red
599}
600
601declare i1 @llvm.vector.reduce.and.v64i1(<64 x i1>)
602
603define zeroext i1 @vreduce_and_v64i1(<64 x i1> %v) {
604; CHECK-LABEL: vreduce_and_v64i1:
605; CHECK:       # %bb.0:
606; CHECK-NEXT:    li a0, 64
607; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
608; CHECK-NEXT:    vmnot.m v8, v0
609; CHECK-NEXT:    vcpop.m a0, v8
610; CHECK-NEXT:    seqz a0, a0
611; CHECK-NEXT:    ret
612  %red = call i1 @llvm.vector.reduce.and.v64i1(<64 x i1> %v)
613  ret i1 %red
614}
615
616declare i1 @llvm.vector.reduce.umax.v64i1(<64 x i1>)
617
618define zeroext i1 @vreduce_umax_v64i1(<64 x i1> %v) {
619; CHECK-LABEL: vreduce_umax_v64i1:
620; CHECK:       # %bb.0:
621; CHECK-NEXT:    li a0, 64
622; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
623; CHECK-NEXT:    vcpop.m a0, v0
624; CHECK-NEXT:    snez a0, a0
625; CHECK-NEXT:    ret
626  %red = call i1 @llvm.vector.reduce.umax.v64i1(<64 x i1> %v)
627  ret i1 %red
628}
629
630declare i1 @llvm.vector.reduce.smax.v64i1(<64 x i1>)
631
632define zeroext i1 @vreduce_smax_v64i1(<64 x i1> %v) {
633; CHECK-LABEL: vreduce_smax_v64i1:
634; CHECK:       # %bb.0:
635; CHECK-NEXT:    li a0, 64
636; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
637; CHECK-NEXT:    vmnot.m v8, v0
638; CHECK-NEXT:    vcpop.m a0, v8
639; CHECK-NEXT:    seqz a0, a0
640; CHECK-NEXT:    ret
641  %red = call i1 @llvm.vector.reduce.smax.v64i1(<64 x i1> %v)
642  ret i1 %red
643}
644
645declare i1 @llvm.vector.reduce.umin.v64i1(<64 x i1>)
646
647define zeroext i1 @vreduce_umin_v64i1(<64 x i1> %v) {
648; CHECK-LABEL: vreduce_umin_v64i1:
649; CHECK:       # %bb.0:
650; CHECK-NEXT:    li a0, 64
651; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
652; CHECK-NEXT:    vmnot.m v8, v0
653; CHECK-NEXT:    vcpop.m a0, v8
654; CHECK-NEXT:    seqz a0, a0
655; CHECK-NEXT:    ret
656  %red = call i1 @llvm.vector.reduce.umin.v64i1(<64 x i1> %v)
657  ret i1 %red
658}
659
660declare i1 @llvm.vector.reduce.smin.v64i1(<64 x i1>)
661
662define zeroext i1 @vreduce_smin_v64i1(<64 x i1> %v) {
663; CHECK-LABEL: vreduce_smin_v64i1:
664; CHECK:       # %bb.0:
665; CHECK-NEXT:    li a0, 64
666; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
667; CHECK-NEXT:    vcpop.m a0, v0
668; CHECK-NEXT:    snez a0, a0
669; CHECK-NEXT:    ret
670  %red = call i1 @llvm.vector.reduce.smin.v64i1(<64 x i1> %v)
671  ret i1 %red
672}
673
674declare i1 @llvm.vector.reduce.add.v1i1(<1 x i1>)
675
676define zeroext i1 @vreduce_add_v1i1(<1 x i1> %v) {
677; CHECK-LABEL: vreduce_add_v1i1:
678; CHECK:       # %bb.0:
679; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
680; CHECK-NEXT:    vfirst.m a0, v0
681; CHECK-NEXT:    seqz a0, a0
682; CHECK-NEXT:    ret
683  %red = call i1 @llvm.vector.reduce.add.v1i1(<1 x i1> %v)
684  ret i1 %red
685}
686
687declare i1 @llvm.vector.reduce.add.v2i1(<2 x i1>)
688
689define zeroext i1 @vreduce_add_v2i1(<2 x i1> %v) {
690; CHECK-LABEL: vreduce_add_v2i1:
691; CHECK:       # %bb.0:
692; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
693; CHECK-NEXT:    vcpop.m a0, v0
694; CHECK-NEXT:    andi a0, a0, 1
695; CHECK-NEXT:    ret
696  %red = call i1 @llvm.vector.reduce.add.v2i1(<2 x i1> %v)
697  ret i1 %red
698}
699
700declare i1 @llvm.vector.reduce.add.v4i1(<4 x i1>)
701
702define zeroext i1 @vreduce_add_v4i1(<4 x i1> %v) {
703; CHECK-LABEL: vreduce_add_v4i1:
704; CHECK:       # %bb.0:
705; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
706; CHECK-NEXT:    vcpop.m a0, v0
707; CHECK-NEXT:    andi a0, a0, 1
708; CHECK-NEXT:    ret
709  %red = call i1 @llvm.vector.reduce.add.v4i1(<4 x i1> %v)
710  ret i1 %red
711}
712
713declare i1 @llvm.vector.reduce.add.v8i1(<8 x i1>)
714
715define zeroext i1 @vreduce_add_v8i1(<8 x i1> %v) {
716; CHECK-LABEL: vreduce_add_v8i1:
717; CHECK:       # %bb.0:
718; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
719; CHECK-NEXT:    vcpop.m a0, v0
720; CHECK-NEXT:    andi a0, a0, 1
721; CHECK-NEXT:    ret
722  %red = call i1 @llvm.vector.reduce.add.v8i1(<8 x i1> %v)
723  ret i1 %red
724}
725
726declare i1 @llvm.vector.reduce.add.v16i1(<16 x i1>)
727
728define zeroext i1 @vreduce_add_v16i1(<16 x i1> %v) {
729; CHECK-LABEL: vreduce_add_v16i1:
730; CHECK:       # %bb.0:
731; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
732; CHECK-NEXT:    vcpop.m a0, v0
733; CHECK-NEXT:    andi a0, a0, 1
734; CHECK-NEXT:    ret
735  %red = call i1 @llvm.vector.reduce.add.v16i1(<16 x i1> %v)
736  ret i1 %red
737}
738
739declare i1 @llvm.vector.reduce.add.v32i1(<32 x i1>)
740
741define zeroext i1 @vreduce_add_v32i1(<32 x i1> %v) {
742; CHECK-LABEL: vreduce_add_v32i1:
743; CHECK:       # %bb.0:
744; CHECK-NEXT:    li a0, 32
745; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
746; CHECK-NEXT:    vcpop.m a0, v0
747; CHECK-NEXT:    andi a0, a0, 1
748; CHECK-NEXT:    ret
749  %red = call i1 @llvm.vector.reduce.add.v32i1(<32 x i1> %v)
750  ret i1 %red
751}
752
753declare i1 @llvm.vector.reduce.add.v64i1(<64 x i1>)
754
755define zeroext i1 @vreduce_add_v64i1(<64 x i1> %v) {
756; CHECK-LABEL: vreduce_add_v64i1:
757; CHECK:       # %bb.0:
758; CHECK-NEXT:    li a0, 64
759; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
760; CHECK-NEXT:    vcpop.m a0, v0
761; CHECK-NEXT:    andi a0, a0, 1
762; CHECK-NEXT:    ret
763  %red = call i1 @llvm.vector.reduce.add.v64i1(<64 x i1> %v)
764  ret i1 %red
765}
766
767declare i1 @llvm.vector.reduce.or.v128i1(<128 x i1>)
768
769define zeroext i1 @vreduce_or_v128i1(<128 x i1> %v) {
770; CHECK-LABEL: vreduce_or_v128i1:
771; CHECK:       # %bb.0:
772; CHECK-NEXT:    li a0, 128
773; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
774; CHECK-NEXT:    vcpop.m a0, v0
775; CHECK-NEXT:    snez a0, a0
776; CHECK-NEXT:    ret
777  %red = call i1 @llvm.vector.reduce.or.v128i1(<128 x i1> %v)
778  ret i1 %red
779}
780
781declare i1 @llvm.vector.reduce.xor.v128i1(<128 x i1>)
782
783define zeroext i1 @vreduce_xor_v128i1(<128 x i1> %v) {
784; CHECK-LABEL: vreduce_xor_v128i1:
785; CHECK:       # %bb.0:
786; CHECK-NEXT:    li a0, 128
787; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
788; CHECK-NEXT:    vcpop.m a0, v0
789; CHECK-NEXT:    andi a0, a0, 1
790; CHECK-NEXT:    ret
791  %red = call i1 @llvm.vector.reduce.xor.v128i1(<128 x i1> %v)
792  ret i1 %red
793}
794
795declare i1 @llvm.vector.reduce.and.v128i1(<128 x i1>)
796
797define zeroext i1 @vreduce_and_v128i1(<128 x i1> %v) {
798; CHECK-LABEL: vreduce_and_v128i1:
799; CHECK:       # %bb.0:
800; CHECK-NEXT:    li a0, 128
801; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
802; CHECK-NEXT:    vmnot.m v8, v0
803; CHECK-NEXT:    vcpop.m a0, v8
804; CHECK-NEXT:    seqz a0, a0
805; CHECK-NEXT:    ret
806  %red = call i1 @llvm.vector.reduce.and.v128i1(<128 x i1> %v)
807  ret i1 %red
808}
809
810declare i1 @llvm.vector.reduce.umax.v128i1(<128 x i1>)
811
812define zeroext i1 @vreduce_umax_v128i1(<128 x i1> %v) {
813; CHECK-LABEL: vreduce_umax_v128i1:
814; CHECK:       # %bb.0:
815; CHECK-NEXT:    li a0, 128
816; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
817; CHECK-NEXT:    vcpop.m a0, v0
818; CHECK-NEXT:    snez a0, a0
819; CHECK-NEXT:    ret
820  %red = call i1 @llvm.vector.reduce.umax.v128i1(<128 x i1> %v)
821  ret i1 %red
822}
823
824declare i1 @llvm.vector.reduce.smax.v128i1(<128 x i1>)
825
826define zeroext i1 @vreduce_smax_v128i1(<128 x i1> %v) {
827; CHECK-LABEL: vreduce_smax_v128i1:
828; CHECK:       # %bb.0:
829; CHECK-NEXT:    li a0, 128
830; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
831; CHECK-NEXT:    vmnot.m v8, v0
832; CHECK-NEXT:    vcpop.m a0, v8
833; CHECK-NEXT:    seqz a0, a0
834; CHECK-NEXT:    ret
835  %red = call i1 @llvm.vector.reduce.smax.v128i1(<128 x i1> %v)
836  ret i1 %red
837}
838
839declare i1 @llvm.vector.reduce.umin.v128i1(<128 x i1>)
840
841define zeroext i1 @vreduce_umin_v128i1(<128 x i1> %v) {
842; CHECK-LABEL: vreduce_umin_v128i1:
843; CHECK:       # %bb.0:
844; CHECK-NEXT:    li a0, 128
845; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
846; CHECK-NEXT:    vmnot.m v8, v0
847; CHECK-NEXT:    vcpop.m a0, v8
848; CHECK-NEXT:    seqz a0, a0
849; CHECK-NEXT:    ret
850  %red = call i1 @llvm.vector.reduce.umin.v128i1(<128 x i1> %v)
851  ret i1 %red
852}
853
854declare i1 @llvm.vector.reduce.smin.v128i1(<128 x i1>)
855
856define zeroext i1 @vreduce_smin_v128i1(<128 x i1> %v) {
857; CHECK-LABEL: vreduce_smin_v128i1:
858; CHECK:       # %bb.0:
859; CHECK-NEXT:    li a0, 128
860; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
861; CHECK-NEXT:    vcpop.m a0, v0
862; CHECK-NEXT:    snez a0, a0
863; CHECK-NEXT:    ret
864  %red = call i1 @llvm.vector.reduce.smin.v128i1(<128 x i1> %v)
865  ret i1 %red
866}
867
868declare i1 @llvm.vector.reduce.or.v256i1(<256 x i1>)
869
870define zeroext i1 @vreduce_or_v256i1(<256 x i1> %v) {
871; CHECK-LABEL: vreduce_or_v256i1:
872; CHECK:       # %bb.0:
873; CHECK-NEXT:    li a0, 128
874; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
875; CHECK-NEXT:    vmor.mm v8, v0, v8
876; CHECK-NEXT:    vcpop.m a0, v8
877; CHECK-NEXT:    snez a0, a0
878; CHECK-NEXT:    ret
879  %red = call i1 @llvm.vector.reduce.or.v256i1(<256 x i1> %v)
880  ret i1 %red
881}
882
883declare i1 @llvm.vector.reduce.xor.v256i1(<256 x i1>)
884
885define zeroext i1 @vreduce_xor_v256i1(<256 x i1> %v) {
886; CHECK-LABEL: vreduce_xor_v256i1:
887; CHECK:       # %bb.0:
888; CHECK-NEXT:    li a0, 128
889; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
890; CHECK-NEXT:    vmxor.mm v8, v0, v8
891; CHECK-NEXT:    vcpop.m a0, v8
892; CHECK-NEXT:    andi a0, a0, 1
893; CHECK-NEXT:    ret
894  %red = call i1 @llvm.vector.reduce.xor.v256i1(<256 x i1> %v)
895  ret i1 %red
896}
897
898declare i1 @llvm.vector.reduce.and.v256i1(<256 x i1>)
899
900define zeroext i1 @vreduce_and_v256i1(<256 x i1> %v) {
901; CHECK-LABEL: vreduce_and_v256i1:
902; CHECK:       # %bb.0:
903; CHECK-NEXT:    li a0, 128
904; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
905; CHECK-NEXT:    vmnand.mm v8, v0, v8
906; CHECK-NEXT:    vcpop.m a0, v8
907; CHECK-NEXT:    seqz a0, a0
908; CHECK-NEXT:    ret
909  %red = call i1 @llvm.vector.reduce.and.v256i1(<256 x i1> %v)
910  ret i1 %red
911}
912
913declare i1 @llvm.vector.reduce.umax.v256i1(<256 x i1>)
914
915define zeroext i1 @vreduce_umax_v256i1(<256 x i1> %v) {
916; CHECK-LABEL: vreduce_umax_v256i1:
917; CHECK:       # %bb.0:
918; CHECK-NEXT:    li a0, 128
919; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
920; CHECK-NEXT:    vmor.mm v8, v0, v8
921; CHECK-NEXT:    vcpop.m a0, v8
922; CHECK-NEXT:    snez a0, a0
923; CHECK-NEXT:    ret
924  %red = call i1 @llvm.vector.reduce.umax.v256i1(<256 x i1> %v)
925  ret i1 %red
926}
927
928declare i1 @llvm.vector.reduce.smax.v256i1(<256 x i1>)
929
930define zeroext i1 @vreduce_smax_v256i1(<256 x i1> %v) {
931; CHECK-LABEL: vreduce_smax_v256i1:
932; CHECK:       # %bb.0:
933; CHECK-NEXT:    li a0, 128
934; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
935; CHECK-NEXT:    vmnand.mm v8, v0, v8
936; CHECK-NEXT:    vcpop.m a0, v8
937; CHECK-NEXT:    seqz a0, a0
938; CHECK-NEXT:    ret
939  %red = call i1 @llvm.vector.reduce.smax.v256i1(<256 x i1> %v)
940  ret i1 %red
941}
942
943declare i1 @llvm.vector.reduce.umin.v256i1(<256 x i1>)
944
945define zeroext i1 @vreduce_umin_v256i1(<256 x i1> %v) {
946; CHECK-LABEL: vreduce_umin_v256i1:
947; CHECK:       # %bb.0:
948; CHECK-NEXT:    li a0, 128
949; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
950; CHECK-NEXT:    vmnand.mm v8, v0, v8
951; CHECK-NEXT:    vcpop.m a0, v8
952; CHECK-NEXT:    seqz a0, a0
953; CHECK-NEXT:    ret
954  %red = call i1 @llvm.vector.reduce.umin.v256i1(<256 x i1> %v)
955  ret i1 %red
956}
957
958declare i1 @llvm.vector.reduce.smin.v256i1(<256 x i1>)
959
960define zeroext i1 @vreduce_smin_v256i1(<256 x i1> %v) {
961; CHECK-LABEL: vreduce_smin_v256i1:
962; CHECK:       # %bb.0:
963; CHECK-NEXT:    li a0, 128
964; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
965; CHECK-NEXT:    vmor.mm v8, v0, v8
966; CHECK-NEXT:    vcpop.m a0, v8
967; CHECK-NEXT:    snez a0, a0
968; CHECK-NEXT:    ret
969  %red = call i1 @llvm.vector.reduce.smin.v256i1(<256 x i1> %v)
970  ret i1 %red
971}
972
973declare i1 @llvm.vector.reduce.or.v512i1(<512 x i1>)
974
975define zeroext i1 @vreduce_or_v512i1(<512 x i1> %v) {
976; CHECK-LABEL: vreduce_or_v512i1:
977; CHECK:       # %bb.0:
978; CHECK-NEXT:    li a0, 128
979; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
980; CHECK-NEXT:    vmor.mm v8, v8, v10
981; CHECK-NEXT:    vmor.mm v9, v0, v9
982; CHECK-NEXT:    vmor.mm v8, v9, v8
983; CHECK-NEXT:    vcpop.m a0, v8
984; CHECK-NEXT:    snez a0, a0
985; CHECK-NEXT:    ret
986  %red = call i1 @llvm.vector.reduce.or.v512i1(<512 x i1> %v)
987  ret i1 %red
988}
989
990declare i1 @llvm.vector.reduce.xor.v512i1(<512 x i1>)
991
992define zeroext i1 @vreduce_xor_v512i1(<512 x i1> %v) {
993; CHECK-LABEL: vreduce_xor_v512i1:
994; CHECK:       # %bb.0:
995; CHECK-NEXT:    li a0, 128
996; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
997; CHECK-NEXT:    vmxor.mm v8, v8, v10
998; CHECK-NEXT:    vmxor.mm v9, v0, v9
999; CHECK-NEXT:    vmxor.mm v8, v9, v8
1000; CHECK-NEXT:    vcpop.m a0, v8
1001; CHECK-NEXT:    andi a0, a0, 1
1002; CHECK-NEXT:    ret
1003  %red = call i1 @llvm.vector.reduce.xor.v512i1(<512 x i1> %v)
1004  ret i1 %red
1005}
1006
1007declare i1 @llvm.vector.reduce.and.v512i1(<512 x i1>)
1008
1009define zeroext i1 @vreduce_and_v512i1(<512 x i1> %v) {
1010; CHECK-LABEL: vreduce_and_v512i1:
1011; CHECK:       # %bb.0:
1012; CHECK-NEXT:    li a0, 128
1013; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1014; CHECK-NEXT:    vmand.mm v8, v8, v10
1015; CHECK-NEXT:    vmand.mm v9, v0, v9
1016; CHECK-NEXT:    vmnand.mm v8, v9, v8
1017; CHECK-NEXT:    vcpop.m a0, v8
1018; CHECK-NEXT:    seqz a0, a0
1019; CHECK-NEXT:    ret
1020  %red = call i1 @llvm.vector.reduce.and.v512i1(<512 x i1> %v)
1021  ret i1 %red
1022}
1023
1024declare i1 @llvm.vector.reduce.umax.v512i1(<512 x i1>)
1025
1026define zeroext i1 @vreduce_umax_v512i1(<512 x i1> %v) {
1027; CHECK-LABEL: vreduce_umax_v512i1:
1028; CHECK:       # %bb.0:
1029; CHECK-NEXT:    li a0, 128
1030; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1031; CHECK-NEXT:    vmor.mm v8, v8, v10
1032; CHECK-NEXT:    vmor.mm v9, v0, v9
1033; CHECK-NEXT:    vmor.mm v8, v9, v8
1034; CHECK-NEXT:    vcpop.m a0, v8
1035; CHECK-NEXT:    snez a0, a0
1036; CHECK-NEXT:    ret
1037  %red = call i1 @llvm.vector.reduce.umax.v512i1(<512 x i1> %v)
1038  ret i1 %red
1039}
1040
1041declare i1 @llvm.vector.reduce.smax.v512i1(<512 x i1>)
1042
1043define zeroext i1 @vreduce_smax_v512i1(<512 x i1> %v) {
1044; CHECK-LABEL: vreduce_smax_v512i1:
1045; CHECK:       # %bb.0:
1046; CHECK-NEXT:    li a0, 128
1047; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1048; CHECK-NEXT:    vmand.mm v8, v8, v10
1049; CHECK-NEXT:    vmand.mm v9, v0, v9
1050; CHECK-NEXT:    vmnand.mm v8, v9, v8
1051; CHECK-NEXT:    vcpop.m a0, v8
1052; CHECK-NEXT:    seqz a0, a0
1053; CHECK-NEXT:    ret
1054  %red = call i1 @llvm.vector.reduce.smax.v512i1(<512 x i1> %v)
1055  ret i1 %red
1056}
1057
1058declare i1 @llvm.vector.reduce.umin.v512i1(<512 x i1>)
1059
1060define zeroext i1 @vreduce_umin_v512i1(<512 x i1> %v) {
1061; CHECK-LABEL: vreduce_umin_v512i1:
1062; CHECK:       # %bb.0:
1063; CHECK-NEXT:    li a0, 128
1064; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1065; CHECK-NEXT:    vmand.mm v8, v8, v10
1066; CHECK-NEXT:    vmand.mm v9, v0, v9
1067; CHECK-NEXT:    vmnand.mm v8, v9, v8
1068; CHECK-NEXT:    vcpop.m a0, v8
1069; CHECK-NEXT:    seqz a0, a0
1070; CHECK-NEXT:    ret
1071  %red = call i1 @llvm.vector.reduce.umin.v512i1(<512 x i1> %v)
1072  ret i1 %red
1073}
1074
1075declare i1 @llvm.vector.reduce.smin.v512i1(<512 x i1>)
1076
1077define zeroext i1 @vreduce_smin_v512i1(<512 x i1> %v) {
1078; CHECK-LABEL: vreduce_smin_v512i1:
1079; CHECK:       # %bb.0:
1080; CHECK-NEXT:    li a0, 128
1081; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1082; CHECK-NEXT:    vmor.mm v8, v8, v10
1083; CHECK-NEXT:    vmor.mm v9, v0, v9
1084; CHECK-NEXT:    vmor.mm v8, v9, v8
1085; CHECK-NEXT:    vcpop.m a0, v8
1086; CHECK-NEXT:    snez a0, a0
1087; CHECK-NEXT:    ret
1088  %red = call i1 @llvm.vector.reduce.smin.v512i1(<512 x i1> %v)
1089  ret i1 %red
1090}
1091
1092declare i1 @llvm.vector.reduce.or.v1024i1(<1024 x i1>)
1093
1094define zeroext i1 @vreduce_or_v1024i1(<1024 x i1> %v) {
1095; CHECK-LABEL: vreduce_or_v1024i1:
1096; CHECK:       # %bb.0:
1097; CHECK-NEXT:    li a0, 128
1098; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1099; CHECK-NEXT:    vmor.mm v10, v10, v14
1100; CHECK-NEXT:    vmor.mm v8, v8, v12
1101; CHECK-NEXT:    vmor.mm v9, v9, v13
1102; CHECK-NEXT:    vmor.mm v11, v0, v11
1103; CHECK-NEXT:    vmor.mm v8, v8, v10
1104; CHECK-NEXT:    vmor.mm v9, v11, v9
1105; CHECK-NEXT:    vmor.mm v8, v9, v8
1106; CHECK-NEXT:    vcpop.m a0, v8
1107; CHECK-NEXT:    snez a0, a0
1108; CHECK-NEXT:    ret
1109  %red = call i1 @llvm.vector.reduce.or.v1024i1(<1024 x i1> %v)
1110  ret i1 %red
1111}
1112
1113declare i1 @llvm.vector.reduce.xor.v1024i1(<1024 x i1>)
1114
1115define zeroext i1 @vreduce_xor_v1024i1(<1024 x i1> %v) {
1116; CHECK-LABEL: vreduce_xor_v1024i1:
1117; CHECK:       # %bb.0:
1118; CHECK-NEXT:    li a0, 128
1119; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1120; CHECK-NEXT:    vmxor.mm v10, v10, v14
1121; CHECK-NEXT:    vmxor.mm v8, v8, v12
1122; CHECK-NEXT:    vmxor.mm v9, v9, v13
1123; CHECK-NEXT:    vmxor.mm v11, v0, v11
1124; CHECK-NEXT:    vmxor.mm v8, v8, v10
1125; CHECK-NEXT:    vmxor.mm v9, v11, v9
1126; CHECK-NEXT:    vmxor.mm v8, v9, v8
1127; CHECK-NEXT:    vcpop.m a0, v8
1128; CHECK-NEXT:    andi a0, a0, 1
1129; CHECK-NEXT:    ret
1130  %red = call i1 @llvm.vector.reduce.xor.v1024i1(<1024 x i1> %v)
1131  ret i1 %red
1132}
1133
1134declare i1 @llvm.vector.reduce.and.v1024i1(<1024 x i1>)
1135
1136define zeroext i1 @vreduce_and_v1024i1(<1024 x i1> %v) {
1137; CHECK-LABEL: vreduce_and_v1024i1:
1138; CHECK:       # %bb.0:
1139; CHECK-NEXT:    li a0, 128
1140; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1141; CHECK-NEXT:    vmand.mm v10, v10, v14
1142; CHECK-NEXT:    vmand.mm v8, v8, v12
1143; CHECK-NEXT:    vmand.mm v9, v9, v13
1144; CHECK-NEXT:    vmand.mm v11, v0, v11
1145; CHECK-NEXT:    vmand.mm v8, v8, v10
1146; CHECK-NEXT:    vmand.mm v9, v11, v9
1147; CHECK-NEXT:    vmnand.mm v8, v9, v8
1148; CHECK-NEXT:    vcpop.m a0, v8
1149; CHECK-NEXT:    seqz a0, a0
1150; CHECK-NEXT:    ret
1151  %red = call i1 @llvm.vector.reduce.and.v1024i1(<1024 x i1> %v)
1152  ret i1 %red
1153}
1154
1155declare i1 @llvm.vector.reduce.umax.v1024i1(<1024 x i1>)
1156
1157define zeroext i1 @vreduce_umax_v1024i1(<1024 x i1> %v) {
1158; CHECK-LABEL: vreduce_umax_v1024i1:
1159; CHECK:       # %bb.0:
1160; CHECK-NEXT:    li a0, 128
1161; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1162; CHECK-NEXT:    vmor.mm v10, v10, v14
1163; CHECK-NEXT:    vmor.mm v8, v8, v12
1164; CHECK-NEXT:    vmor.mm v9, v9, v13
1165; CHECK-NEXT:    vmor.mm v11, v0, v11
1166; CHECK-NEXT:    vmor.mm v8, v8, v10
1167; CHECK-NEXT:    vmor.mm v9, v11, v9
1168; CHECK-NEXT:    vmor.mm v8, v9, v8
1169; CHECK-NEXT:    vcpop.m a0, v8
1170; CHECK-NEXT:    snez a0, a0
1171; CHECK-NEXT:    ret
1172  %red = call i1 @llvm.vector.reduce.umax.v1024i1(<1024 x i1> %v)
1173  ret i1 %red
1174}
1175
1176declare i1 @llvm.vector.reduce.smax.v1024i1(<1024 x i1>)
1177
1178define zeroext i1 @vreduce_smax_v1024i1(<1024 x i1> %v) {
1179; CHECK-LABEL: vreduce_smax_v1024i1:
1180; CHECK:       # %bb.0:
1181; CHECK-NEXT:    li a0, 128
1182; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1183; CHECK-NEXT:    vmand.mm v10, v10, v14
1184; CHECK-NEXT:    vmand.mm v8, v8, v12
1185; CHECK-NEXT:    vmand.mm v9, v9, v13
1186; CHECK-NEXT:    vmand.mm v11, v0, v11
1187; CHECK-NEXT:    vmand.mm v8, v8, v10
1188; CHECK-NEXT:    vmand.mm v9, v11, v9
1189; CHECK-NEXT:    vmnand.mm v8, v9, v8
1190; CHECK-NEXT:    vcpop.m a0, v8
1191; CHECK-NEXT:    seqz a0, a0
1192; CHECK-NEXT:    ret
1193  %red = call i1 @llvm.vector.reduce.smax.v1024i1(<1024 x i1> %v)
1194  ret i1 %red
1195}
1196
1197declare i1 @llvm.vector.reduce.umin.v1024i1(<1024 x i1>)
1198
1199define zeroext i1 @vreduce_umin_v1024i1(<1024 x i1> %v) {
1200; CHECK-LABEL: vreduce_umin_v1024i1:
1201; CHECK:       # %bb.0:
1202; CHECK-NEXT:    li a0, 128
1203; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1204; CHECK-NEXT:    vmand.mm v10, v10, v14
1205; CHECK-NEXT:    vmand.mm v8, v8, v12
1206; CHECK-NEXT:    vmand.mm v9, v9, v13
1207; CHECK-NEXT:    vmand.mm v11, v0, v11
1208; CHECK-NEXT:    vmand.mm v8, v8, v10
1209; CHECK-NEXT:    vmand.mm v9, v11, v9
1210; CHECK-NEXT:    vmnand.mm v8, v9, v8
1211; CHECK-NEXT:    vcpop.m a0, v8
1212; CHECK-NEXT:    seqz a0, a0
1213; CHECK-NEXT:    ret
1214  %red = call i1 @llvm.vector.reduce.umin.v1024i1(<1024 x i1> %v)
1215  ret i1 %red
1216}
1217
1218declare i1 @llvm.vector.reduce.smin.v1024i1(<1024 x i1>)
1219
1220define zeroext i1 @vreduce_smin_v1024i1(<1024 x i1> %v) {
1221; CHECK-LABEL: vreduce_smin_v1024i1:
1222; CHECK:       # %bb.0:
1223; CHECK-NEXT:    li a0, 128
1224; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
1225; CHECK-NEXT:    vmor.mm v10, v10, v14
1226; CHECK-NEXT:    vmor.mm v8, v8, v12
1227; CHECK-NEXT:    vmor.mm v9, v9, v13
1228; CHECK-NEXT:    vmor.mm v11, v0, v11
1229; CHECK-NEXT:    vmor.mm v8, v8, v10
1230; CHECK-NEXT:    vmor.mm v9, v11, v9
1231; CHECK-NEXT:    vmor.mm v8, v9, v8
1232; CHECK-NEXT:    vcpop.m a0, v8
1233; CHECK-NEXT:    snez a0, a0
1234; CHECK-NEXT:    ret
1235  %red = call i1 @llvm.vector.reduce.smin.v1024i1(<1024 x i1> %v)
1236  ret i1 %red
1237}
1238