1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2
3; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1
4
5define void @extract_v2i8_v4i8_0(<4 x i8>* %x, <2 x i8>* %y) {
6; CHECK-LABEL: extract_v2i8_v4i8_0:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, mu
9; CHECK-NEXT:    vle8.v v25, (a0)
10; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
11; CHECK-NEXT:    vse8.v v25, (a1)
12; CHECK-NEXT:    ret
13  %a = load <4 x i8>, <4 x i8>* %x
14  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 0)
15  store <2 x i8> %c, <2 x i8>* %y
16  ret void
17}
18
19define void @extract_v2i8_v4i8_2(<4 x i8>* %x, <2 x i8>* %y) {
20; CHECK-LABEL: extract_v2i8_v4i8_2:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, mu
23; CHECK-NEXT:    vle8.v v25, (a0)
24; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, mu
25; CHECK-NEXT:    vslidedown.vi v25, v25, 2
26; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
27; CHECK-NEXT:    vse8.v v25, (a1)
28; CHECK-NEXT:    ret
29  %a = load <4 x i8>, <4 x i8>* %x
30  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 2)
31  store <2 x i8> %c, <2 x i8>* %y
32  ret void
33}
34
35define void @extract_v2i8_v8i8_0(<8 x i8>* %x, <2 x i8>* %y) {
36; CHECK-LABEL: extract_v2i8_v8i8_0:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
39; CHECK-NEXT:    vle8.v v25, (a0)
40; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
41; CHECK-NEXT:    vse8.v v25, (a1)
42; CHECK-NEXT:    ret
43  %a = load <8 x i8>, <8 x i8>* %x
44  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 0)
45  store <2 x i8> %c, <2 x i8>* %y
46  ret void
47}
48
49define void @extract_v2i8_v8i8_6(<8 x i8>* %x, <2 x i8>* %y) {
50; CHECK-LABEL: extract_v2i8_v8i8_6:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
53; CHECK-NEXT:    vle8.v v25, (a0)
54; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, ta, mu
55; CHECK-NEXT:    vslidedown.vi v25, v25, 6
56; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
57; CHECK-NEXT:    vse8.v v25, (a1)
58; CHECK-NEXT:    ret
59  %a = load <8 x i8>, <8 x i8>* %x
60  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 6)
61  store <2 x i8> %c, <2 x i8>* %y
62  ret void
63}
64
65define void @extract_v2i32_v8i32_0(<8 x i32>* %x, <2 x i32>* %y) {
66; LMULMAX2-LABEL: extract_v2i32_v8i32_0:
67; LMULMAX2:       # %bb.0:
68; LMULMAX2-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
69; LMULMAX2-NEXT:    vle32.v v26, (a0)
70; LMULMAX2-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
71; LMULMAX2-NEXT:    vse32.v v26, (a1)
72; LMULMAX2-NEXT:    ret
73;
74; LMULMAX1-LABEL: extract_v2i32_v8i32_0:
75; LMULMAX1:       # %bb.0:
76; LMULMAX1-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
77; LMULMAX1-NEXT:    vle32.v v25, (a0)
78; LMULMAX1-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
79; LMULMAX1-NEXT:    vse32.v v25, (a1)
80; LMULMAX1-NEXT:    ret
81  %a = load <8 x i32>, <8 x i32>* %x
82  %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 0)
83  store <2 x i32> %c, <2 x i32>* %y
84  ret void
85}
86
87define void @extract_v2i32_v8i32_2(<8 x i32>* %x, <2 x i32>* %y) {
88; LMULMAX2-LABEL: extract_v2i32_v8i32_2:
89; LMULMAX2:       # %bb.0:
90; LMULMAX2-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
91; LMULMAX2-NEXT:    vle32.v v26, (a0)
92; LMULMAX2-NEXT:    vsetivli zero, 2, e32, m2, ta, mu
93; LMULMAX2-NEXT:    vslidedown.vi v26, v26, 2
94; LMULMAX2-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
95; LMULMAX2-NEXT:    vse32.v v26, (a1)
96; LMULMAX2-NEXT:    ret
97;
98; LMULMAX1-LABEL: extract_v2i32_v8i32_2:
99; LMULMAX1:       # %bb.0:
100; LMULMAX1-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
101; LMULMAX1-NEXT:    vle32.v v25, (a0)
102; LMULMAX1-NEXT:    vsetivli zero, 2, e32, m1, ta, mu
103; LMULMAX1-NEXT:    vslidedown.vi v25, v25, 2
104; LMULMAX1-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
105; LMULMAX1-NEXT:    vse32.v v25, (a1)
106; LMULMAX1-NEXT:    ret
107  %a = load <8 x i32>, <8 x i32>* %x
108  %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 2)
109  store <2 x i32> %c, <2 x i32>* %y
110  ret void
111}
112
113define void @extract_v2i32_v8i32_6(<8 x i32>* %x, <2 x i32>* %y) {
114; LMULMAX2-LABEL: extract_v2i32_v8i32_6:
115; LMULMAX2:       # %bb.0:
116; LMULMAX2-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
117; LMULMAX2-NEXT:    vle32.v v26, (a0)
118; LMULMAX2-NEXT:    vsetivli zero, 2, e32, m2, ta, mu
119; LMULMAX2-NEXT:    vslidedown.vi v26, v26, 6
120; LMULMAX2-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
121; LMULMAX2-NEXT:    vse32.v v26, (a1)
122; LMULMAX2-NEXT:    ret
123;
124; LMULMAX1-LABEL: extract_v2i32_v8i32_6:
125; LMULMAX1:       # %bb.0:
126; LMULMAX1-NEXT:    addi a0, a0, 16
127; LMULMAX1-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
128; LMULMAX1-NEXT:    vle32.v v25, (a0)
129; LMULMAX1-NEXT:    vsetivli zero, 2, e32, m1, ta, mu
130; LMULMAX1-NEXT:    vslidedown.vi v25, v25, 2
131; LMULMAX1-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
132; LMULMAX1-NEXT:    vse32.v v25, (a1)
133; LMULMAX1-NEXT:    ret
134  %a = load <8 x i32>, <8 x i32>* %x
135  %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 6)
136  store <2 x i32> %c, <2 x i32>* %y
137  ret void
138}
139
140define void @extract_v2i32_nxv16i32_0(<vscale x 16 x i32> %x, <2 x i32>* %y) {
141; CHECK-LABEL: extract_v2i32_nxv16i32_0:
142; CHECK:       # %bb.0:
143; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
144; CHECK-NEXT:    vse32.v v8, (a0)
145; CHECK-NEXT:    ret
146  %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 0)
147  store <2 x i32> %c, <2 x i32>* %y
148  ret void
149}
150
151define void @extract_v2i32_nxv16i32_8(<vscale x 16 x i32> %x, <2 x i32>* %y) {
152; CHECK-LABEL: extract_v2i32_nxv16i32_8:
153; CHECK:       # %bb.0:
154; CHECK-NEXT:    vsetivli zero, 2, e32, m8, ta, mu
155; CHECK-NEXT:    vslidedown.vi v8, v8, 6
156; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, mu
157; CHECK-NEXT:    vse32.v v8, (a0)
158; CHECK-NEXT:    ret
159  %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 6)
160  store <2 x i32> %c, <2 x i32>* %y
161  ret void
162}
163
164define void @extract_v2i8_nxv2i8_0(<vscale x 2 x i8> %x, <2 x i8>* %y) {
165; CHECK-LABEL: extract_v2i8_nxv2i8_0:
166; CHECK:       # %bb.0:
167; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
168; CHECK-NEXT:    vse8.v v8, (a0)
169; CHECK-NEXT:    ret
170  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 0)
171  store <2 x i8> %c, <2 x i8>* %y
172  ret void
173}
174
175define void @extract_v2i8_nxv2i8_2(<vscale x 2 x i8> %x, <2 x i8>* %y) {
176; CHECK-LABEL: extract_v2i8_nxv2i8_2:
177; CHECK:       # %bb.0:
178; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, mu
179; CHECK-NEXT:    vslidedown.vi v25, v8, 2
180; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
181; CHECK-NEXT:    vse8.v v25, (a0)
182; CHECK-NEXT:    ret
183  %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 2)
184  store <2 x i8> %c, <2 x i8>* %y
185  ret void
186}
187
188define void @extract_v8i32_nxv16i32_8(<vscale x 16 x i32> %x, <8 x i32>* %y) {
189; LMULMAX2-LABEL: extract_v8i32_nxv16i32_8:
190; LMULMAX2:       # %bb.0:
191; LMULMAX2-NEXT:    vsetivli zero, 8, e32, m8, ta, mu
192; LMULMAX2-NEXT:    vslidedown.vi v8, v8, 8
193; LMULMAX2-NEXT:    vsetivli zero, 8, e32, m2, ta, mu
194; LMULMAX2-NEXT:    vse32.v v8, (a0)
195; LMULMAX2-NEXT:    ret
196;
197; LMULMAX1-LABEL: extract_v8i32_nxv16i32_8:
198; LMULMAX1:       # %bb.0:
199; LMULMAX1-NEXT:    vsetivli zero, 4, e32, m8, ta, mu
200; LMULMAX1-NEXT:    vslidedown.vi v16, v8, 8
201; LMULMAX1-NEXT:    vslidedown.vi v8, v8, 12
202; LMULMAX1-NEXT:    addi a1, a0, 16
203; LMULMAX1-NEXT:    vsetivli zero, 4, e32, m1, ta, mu
204; LMULMAX1-NEXT:    vse32.v v8, (a1)
205; LMULMAX1-NEXT:    vse32.v v16, (a0)
206; LMULMAX1-NEXT:    ret
207  %c = call <8 x i32> @llvm.experimental.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %x, i64 8)
208  store <8 x i32> %c, <8 x i32>* %y
209  ret void
210}
211
212define void @extract_v8i1_v64i1_0(<64 x i1>* %x, <8 x i1>* %y) {
213; LMULMAX2-LABEL: extract_v8i1_v64i1_0:
214; LMULMAX2:       # %bb.0:
215; LMULMAX2-NEXT:    addi a2, zero, 32
216; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
217; LMULMAX2-NEXT:    vle1.v v25, (a0)
218; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
219; LMULMAX2-NEXT:    vse1.v v25, (a1)
220; LMULMAX2-NEXT:    ret
221;
222; LMULMAX1-LABEL: extract_v8i1_v64i1_0:
223; LMULMAX1:       # %bb.0:
224; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
225; LMULMAX1-NEXT:    vle1.v v25, (a0)
226; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
227; LMULMAX1-NEXT:    vse1.v v25, (a1)
228; LMULMAX1-NEXT:    ret
229  %a = load <64 x i1>, <64 x i1>* %x
230  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 0)
231  store <8 x i1> %c, <8 x i1>* %y
232  ret void
233}
234
235define void @extract_v8i1_v64i1_8(<64 x i1>* %x, <8 x i1>* %y) {
236; LMULMAX2-LABEL: extract_v8i1_v64i1_8:
237; LMULMAX2:       # %bb.0:
238; LMULMAX2-NEXT:    addi a2, zero, 32
239; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
240; LMULMAX2-NEXT:    vle1.v v25, (a0)
241; LMULMAX2-NEXT:    vsetivli zero, 1, e8, mf4, ta, mu
242; LMULMAX2-NEXT:    vslidedown.vi v25, v25, 1
243; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
244; LMULMAX2-NEXT:    vse1.v v25, (a1)
245; LMULMAX2-NEXT:    ret
246;
247; LMULMAX1-LABEL: extract_v8i1_v64i1_8:
248; LMULMAX1:       # %bb.0:
249; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
250; LMULMAX1-NEXT:    vle1.v v25, (a0)
251; LMULMAX1-NEXT:    vsetivli zero, 1, e8, mf8, ta, mu
252; LMULMAX1-NEXT:    vslidedown.vi v25, v25, 1
253; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
254; LMULMAX1-NEXT:    vse1.v v25, (a1)
255; LMULMAX1-NEXT:    ret
256  %a = load <64 x i1>, <64 x i1>* %x
257  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 8)
258  store <8 x i1> %c, <8 x i1>* %y
259  ret void
260}
261
262define void @extract_v8i1_v64i1_48(<64 x i1>* %x, <8 x i1>* %y) {
263; LMULMAX2-LABEL: extract_v8i1_v64i1_48:
264; LMULMAX2:       # %bb.0:
265; LMULMAX2-NEXT:    addi a0, a0, 4
266; LMULMAX2-NEXT:    addi a2, zero, 32
267; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
268; LMULMAX2-NEXT:    vle1.v v25, (a0)
269; LMULMAX2-NEXT:    vsetivli zero, 1, e8, mf4, ta, mu
270; LMULMAX2-NEXT:    vslidedown.vi v25, v25, 2
271; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
272; LMULMAX2-NEXT:    vse1.v v25, (a1)
273; LMULMAX2-NEXT:    ret
274;
275; LMULMAX1-LABEL: extract_v8i1_v64i1_48:
276; LMULMAX1:       # %bb.0:
277; LMULMAX1-NEXT:    addi a0, a0, 6
278; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
279; LMULMAX1-NEXT:    vle1.v v25, (a0)
280; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
281; LMULMAX1-NEXT:    vse1.v v25, (a1)
282; LMULMAX1-NEXT:    ret
283  %a = load <64 x i1>, <64 x i1>* %x
284  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 48)
285  store <8 x i1> %c, <8 x i1>* %y
286  ret void
287}
288
289define void @extract_v8i1_nxv2i1_0(<vscale x 2 x i1> %x, <8 x i1>* %y) {
290; CHECK-LABEL: extract_v8i1_nxv2i1_0:
291; CHECK:       # %bb.0:
292; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
293; CHECK-NEXT:    vse1.v v0, (a0)
294; CHECK-NEXT:    ret
295  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %x, i64 0)
296  store <8 x i1> %c, <8 x i1>* %y
297  ret void
298}
299
300define void @extract_v8i1_nxv64i1_0(<vscale x 64 x i1> %x, <8 x i1>* %y) {
301; CHECK-LABEL: extract_v8i1_nxv64i1_0:
302; CHECK:       # %bb.0:
303; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
304; CHECK-NEXT:    vse1.v v0, (a0)
305; CHECK-NEXT:    ret
306  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 0)
307  store <8 x i1> %c, <8 x i1>* %y
308  ret void
309}
310
311define void @extract_v8i1_nxv64i1_8(<vscale x 64 x i1> %x, <8 x i1>* %y) {
312; CHECK-LABEL: extract_v8i1_nxv64i1_8:
313; CHECK:       # %bb.0:
314; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, mu
315; CHECK-NEXT:    vslidedown.vi v25, v0, 1
316; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
317; CHECK-NEXT:    vse1.v v25, (a0)
318; CHECK-NEXT:    ret
319  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 8)
320  store <8 x i1> %c, <8 x i1>* %y
321  ret void
322}
323
324define void @extract_v8i1_nxv64i1_48(<vscale x 64 x i1> %x, <8 x i1>* %y) {
325; CHECK-LABEL: extract_v8i1_nxv64i1_48:
326; CHECK:       # %bb.0:
327; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, mu
328; CHECK-NEXT:    vslidedown.vi v25, v0, 6
329; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
330; CHECK-NEXT:    vse1.v v25, (a0)
331; CHECK-NEXT:    ret
332  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 48)
333  store <8 x i1> %c, <8 x i1>* %y
334  ret void
335}
336
337
338define void @extract_v2i1_v64i1_0(<64 x i1>* %x, <2 x i1>* %y) {
339; LMULMAX2-LABEL: extract_v2i1_v64i1_0:
340; LMULMAX2:       # %bb.0:
341; LMULMAX2-NEXT:    addi a2, zero, 32
342; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
343; LMULMAX2-NEXT:    vle1.v v0, (a0)
344; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
345; LMULMAX2-NEXT:    vmv.v.i v25, 0
346; LMULMAX2-NEXT:    vmerge.vim v25, v25, 1, v0
347; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
348; LMULMAX2-NEXT:    vmv.v.i v26, 0
349; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
350; LMULMAX2-NEXT:    vslideup.vi v26, v25, 0
351; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
352; LMULMAX2-NEXT:    vmsne.vi v25, v26, 0
353; LMULMAX2-NEXT:    vse1.v v25, (a1)
354; LMULMAX2-NEXT:    ret
355;
356; LMULMAX1-LABEL: extract_v2i1_v64i1_0:
357; LMULMAX1:       # %bb.0:
358; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
359; LMULMAX1-NEXT:    vle1.v v0, (a0)
360; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
361; LMULMAX1-NEXT:    vmv.v.i v25, 0
362; LMULMAX1-NEXT:    vmerge.vim v25, v25, 1, v0
363; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
364; LMULMAX1-NEXT:    vmv.v.i v26, 0
365; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
366; LMULMAX1-NEXT:    vslideup.vi v26, v25, 0
367; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
368; LMULMAX1-NEXT:    vmsne.vi v25, v26, 0
369; LMULMAX1-NEXT:    vse1.v v25, (a1)
370; LMULMAX1-NEXT:    ret
371  %a = load <64 x i1>, <64 x i1>* %x
372  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 0)
373  store <2 x i1> %c, <2 x i1>* %y
374  ret void
375}
376
377define void @extract_v2i1_v64i1_2(<64 x i1>* %x, <2 x i1>* %y) {
378; LMULMAX2-LABEL: extract_v2i1_v64i1_2:
379; LMULMAX2:       # %bb.0:
380; LMULMAX2-NEXT:    addi a2, zero, 32
381; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
382; LMULMAX2-NEXT:    vle1.v v0, (a0)
383; LMULMAX2-NEXT:    vmv.v.i v26, 0
384; LMULMAX2-NEXT:    vmerge.vim v26, v26, 1, v0
385; LMULMAX2-NEXT:    vsetivli zero, 2, e8, m2, ta, mu
386; LMULMAX2-NEXT:    vslidedown.vi v26, v26, 2
387; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
388; LMULMAX2-NEXT:    vmsne.vi v0, v26, 0
389; LMULMAX2-NEXT:    vmv.v.i v25, 0
390; LMULMAX2-NEXT:    vmerge.vim v25, v25, 1, v0
391; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
392; LMULMAX2-NEXT:    vmv.v.i v26, 0
393; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
394; LMULMAX2-NEXT:    vslideup.vi v26, v25, 0
395; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
396; LMULMAX2-NEXT:    vmsne.vi v25, v26, 0
397; LMULMAX2-NEXT:    vse1.v v25, (a1)
398; LMULMAX2-NEXT:    ret
399;
400; LMULMAX1-LABEL: extract_v2i1_v64i1_2:
401; LMULMAX1:       # %bb.0:
402; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
403; LMULMAX1-NEXT:    vle1.v v0, (a0)
404; LMULMAX1-NEXT:    vmv.v.i v25, 0
405; LMULMAX1-NEXT:    vmerge.vim v25, v25, 1, v0
406; LMULMAX1-NEXT:    vsetivli zero, 2, e8, m1, ta, mu
407; LMULMAX1-NEXT:    vslidedown.vi v25, v25, 2
408; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
409; LMULMAX1-NEXT:    vmsne.vi v0, v25, 0
410; LMULMAX1-NEXT:    vmv.v.i v25, 0
411; LMULMAX1-NEXT:    vmerge.vim v25, v25, 1, v0
412; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
413; LMULMAX1-NEXT:    vmv.v.i v26, 0
414; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
415; LMULMAX1-NEXT:    vslideup.vi v26, v25, 0
416; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
417; LMULMAX1-NEXT:    vmsne.vi v25, v26, 0
418; LMULMAX1-NEXT:    vse1.v v25, (a1)
419; LMULMAX1-NEXT:    ret
420  %a = load <64 x i1>, <64 x i1>* %x
421  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 2)
422  store <2 x i1> %c, <2 x i1>* %y
423  ret void
424}
425
426define void @extract_v2i1_v64i1_42(<64 x i1>* %x, <2 x i1>* %y) {
427; LMULMAX2-LABEL: extract_v2i1_v64i1_42:
428; LMULMAX2:       # %bb.0:
429; LMULMAX2-NEXT:    addi a0, a0, 4
430; LMULMAX2-NEXT:    addi a2, zero, 32
431; LMULMAX2-NEXT:    vsetvli zero, a2, e8, m2, ta, mu
432; LMULMAX2-NEXT:    vle1.v v0, (a0)
433; LMULMAX2-NEXT:    vmv.v.i v26, 0
434; LMULMAX2-NEXT:    vmerge.vim v26, v26, 1, v0
435; LMULMAX2-NEXT:    vsetivli zero, 2, e8, m2, ta, mu
436; LMULMAX2-NEXT:    vslidedown.vi v26, v26, 10
437; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
438; LMULMAX2-NEXT:    vmsne.vi v0, v26, 0
439; LMULMAX2-NEXT:    vmv.v.i v25, 0
440; LMULMAX2-NEXT:    vmerge.vim v25, v25, 1, v0
441; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
442; LMULMAX2-NEXT:    vmv.v.i v26, 0
443; LMULMAX2-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
444; LMULMAX2-NEXT:    vslideup.vi v26, v25, 0
445; LMULMAX2-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
446; LMULMAX2-NEXT:    vmsne.vi v25, v26, 0
447; LMULMAX2-NEXT:    vse1.v v25, (a1)
448; LMULMAX2-NEXT:    ret
449;
450; LMULMAX1-LABEL: extract_v2i1_v64i1_42:
451; LMULMAX1:       # %bb.0:
452; LMULMAX1-NEXT:    addi a0, a0, 4
453; LMULMAX1-NEXT:    vsetivli zero, 16, e8, m1, ta, mu
454; LMULMAX1-NEXT:    vle1.v v0, (a0)
455; LMULMAX1-NEXT:    vmv.v.i v25, 0
456; LMULMAX1-NEXT:    vmerge.vim v25, v25, 1, v0
457; LMULMAX1-NEXT:    vsetivli zero, 2, e8, m1, ta, mu
458; LMULMAX1-NEXT:    vslidedown.vi v25, v25, 10
459; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
460; LMULMAX1-NEXT:    vmsne.vi v0, v25, 0
461; LMULMAX1-NEXT:    vmv.v.i v25, 0
462; LMULMAX1-NEXT:    vmerge.vim v25, v25, 1, v0
463; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
464; LMULMAX1-NEXT:    vmv.v.i v26, 0
465; LMULMAX1-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
466; LMULMAX1-NEXT:    vslideup.vi v26, v25, 0
467; LMULMAX1-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
468; LMULMAX1-NEXT:    vmsne.vi v25, v26, 0
469; LMULMAX1-NEXT:    vse1.v v25, (a1)
470; LMULMAX1-NEXT:    ret
471  %a = load <64 x i1>, <64 x i1>* %x
472  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 42)
473  store <2 x i1> %c, <2 x i1>* %y
474  ret void
475}
476
477define void @extract_v2i1_nxv2i1_0(<vscale x 2 x i1> %x, <2 x i1>* %y) {
478; CHECK-LABEL: extract_v2i1_nxv2i1_0:
479; CHECK:       # %bb.0:
480; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
481; CHECK-NEXT:    vmv.v.i v25, 0
482; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
483; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
484; CHECK-NEXT:    vmv.v.i v26, 0
485; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
486; CHECK-NEXT:    vslideup.vi v26, v25, 0
487; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
488; CHECK-NEXT:    vmsne.vi v25, v26, 0
489; CHECK-NEXT:    vse1.v v25, (a0)
490; CHECK-NEXT:    ret
491  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 0)
492  store <2 x i1> %c, <2 x i1>* %y
493  ret void
494}
495
496define void @extract_v2i1_nxv2i1_2(<vscale x 2 x i1> %x, <2 x i1>* %y) {
497; CHECK-LABEL: extract_v2i1_nxv2i1_2:
498; CHECK:       # %bb.0:
499; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, mu
500; CHECK-NEXT:    vmv.v.i v25, 0
501; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
502; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, ta, mu
503; CHECK-NEXT:    vslidedown.vi v25, v25, 2
504; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
505; CHECK-NEXT:    vmsne.vi v0, v25, 0
506; CHECK-NEXT:    vmv.v.i v25, 0
507; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
508; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
509; CHECK-NEXT:    vmv.v.i v26, 0
510; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
511; CHECK-NEXT:    vslideup.vi v26, v25, 0
512; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
513; CHECK-NEXT:    vmsne.vi v25, v26, 0
514; CHECK-NEXT:    vse1.v v25, (a0)
515; CHECK-NEXT:    ret
516  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 2)
517  store <2 x i1> %c, <2 x i1>* %y
518  ret void
519}
520
521define void @extract_v2i1_nxv64i1_0(<vscale x 64 x i1> %x, <2 x i1>* %y) {
522; CHECK-LABEL: extract_v2i1_nxv64i1_0:
523; CHECK:       # %bb.0:
524; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
525; CHECK-NEXT:    vmv.v.i v25, 0
526; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
527; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
528; CHECK-NEXT:    vmv.v.i v26, 0
529; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
530; CHECK-NEXT:    vslideup.vi v26, v25, 0
531; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
532; CHECK-NEXT:    vmsne.vi v25, v26, 0
533; CHECK-NEXT:    vse1.v v25, (a0)
534; CHECK-NEXT:    ret
535  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 0)
536  store <2 x i1> %c, <2 x i1>* %y
537  ret void
538}
539
540define void @extract_v2i1_nxv64i1_2(<vscale x 64 x i1> %x, <2 x i1>* %y) {
541; CHECK-LABEL: extract_v2i1_nxv64i1_2:
542; CHECK:       # %bb.0:
543; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, mu
544; CHECK-NEXT:    vmv.v.i v8, 0
545; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
546; CHECK-NEXT:    vsetivli zero, 2, e8, m8, ta, mu
547; CHECK-NEXT:    vslidedown.vi v8, v8, 2
548; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
549; CHECK-NEXT:    vmsne.vi v0, v8, 0
550; CHECK-NEXT:    vmv.v.i v25, 0
551; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
552; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
553; CHECK-NEXT:    vmv.v.i v26, 0
554; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
555; CHECK-NEXT:    vslideup.vi v26, v25, 0
556; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
557; CHECK-NEXT:    vmsne.vi v25, v26, 0
558; CHECK-NEXT:    vse1.v v25, (a0)
559; CHECK-NEXT:    ret
560  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 2)
561  store <2 x i1> %c, <2 x i1>* %y
562  ret void
563}
564
565define void @extract_v2i1_nxv64i1_42(<vscale x 64 x i1> %x, <2 x i1>* %y) {
566; CHECK-LABEL: extract_v2i1_nxv64i1_42:
567; CHECK:       # %bb.0:
568; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, mu
569; CHECK-NEXT:    vmv.v.i v8, 0
570; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
571; CHECK-NEXT:    addi a1, zero, 42
572; CHECK-NEXT:    vsetivli zero, 2, e8, m8, ta, mu
573; CHECK-NEXT:    vslidedown.vx v8, v8, a1
574; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
575; CHECK-NEXT:    vmsne.vi v0, v8, 0
576; CHECK-NEXT:    vmv.v.i v25, 0
577; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
578; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
579; CHECK-NEXT:    vmv.v.i v26, 0
580; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
581; CHECK-NEXT:    vslideup.vi v26, v25, 0
582; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
583; CHECK-NEXT:    vmsne.vi v25, v26, 0
584; CHECK-NEXT:    vse1.v v25, (a0)
585; CHECK-NEXT:    ret
586  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 42)
587  store <2 x i1> %c, <2 x i1>* %y
588  ret void
589}
590
591define void @extract_v2i1_nxv32i1_26(<vscale x 32 x i1> %x, <2 x i1>* %y) {
592; CHECK-LABEL: extract_v2i1_nxv32i1_26:
593; CHECK:       # %bb.0:
594; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, mu
595; CHECK-NEXT:    vmv.v.i v28, 0
596; CHECK-NEXT:    vmerge.vim v28, v28, 1, v0
597; CHECK-NEXT:    vsetivli zero, 2, e8, m4, ta, mu
598; CHECK-NEXT:    vslidedown.vi v28, v28, 26
599; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, mu
600; CHECK-NEXT:    vmsne.vi v0, v28, 0
601; CHECK-NEXT:    vmv.v.i v25, 0
602; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
603; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
604; CHECK-NEXT:    vmv.v.i v26, 0
605; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, mu
606; CHECK-NEXT:    vslideup.vi v26, v25, 0
607; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
608; CHECK-NEXT:    vmsne.vi v25, v26, 0
609; CHECK-NEXT:    vse1.v v25, (a0)
610; CHECK-NEXT:    ret
611  %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %x, i64 26)
612  store <2 x i1> %c, <2 x i1>* %y
613  ret void
614}
615
616define void @extract_v8i1_nxv32i1_16(<vscale x 32 x i1> %x, <8 x i1>* %y) {
617; CHECK-LABEL: extract_v8i1_nxv32i1_16:
618; CHECK:       # %bb.0:
619; CHECK-NEXT:    vsetivli zero, 1, e8, mf2, ta, mu
620; CHECK-NEXT:    vslidedown.vi v25, v0, 2
621; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
622; CHECK-NEXT:    vse1.v v25, (a0)
623; CHECK-NEXT:    ret
624  %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %x, i64 16)
625  store <8 x i1> %c, <8 x i1>* %y
626  ret void
627}
628
629declare <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %vec, i64 %idx)
630declare <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %vec, i64 %idx)
631
632declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx)
633declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx)
634
635declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx)
636declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx)
637
638declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx)
639declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx)
640
641declare <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %vec, i64 %idx)
642declare <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %vec, i64 %idx)
643declare <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %vec, i64 %idx)
644
645declare <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %vec, i64 %idx)
646
647declare <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
648declare <8 x i32> @llvm.experimental.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
649