1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4
5define <vscale x 1 x i1> @vmand_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
6; CHECK-LABEL: vmand_vv_nxv1i1:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
9; CHECK-NEXT:    vmand.mm v0, v0, v8
10; CHECK-NEXT:    ret
11  %vc = and <vscale x 1 x i1> %va, %vb
12  ret <vscale x 1 x i1> %vc
13}
14
15define <vscale x 2 x i1> @vmand_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
16; CHECK-LABEL: vmand_vv_nxv2i1:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
19; CHECK-NEXT:    vmand.mm v0, v0, v8
20; CHECK-NEXT:    ret
21  %vc = and <vscale x 2 x i1> %va, %vb
22  ret <vscale x 2 x i1> %vc
23}
24
25define <vscale x 4 x i1> @vmand_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
26; CHECK-LABEL: vmand_vv_nxv4i1:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
29; CHECK-NEXT:    vmand.mm v0, v0, v8
30; CHECK-NEXT:    ret
31  %vc = and <vscale x 4 x i1> %va, %vb
32  ret <vscale x 4 x i1> %vc
33}
34
35define <vscale x 8 x i1> @vmand_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
36; CHECK-LABEL: vmand_vv_nxv8i1:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
39; CHECK-NEXT:    vmand.mm v0, v0, v8
40; CHECK-NEXT:    ret
41  %vc = and <vscale x 8 x i1> %va, %vb
42  ret <vscale x 8 x i1> %vc
43}
44
45define <vscale x 16 x i1> @vmand_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
46; CHECK-LABEL: vmand_vv_nxv16i1:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
49; CHECK-NEXT:    vmand.mm v0, v0, v8
50; CHECK-NEXT:    ret
51  %vc = and <vscale x 16 x i1> %va, %vb
52  ret <vscale x 16 x i1> %vc
53}
54
55define <vscale x 1 x i1> @vmor_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
56; CHECK-LABEL: vmor_vv_nxv1i1:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
59; CHECK-NEXT:    vmor.mm v0, v0, v8
60; CHECK-NEXT:    ret
61  %vc = or <vscale x 1 x i1> %va, %vb
62  ret <vscale x 1 x i1> %vc
63}
64
65define <vscale x 2 x i1> @vmor_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
66; CHECK-LABEL: vmor_vv_nxv2i1:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
69; CHECK-NEXT:    vmor.mm v0, v0, v8
70; CHECK-NEXT:    ret
71  %vc = or <vscale x 2 x i1> %va, %vb
72  ret <vscale x 2 x i1> %vc
73}
74
75define <vscale x 4 x i1> @vmor_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
76; CHECK-LABEL: vmor_vv_nxv4i1:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
79; CHECK-NEXT:    vmor.mm v0, v0, v8
80; CHECK-NEXT:    ret
81  %vc = or <vscale x 4 x i1> %va, %vb
82  ret <vscale x 4 x i1> %vc
83}
84
85define <vscale x 8 x i1> @vmor_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
86; CHECK-LABEL: vmor_vv_nxv8i1:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
89; CHECK-NEXT:    vmor.mm v0, v0, v8
90; CHECK-NEXT:    ret
91  %vc = or <vscale x 8 x i1> %va, %vb
92  ret <vscale x 8 x i1> %vc
93}
94
95define <vscale x 16 x i1> @vmor_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
96; CHECK-LABEL: vmor_vv_nxv16i1:
97; CHECK:       # %bb.0:
98; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
99; CHECK-NEXT:    vmor.mm v0, v0, v8
100; CHECK-NEXT:    ret
101  %vc = or <vscale x 16 x i1> %va, %vb
102  ret <vscale x 16 x i1> %vc
103}
104
105define <vscale x 1 x i1> @vmxor_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
106; CHECK-LABEL: vmxor_vv_nxv1i1:
107; CHECK:       # %bb.0:
108; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
109; CHECK-NEXT:    vmxor.mm v0, v0, v8
110; CHECK-NEXT:    ret
111  %vc = xor <vscale x 1 x i1> %va, %vb
112  ret <vscale x 1 x i1> %vc
113}
114
115define <vscale x 2 x i1> @vmxor_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
116; CHECK-LABEL: vmxor_vv_nxv2i1:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
119; CHECK-NEXT:    vmxor.mm v0, v0, v8
120; CHECK-NEXT:    ret
121  %vc = xor <vscale x 2 x i1> %va, %vb
122  ret <vscale x 2 x i1> %vc
123}
124
125define <vscale x 4 x i1> @vmxor_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
126; CHECK-LABEL: vmxor_vv_nxv4i1:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
129; CHECK-NEXT:    vmxor.mm v0, v0, v8
130; CHECK-NEXT:    ret
131  %vc = xor <vscale x 4 x i1> %va, %vb
132  ret <vscale x 4 x i1> %vc
133}
134
135define <vscale x 8 x i1> @vmxor_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
136; CHECK-LABEL: vmxor_vv_nxv8i1:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
139; CHECK-NEXT:    vmxor.mm v0, v0, v8
140; CHECK-NEXT:    ret
141  %vc = xor <vscale x 8 x i1> %va, %vb
142  ret <vscale x 8 x i1> %vc
143}
144
145define <vscale x 16 x i1> @vmxor_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
146; CHECK-LABEL: vmxor_vv_nxv16i1:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
149; CHECK-NEXT:    vmxor.mm v0, v0, v8
150; CHECK-NEXT:    ret
151  %vc = xor <vscale x 16 x i1> %va, %vb
152  ret <vscale x 16 x i1> %vc
153}
154
155define <vscale x 1 x i1> @vmnand_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
156; CHECK-LABEL: vmnand_vv_nxv1i1:
157; CHECK:       # %bb.0:
158; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
159; CHECK-NEXT:    vmnand.mm v0, v0, v8
160; CHECK-NEXT:    ret
161  %vc = and <vscale x 1 x i1> %va, %vb
162  %head = insertelement <vscale x 1 x i1> poison, i1 1, i32 0
163  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
164  %not = xor <vscale x 1 x i1> %vc, %splat
165  ret <vscale x 1 x i1> %not
166}
167
168define <vscale x 2 x i1> @vmnand_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
169; CHECK-LABEL: vmnand_vv_nxv2i1:
170; CHECK:       # %bb.0:
171; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
172; CHECK-NEXT:    vmnand.mm v0, v0, v8
173; CHECK-NEXT:    ret
174  %vc = and <vscale x 2 x i1> %va, %vb
175  %head = insertelement <vscale x 2 x i1> poison, i1 1, i32 0
176  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
177  %not = xor <vscale x 2 x i1> %vc, %splat
178  ret <vscale x 2 x i1> %not
179}
180
181define <vscale x 4 x i1> @vmnand_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
182; CHECK-LABEL: vmnand_vv_nxv4i1:
183; CHECK:       # %bb.0:
184; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
185; CHECK-NEXT:    vmnand.mm v0, v0, v8
186; CHECK-NEXT:    ret
187  %vc = and <vscale x 4 x i1> %va, %vb
188  %head = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
189  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
190  %not = xor <vscale x 4 x i1> %vc, %splat
191  ret <vscale x 4 x i1> %not
192}
193
194define <vscale x 8 x i1> @vmnand_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
195; CHECK-LABEL: vmnand_vv_nxv8i1:
196; CHECK:       # %bb.0:
197; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
198; CHECK-NEXT:    vmnand.mm v0, v0, v8
199; CHECK-NEXT:    ret
200  %vc = and <vscale x 8 x i1> %va, %vb
201  %head = insertelement <vscale x 8 x i1> poison, i1 1, i32 0
202  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
203  %not = xor <vscale x 8 x i1> %vc, %splat
204  ret <vscale x 8 x i1> %not
205}
206
207define <vscale x 16 x i1> @vmnand_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
208; CHECK-LABEL: vmnand_vv_nxv16i1:
209; CHECK:       # %bb.0:
210; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
211; CHECK-NEXT:    vmnand.mm v0, v0, v8
212; CHECK-NEXT:    ret
213  %vc = and <vscale x 16 x i1> %va, %vb
214  %head = insertelement <vscale x 16 x i1> poison, i1 1, i32 0
215  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
216  %not = xor <vscale x 16 x i1> %vc, %splat
217  ret <vscale x 16 x i1> %not
218}
219
220define <vscale x 1 x i1> @vmnor_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
221; CHECK-LABEL: vmnor_vv_nxv1i1:
222; CHECK:       # %bb.0:
223; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
224; CHECK-NEXT:    vmnor.mm v0, v0, v8
225; CHECK-NEXT:    ret
226  %vc = or <vscale x 1 x i1> %va, %vb
227  %head = insertelement <vscale x 1 x i1> poison, i1 1, i32 0
228  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
229  %not = xor <vscale x 1 x i1> %vc, %splat
230  ret <vscale x 1 x i1> %not
231}
232
233define <vscale x 2 x i1> @vmnor_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
234; CHECK-LABEL: vmnor_vv_nxv2i1:
235; CHECK:       # %bb.0:
236; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
237; CHECK-NEXT:    vmnor.mm v0, v0, v8
238; CHECK-NEXT:    ret
239  %vc = or <vscale x 2 x i1> %va, %vb
240  %head = insertelement <vscale x 2 x i1> poison, i1 1, i32 0
241  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
242  %not = xor <vscale x 2 x i1> %vc, %splat
243  ret <vscale x 2 x i1> %not
244}
245
246define <vscale x 4 x i1> @vmnor_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
247; CHECK-LABEL: vmnor_vv_nxv4i1:
248; CHECK:       # %bb.0:
249; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
250; CHECK-NEXT:    vmnor.mm v0, v0, v8
251; CHECK-NEXT:    ret
252  %vc = or <vscale x 4 x i1> %va, %vb
253  %head = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
254  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
255  %not = xor <vscale x 4 x i1> %vc, %splat
256  ret <vscale x 4 x i1> %not
257}
258
259define <vscale x 8 x i1> @vmnor_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
260; CHECK-LABEL: vmnor_vv_nxv8i1:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
263; CHECK-NEXT:    vmnor.mm v0, v0, v8
264; CHECK-NEXT:    ret
265  %vc = or <vscale x 8 x i1> %va, %vb
266  %head = insertelement <vscale x 8 x i1> poison, i1 1, i32 0
267  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
268  %not = xor <vscale x 8 x i1> %vc, %splat
269  ret <vscale x 8 x i1> %not
270}
271
272define <vscale x 16 x i1> @vmnor_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
273; CHECK-LABEL: vmnor_vv_nxv16i1:
274; CHECK:       # %bb.0:
275; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
276; CHECK-NEXT:    vmnor.mm v0, v0, v8
277; CHECK-NEXT:    ret
278  %vc = or <vscale x 16 x i1> %va, %vb
279  %head = insertelement <vscale x 16 x i1> poison, i1 1, i32 0
280  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
281  %not = xor <vscale x 16 x i1> %vc, %splat
282  ret <vscale x 16 x i1> %not
283}
284
285define <vscale x 1 x i1> @vmxnor_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
286; CHECK-LABEL: vmxnor_vv_nxv1i1:
287; CHECK:       # %bb.0:
288; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
289; CHECK-NEXT:    vmxnor.mm v0, v0, v8
290; CHECK-NEXT:    ret
291  %vc = xor <vscale x 1 x i1> %va, %vb
292  %head = insertelement <vscale x 1 x i1> poison, i1 1, i32 0
293  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
294  %not = xor <vscale x 1 x i1> %vc, %splat
295  ret <vscale x 1 x i1> %not
296}
297
298define <vscale x 2 x i1> @vmxnor_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
299; CHECK-LABEL: vmxnor_vv_nxv2i1:
300; CHECK:       # %bb.0:
301; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
302; CHECK-NEXT:    vmxnor.mm v0, v0, v8
303; CHECK-NEXT:    ret
304  %vc = xor <vscale x 2 x i1> %va, %vb
305  %head = insertelement <vscale x 2 x i1> poison, i1 1, i32 0
306  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
307  %not = xor <vscale x 2 x i1> %vc, %splat
308  ret <vscale x 2 x i1> %not
309}
310
311define <vscale x 4 x i1> @vmxnor_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
312; CHECK-LABEL: vmxnor_vv_nxv4i1:
313; CHECK:       # %bb.0:
314; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
315; CHECK-NEXT:    vmxnor.mm v0, v0, v8
316; CHECK-NEXT:    ret
317  %vc = xor <vscale x 4 x i1> %va, %vb
318  %head = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
319  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
320  %not = xor <vscale x 4 x i1> %vc, %splat
321  ret <vscale x 4 x i1> %not
322}
323
324define <vscale x 8 x i1> @vmxnor_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
325; CHECK-LABEL: vmxnor_vv_nxv8i1:
326; CHECK:       # %bb.0:
327; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
328; CHECK-NEXT:    vmxnor.mm v0, v0, v8
329; CHECK-NEXT:    ret
330  %vc = xor <vscale x 8 x i1> %va, %vb
331  %head = insertelement <vscale x 8 x i1> poison, i1 1, i32 0
332  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
333  %not = xor <vscale x 8 x i1> %vc, %splat
334  ret <vscale x 8 x i1> %not
335}
336
337define <vscale x 16 x i1> @vmxnor_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
338; CHECK-LABEL: vmxnor_vv_nxv16i1:
339; CHECK:       # %bb.0:
340; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
341; CHECK-NEXT:    vmxnor.mm v0, v0, v8
342; CHECK-NEXT:    ret
343  %vc = xor <vscale x 16 x i1> %va, %vb
344  %head = insertelement <vscale x 16 x i1> poison, i1 1, i32 0
345  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
346  %not = xor <vscale x 16 x i1> %vc, %splat
347  ret <vscale x 16 x i1> %not
348}
349
350define <vscale x 1 x i1> @vmandn_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
351; CHECK-LABEL: vmandn_vv_nxv1i1:
352; CHECK:       # %bb.0:
353; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
354; CHECK-NEXT:    vmandn.mm v0, v0, v8
355; CHECK-NEXT:    ret
356  %head = insertelement <vscale x 1 x i1> poison, i1 1, i32 0
357  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
358  %not = xor <vscale x 1 x i1> %vb, %splat
359  %vc = and <vscale x 1 x i1> %va, %not
360  ret <vscale x 1 x i1> %vc
361}
362
363define <vscale x 2 x i1> @vmandn_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
364; CHECK-LABEL: vmandn_vv_nxv2i1:
365; CHECK:       # %bb.0:
366; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
367; CHECK-NEXT:    vmandn.mm v0, v0, v8
368; CHECK-NEXT:    ret
369  %head = insertelement <vscale x 2 x i1> poison, i1 1, i32 0
370  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
371  %not = xor <vscale x 2 x i1> %vb, %splat
372  %vc = and <vscale x 2 x i1> %va, %not
373  ret <vscale x 2 x i1> %vc
374}
375
376define <vscale x 4 x i1> @vmandn_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
377; CHECK-LABEL: vmandn_vv_nxv4i1:
378; CHECK:       # %bb.0:
379; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
380; CHECK-NEXT:    vmandn.mm v0, v0, v8
381; CHECK-NEXT:    ret
382  %head = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
383  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
384  %not = xor <vscale x 4 x i1> %vb, %splat
385  %vc = and <vscale x 4 x i1> %va, %not
386  ret <vscale x 4 x i1> %vc
387}
388
389define <vscale x 8 x i1> @vmandn_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
390; CHECK-LABEL: vmandn_vv_nxv8i1:
391; CHECK:       # %bb.0:
392; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
393; CHECK-NEXT:    vmandn.mm v0, v0, v8
394; CHECK-NEXT:    ret
395  %head = insertelement <vscale x 8 x i1> poison, i1 1, i32 0
396  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
397  %not = xor <vscale x 8 x i1> %vb, %splat
398  %vc = and <vscale x 8 x i1> %va, %not
399  ret <vscale x 8 x i1> %vc
400}
401
402define <vscale x 16 x i1> @vmandn_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
403; CHECK-LABEL: vmandn_vv_nxv16i1:
404; CHECK:       # %bb.0:
405; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
406; CHECK-NEXT:    vmandn.mm v0, v0, v8
407; CHECK-NEXT:    ret
408  %head = insertelement <vscale x 16 x i1> poison, i1 1, i32 0
409  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
410  %not = xor <vscale x 16 x i1> %vb, %splat
411  %vc = and <vscale x 16 x i1> %va, %not
412  ret <vscale x 16 x i1> %vc
413}
414
415define <vscale x 1 x i1> @vmorn_vv_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb) {
416; CHECK-LABEL: vmorn_vv_nxv1i1:
417; CHECK:       # %bb.0:
418; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, mu
419; CHECK-NEXT:    vmorn.mm v0, v0, v8
420; CHECK-NEXT:    ret
421  %head = insertelement <vscale x 1 x i1> poison, i1 1, i32 0
422  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
423  %not = xor <vscale x 1 x i1> %vb, %splat
424  %vc = or <vscale x 1 x i1> %va, %not
425  ret <vscale x 1 x i1> %vc
426}
427
428define <vscale x 2 x i1> @vmorn_vv_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb) {
429; CHECK-LABEL: vmorn_vv_nxv2i1:
430; CHECK:       # %bb.0:
431; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, mu
432; CHECK-NEXT:    vmorn.mm v0, v0, v8
433; CHECK-NEXT:    ret
434  %head = insertelement <vscale x 2 x i1> poison, i1 1, i32 0
435  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
436  %not = xor <vscale x 2 x i1> %vb, %splat
437  %vc = or <vscale x 2 x i1> %va, %not
438  ret <vscale x 2 x i1> %vc
439}
440
441define <vscale x 4 x i1> @vmorn_vv_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb) {
442; CHECK-LABEL: vmorn_vv_nxv4i1:
443; CHECK:       # %bb.0:
444; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, mu
445; CHECK-NEXT:    vmorn.mm v0, v0, v8
446; CHECK-NEXT:    ret
447  %head = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
448  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
449  %not = xor <vscale x 4 x i1> %vb, %splat
450  %vc = or <vscale x 4 x i1> %va, %not
451  ret <vscale x 4 x i1> %vc
452}
453
454define <vscale x 8 x i1> @vmorn_vv_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb) {
455; CHECK-LABEL: vmorn_vv_nxv8i1:
456; CHECK:       # %bb.0:
457; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, mu
458; CHECK-NEXT:    vmorn.mm v0, v0, v8
459; CHECK-NEXT:    ret
460  %head = insertelement <vscale x 8 x i1> poison, i1 1, i32 0
461  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
462  %not = xor <vscale x 8 x i1> %vb, %splat
463  %vc = or <vscale x 8 x i1> %va, %not
464  ret <vscale x 8 x i1> %vc
465}
466
467define <vscale x 16 x i1> @vmorn_vv_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb) {
468; CHECK-LABEL: vmorn_vv_nxv16i1:
469; CHECK:       # %bb.0:
470; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, mu
471; CHECK-NEXT:    vmorn.mm v0, v0, v8
472; CHECK-NEXT:    ret
473  %head = insertelement <vscale x 16 x i1> poison, i1 1, i32 0
474  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
475  %not = xor <vscale x 16 x i1> %vb, %splat
476  %vc = or <vscale x 16 x i1> %va, %not
477  ret <vscale x 16 x i1> %vc
478}
479
480