1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple riscv32 -mattr=+m,+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc -mtriple riscv64 -mattr=+m,+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s
5 define <vscale x 4 x i32> @extract_nxv8i32_nxv4i32_0(<vscale x 8 x i32> %vec) {
6 ; CHECK-LABEL: extract_nxv8i32_nxv4i32_0:
9 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, i64 0)
10 ret <vscale x 4 x i32> %c
13 define <vscale x 4 x i32> @extract_nxv8i32_nxv4i32_4(<vscale x 8 x i32> %vec) {
14 ; CHECK-LABEL: extract_nxv8i32_nxv4i32_4:
16 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
17 ; CHECK-NEXT: vmv2r.v v8, v10
19 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, i64 4)
20 ret <vscale x 4 x i32> %c
23 define <vscale x 2 x i32> @extract_nxv8i32_nxv2i32_0(<vscale x 8 x i32> %vec) {
24 ; CHECK-LABEL: extract_nxv8i32_nxv2i32_0:
27 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, i64 0)
28 ret <vscale x 2 x i32> %c
31 define <vscale x 2 x i32> @extract_nxv8i32_nxv2i32_2(<vscale x 8 x i32> %vec) {
32 ; CHECK-LABEL: extract_nxv8i32_nxv2i32_2:
34 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
35 ; CHECK-NEXT: vmv1r.v v8, v9
37 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, i64 2)
38 ret <vscale x 2 x i32> %c
41 define <vscale x 2 x i32> @extract_nxv8i32_nxv2i32_4(<vscale x 8 x i32> %vec) {
42 ; CHECK-LABEL: extract_nxv8i32_nxv2i32_4:
44 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
45 ; CHECK-NEXT: vmv1r.v v8, v10
47 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, i64 4)
48 ret <vscale x 2 x i32> %c
51 define <vscale x 2 x i32> @extract_nxv8i32_nxv2i32_6(<vscale x 8 x i32> %vec) {
52 ; CHECK-LABEL: extract_nxv8i32_nxv2i32_6:
54 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
55 ; CHECK-NEXT: vmv1r.v v8, v11
57 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, i64 6)
58 ret <vscale x 2 x i32> %c
61 define <vscale x 8 x i32> @extract_nxv16i32_nxv8i32_0(<vscale x 16 x i32> %vec) {
62 ; CHECK-LABEL: extract_nxv16i32_nxv8i32_0:
65 %c = call <vscale x 8 x i32> @llvm.vector.extract.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 0)
66 ret <vscale x 8 x i32> %c
69 define <vscale x 8 x i32> @extract_nxv16i32_nxv8i32_8(<vscale x 16 x i32> %vec) {
70 ; CHECK-LABEL: extract_nxv16i32_nxv8i32_8:
72 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
73 ; CHECK-NEXT: vmv4r.v v8, v12
75 %c = call <vscale x 8 x i32> @llvm.vector.extract.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 8)
76 ret <vscale x 8 x i32> %c
79 define <vscale x 4 x i32> @extract_nxv16i32_nxv4i32_0(<vscale x 16 x i32> %vec) {
80 ; CHECK-LABEL: extract_nxv16i32_nxv4i32_0:
83 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, i64 0)
84 ret <vscale x 4 x i32> %c
87 define <vscale x 4 x i32> @extract_nxv16i32_nxv4i32_4(<vscale x 16 x i32> %vec) {
88 ; CHECK-LABEL: extract_nxv16i32_nxv4i32_4:
90 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
91 ; CHECK-NEXT: vmv2r.v v8, v10
93 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, i64 4)
94 ret <vscale x 4 x i32> %c
97 define <vscale x 4 x i32> @extract_nxv16i32_nxv4i32_8(<vscale x 16 x i32> %vec) {
98 ; CHECK-LABEL: extract_nxv16i32_nxv4i32_8:
100 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
101 ; CHECK-NEXT: vmv2r.v v8, v12
103 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, i64 8)
104 ret <vscale x 4 x i32> %c
107 define <vscale x 4 x i32> @extract_nxv16i32_nxv4i32_12(<vscale x 16 x i32> %vec) {
108 ; CHECK-LABEL: extract_nxv16i32_nxv4i32_12:
110 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
111 ; CHECK-NEXT: vmv2r.v v8, v14
113 %c = call <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, i64 12)
114 ret <vscale x 4 x i32> %c
117 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_0(<vscale x 16 x i32> %vec) {
118 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_0:
121 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 0)
122 ret <vscale x 2 x i32> %c
125 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_2(<vscale x 16 x i32> %vec) {
126 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_2:
128 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
129 ; CHECK-NEXT: vmv1r.v v8, v9
131 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 2)
132 ret <vscale x 2 x i32> %c
135 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_4(<vscale x 16 x i32> %vec) {
136 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_4:
138 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
139 ; CHECK-NEXT: vmv1r.v v8, v10
141 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 4)
142 ret <vscale x 2 x i32> %c
145 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_6(<vscale x 16 x i32> %vec) {
146 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_6:
148 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
149 ; CHECK-NEXT: vmv1r.v v8, v11
151 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 6)
152 ret <vscale x 2 x i32> %c
155 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_8(<vscale x 16 x i32> %vec) {
156 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_8:
158 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
159 ; CHECK-NEXT: vmv1r.v v8, v12
161 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 8)
162 ret <vscale x 2 x i32> %c
165 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_10(<vscale x 16 x i32> %vec) {
166 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_10:
168 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
169 ; CHECK-NEXT: vmv1r.v v8, v13
171 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 10)
172 ret <vscale x 2 x i32> %c
175 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_12(<vscale x 16 x i32> %vec) {
176 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_12:
178 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
179 ; CHECK-NEXT: vmv1r.v v8, v14
181 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 12)
182 ret <vscale x 2 x i32> %c
185 define <vscale x 2 x i32> @extract_nxv16i32_nxv2i32_14(<vscale x 16 x i32> %vec) {
186 ; CHECK-LABEL: extract_nxv16i32_nxv2i32_14:
188 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
189 ; CHECK-NEXT: vmv1r.v v8, v15
191 %c = call <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 14)
192 ret <vscale x 2 x i32> %c
195 define <vscale x 1 x i32> @extract_nxv16i32_nxv1i32_0(<vscale x 16 x i32> %vec) {
196 ; CHECK-LABEL: extract_nxv16i32_nxv1i32_0:
199 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 0)
200 ret <vscale x 1 x i32> %c
203 define <vscale x 1 x i32> @extract_nxv16i32_nxv1i32_1(<vscale x 16 x i32> %vec) {
204 ; CHECK-LABEL: extract_nxv16i32_nxv1i32_1:
206 ; CHECK-NEXT: csrr a0, vlenb
207 ; CHECK-NEXT: srli a0, a0, 3
208 ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
209 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
211 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 1)
212 ret <vscale x 1 x i32> %c
215 define <vscale x 1 x i32> @extract_nxv16i32_nxv1i32_3(<vscale x 16 x i32> %vec) {
216 ; CHECK-LABEL: extract_nxv16i32_nxv1i32_3:
218 ; CHECK-NEXT: csrr a0, vlenb
219 ; CHECK-NEXT: srli a0, a0, 3
220 ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
221 ; CHECK-NEXT: vslidedown.vx v8, v9, a0
223 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 3)
224 ret <vscale x 1 x i32> %c
227 define <vscale x 1 x i32> @extract_nxv16i32_nxv1i32_15(<vscale x 16 x i32> %vec) {
228 ; CHECK-LABEL: extract_nxv16i32_nxv1i32_15:
230 ; CHECK-NEXT: csrr a0, vlenb
231 ; CHECK-NEXT: srli a0, a0, 3
232 ; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
233 ; CHECK-NEXT: vslidedown.vx v8, v15, a0
235 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 15)
236 ret <vscale x 1 x i32> %c
239 define <vscale x 1 x i32> @extract_nxv16i32_nxv1i32_2(<vscale x 16 x i32> %vec) {
240 ; CHECK-LABEL: extract_nxv16i32_nxv1i32_2:
242 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
243 ; CHECK-NEXT: vmv1r.v v8, v9
245 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 2)
246 ret <vscale x 1 x i32> %c
249 define <vscale x 1 x i32> @extract_nxv2i32_nxv1i32_0(<vscale x 2 x i32> %vec) {
250 ; CHECK-LABEL: extract_nxv2i32_nxv1i32_0:
253 %c = call <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv2i32(<vscale x 2 x i32> %vec, i64 0)
254 ret <vscale x 1 x i32> %c
257 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_0(<vscale x 32 x i8> %vec) {
258 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_0:
261 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 0)
262 ret <vscale x 2 x i8> %c
265 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_2(<vscale x 32 x i8> %vec) {
266 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_2:
268 ; CHECK-NEXT: csrr a0, vlenb
269 ; CHECK-NEXT: srli a0, a0, 2
270 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
271 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
273 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 2)
274 ret <vscale x 2 x i8> %c
277 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_4(<vscale x 32 x i8> %vec) {
278 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_4:
280 ; CHECK-NEXT: csrr a0, vlenb
281 ; CHECK-NEXT: srli a0, a0, 1
282 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
283 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
285 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 4)
286 ret <vscale x 2 x i8> %c
289 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_6(<vscale x 32 x i8> %vec) {
290 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_6:
292 ; CHECK-NEXT: csrr a0, vlenb
293 ; CHECK-NEXT: srli a1, a0, 3
294 ; CHECK-NEXT: slli a1, a1, 1
295 ; CHECK-NEXT: sub a0, a0, a1
296 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
297 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
299 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 6)
300 ret <vscale x 2 x i8> %c
303 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_8(<vscale x 32 x i8> %vec) {
304 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_8:
306 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
307 ; CHECK-NEXT: vmv1r.v v8, v9
309 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 8)
310 ret <vscale x 2 x i8> %c
313 define <vscale x 2 x i8> @extract_nxv32i8_nxv2i8_22(<vscale x 32 x i8> %vec) {
314 ; CHECK-LABEL: extract_nxv32i8_nxv2i8_22:
316 ; CHECK-NEXT: csrr a0, vlenb
317 ; CHECK-NEXT: srli a1, a0, 3
318 ; CHECK-NEXT: slli a1, a1, 1
319 ; CHECK-NEXT: sub a0, a0, a1
320 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
321 ; CHECK-NEXT: vslidedown.vx v8, v10, a0
323 %c = call <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 22)
324 ret <vscale x 2 x i8> %c
327 define <vscale x 1 x i8> @extract_nxv8i8_nxv1i8_7(<vscale x 8 x i8> %vec) {
328 ; CHECK-LABEL: extract_nxv8i8_nxv1i8_7:
330 ; CHECK-NEXT: csrr a0, vlenb
331 ; CHECK-NEXT: srli a1, a0, 3
332 ; CHECK-NEXT: sub a0, a0, a1
333 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
334 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
336 %c = call <vscale x 1 x i8> @llvm.vector.extract.nxv1i8.nxv8i8(<vscale x 8 x i8> %vec, i64 7)
337 ret <vscale x 1 x i8> %c
340 define <vscale x 1 x i8> @extract_nxv4i8_nxv1i8_3(<vscale x 4 x i8> %vec) {
341 ; CHECK-LABEL: extract_nxv4i8_nxv1i8_3:
343 ; CHECK-NEXT: csrr a0, vlenb
344 ; CHECK-NEXT: srli a0, a0, 3
345 ; CHECK-NEXT: slli a1, a0, 1
346 ; CHECK-NEXT: add a0, a1, a0
347 ; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
348 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
350 %c = call <vscale x 1 x i8> @llvm.vector.extract.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, i64 3)
351 ret <vscale x 1 x i8> %c
354 define <vscale x 2 x half> @extract_nxv2f16_nxv16f16_0(<vscale x 16 x half> %vec) {
355 ; CHECK-LABEL: extract_nxv2f16_nxv16f16_0:
358 %c = call <vscale x 2 x half> @llvm.vector.extract.nxv2f16.nxv16f16(<vscale x 16 x half> %vec, i64 0)
359 ret <vscale x 2 x half> %c
362 define <vscale x 2 x half> @extract_nxv2f16_nxv16f16_2(<vscale x 16 x half> %vec) {
363 ; CHECK-LABEL: extract_nxv2f16_nxv16f16_2:
365 ; CHECK-NEXT: csrr a0, vlenb
366 ; CHECK-NEXT: srli a0, a0, 2
367 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
368 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
370 %c = call <vscale x 2 x half> @llvm.vector.extract.nxv2f16.nxv16f16(<vscale x 16 x half> %vec, i64 2)
371 ret <vscale x 2 x half> %c
374 define <vscale x 2 x half> @extract_nxv2f16_nxv16f16_4(<vscale x 16 x half> %vec) {
375 ; CHECK-LABEL: extract_nxv2f16_nxv16f16_4:
377 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
378 ; CHECK-NEXT: vmv1r.v v8, v9
380 %c = call <vscale x 2 x half> @llvm.vector.extract.nxv2f16.nxv16f16(<vscale x 16 x half> %vec, i64 4)
381 ret <vscale x 2 x half> %c
384 define <vscale x 8 x i1> @extract_nxv64i1_nxv8i1_0(<vscale x 64 x i1> %mask) {
385 ; CHECK-LABEL: extract_nxv64i1_nxv8i1_0:
388 %c = call <vscale x 8 x i1> @llvm.vector.extract.nxv8i1(<vscale x 64 x i1> %mask, i64 0)
389 ret <vscale x 8 x i1> %c
392 define <vscale x 8 x i1> @extract_nxv64i1_nxv8i1_8(<vscale x 64 x i1> %mask) {
393 ; CHECK-LABEL: extract_nxv64i1_nxv8i1_8:
395 ; CHECK-NEXT: csrr a0, vlenb
396 ; CHECK-NEXT: srli a0, a0, 3
397 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
398 ; CHECK-NEXT: vslidedown.vx v0, v0, a0
400 %c = call <vscale x 8 x i1> @llvm.vector.extract.nxv8i1(<vscale x 64 x i1> %mask, i64 8)
401 ret <vscale x 8 x i1> %c
404 define <vscale x 2 x i1> @extract_nxv64i1_nxv2i1_0(<vscale x 64 x i1> %mask) {
405 ; CHECK-LABEL: extract_nxv64i1_nxv2i1_0:
408 %c = call <vscale x 2 x i1> @llvm.vector.extract.nxv2i1(<vscale x 64 x i1> %mask, i64 0)
409 ret <vscale x 2 x i1> %c
412 define <vscale x 2 x i1> @extract_nxv64i1_nxv2i1_2(<vscale x 64 x i1> %mask) {
413 ; CHECK-LABEL: extract_nxv64i1_nxv2i1_2:
415 ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma
416 ; CHECK-NEXT: vmv.v.i v8, 0
417 ; CHECK-NEXT: csrr a0, vlenb
418 ; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
419 ; CHECK-NEXT: srli a0, a0, 2
420 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
421 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
422 ; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
423 ; CHECK-NEXT: vmsne.vi v0, v8, 0
425 %c = call <vscale x 2 x i1> @llvm.vector.extract.nxv2i1(<vscale x 64 x i1> %mask, i64 2)
426 ret <vscale x 2 x i1> %c
429 define <vscale x 4 x i1> @extract_nxv4i1_nxv32i1_0(<vscale x 32 x i1> %x) {
430 ; CHECK-LABEL: extract_nxv4i1_nxv32i1_0:
433 %c = call <vscale x 4 x i1> @llvm.vector.extract.nxv4i1(<vscale x 32 x i1> %x, i64 0)
434 ret <vscale x 4 x i1> %c
437 define <vscale x 4 x i1> @extract_nxv4i1_nxv32i1_4(<vscale x 32 x i1> %x) {
438 ; CHECK-LABEL: extract_nxv4i1_nxv32i1_4:
440 ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma
441 ; CHECK-NEXT: vmv.v.i v8, 0
442 ; CHECK-NEXT: csrr a0, vlenb
443 ; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
444 ; CHECK-NEXT: srli a0, a0, 1
445 ; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma
446 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
447 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
448 ; CHECK-NEXT: vmsne.vi v0, v8, 0
450 %c = call <vscale x 4 x i1> @llvm.vector.extract.nxv4i1(<vscale x 32 x i1> %x, i64 4)
451 ret <vscale x 4 x i1> %c
454 define <vscale x 16 x i1> @extract_nxv16i1_nxv32i1_0(<vscale x 32 x i1> %x) {
455 ; CHECK-LABEL: extract_nxv16i1_nxv32i1_0:
458 %c = call <vscale x 16 x i1> @llvm.vector.extract.nxv16i1(<vscale x 32 x i1> %x, i64 0)
459 ret <vscale x 16 x i1> %c
462 define <vscale x 16 x i1> @extract_nxv16i1_nxv32i1_16(<vscale x 32 x i1> %x) {
463 ; CHECK-LABEL: extract_nxv16i1_nxv32i1_16:
465 ; CHECK-NEXT: csrr a0, vlenb
466 ; CHECK-NEXT: srli a0, a0, 2
467 ; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma
468 ; CHECK-NEXT: vslidedown.vx v0, v0, a0
470 %c = call <vscale x 16 x i1> @llvm.vector.extract.nxv16i1(<vscale x 32 x i1> %x, i64 16)
471 ret <vscale x 16 x i1> %c
475 ; Extract f16 vector that needs widening from one that needs widening.
477 define <vscale x 6 x half> @extract_nxv6f16_nxv12f16_0(<vscale x 12 x half> %in) {
478 ; CHECK-LABEL: extract_nxv6f16_nxv12f16_0:
481 %res = call <vscale x 6 x half> @llvm.vector.extract.nxv6f16.nxv12f16(<vscale x 12 x half> %in, i64 0)
482 ret <vscale x 6 x half> %res
485 define <vscale x 6 x half> @extract_nxv6f16_nxv12f16_6(<vscale x 12 x half> %in) {
486 ; CHECK-LABEL: extract_nxv6f16_nxv12f16_6:
488 ; CHECK-NEXT: csrr a0, vlenb
489 ; CHECK-NEXT: srli a0, a0, 2
490 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
491 ; CHECK-NEXT: vslidedown.vx v13, v10, a0
492 ; CHECK-NEXT: vslidedown.vx v12, v9, a0
493 ; CHECK-NEXT: add a1, a0, a0
494 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
495 ; CHECK-NEXT: vslideup.vx v12, v10, a0
496 ; CHECK-NEXT: vmv2r.v v8, v12
498 %res = call <vscale x 6 x half> @llvm.vector.extract.nxv6f16.nxv12f16(<vscale x 12 x half> %in, i64 6)
499 ret <vscale x 6 x half> %res
502 define <vscale x 2 x bfloat> @extract_nxv2bf16_nxv16bf16_0(<vscale x 16 x bfloat> %vec) {
503 ; CHECK-LABEL: extract_nxv2bf16_nxv16bf16_0:
506 %c = call <vscale x 2 x bfloat> @llvm.vector.extract.nxv2bf16.nxv16bf16(<vscale x 16 x bfloat> %vec, i64 0)
507 ret <vscale x 2 x bfloat> %c
510 define <vscale x 2 x bfloat> @extract_nxv2bf16_nxv16bf16_2(<vscale x 16 x bfloat> %vec) {
511 ; CHECK-LABEL: extract_nxv2bf16_nxv16bf16_2:
513 ; CHECK-NEXT: csrr a0, vlenb
514 ; CHECK-NEXT: srli a0, a0, 2
515 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
516 ; CHECK-NEXT: vslidedown.vx v8, v8, a0
518 %c = call <vscale x 2 x bfloat> @llvm.vector.extract.nxv2bf16.nxv16bf16(<vscale x 16 x bfloat> %vec, i64 2)
519 ret <vscale x 2 x bfloat> %c
522 define <vscale x 2 x bfloat> @extract_nxv2bf16_nxv16bf16_4(<vscale x 16 x bfloat> %vec) {
523 ; CHECK-LABEL: extract_nxv2bf16_nxv16bf16_4:
525 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
526 ; CHECK-NEXT: vmv1r.v v8, v9
528 %c = call <vscale x 2 x bfloat> @llvm.vector.extract.nxv2bf16.nxv16bf16(<vscale x 16 x bfloat> %vec, i64 4)
529 ret <vscale x 2 x bfloat> %c
532 define <vscale x 6 x bfloat> @extract_nxv6bf16_nxv12bf16_0(<vscale x 12 x bfloat> %in) {
533 ; CHECK-LABEL: extract_nxv6bf16_nxv12bf16_0:
536 %res = call <vscale x 6 x bfloat> @llvm.vector.extract.nxv6bf16.nxv12bf16(<vscale x 12 x bfloat> %in, i64 0)
537 ret <vscale x 6 x bfloat> %res
540 define <vscale x 6 x bfloat> @extract_nxv6bf16_nxv12bf16_6(<vscale x 12 x bfloat> %in) {
541 ; CHECK-LABEL: extract_nxv6bf16_nxv12bf16_6:
543 ; CHECK-NEXT: csrr a0, vlenb
544 ; CHECK-NEXT: srli a0, a0, 2
545 ; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma
546 ; CHECK-NEXT: vslidedown.vx v13, v10, a0
547 ; CHECK-NEXT: vslidedown.vx v12, v9, a0
548 ; CHECK-NEXT: add a1, a0, a0
549 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
550 ; CHECK-NEXT: vslideup.vx v12, v10, a0
551 ; CHECK-NEXT: vmv2r.v v8, v12
553 %res = call <vscale x 6 x bfloat> @llvm.vector.extract.nxv6bf16.nxv12bf16(<vscale x 12 x bfloat> %in, i64 6)
554 ret <vscale x 6 x bfloat> %res
557 declare <vscale x 6 x half> @llvm.vector.extract.nxv6f16.nxv12f16(<vscale x 12 x half>, i64)
559 declare <vscale x 1 x i8> @llvm.vector.extract.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, i64 %idx)
560 declare <vscale x 1 x i8> @llvm.vector.extract.nxv1i8.nxv8i8(<vscale x 8 x i8> %vec, i64 %idx)
562 declare <vscale x 2 x i8> @llvm.vector.extract.nxv2i8.nxv32i8(<vscale x 32 x i8> %vec, i64 %idx)
564 declare <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv2i32(<vscale x 2 x i32> %vec, i64 %idx)
566 declare <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, i64 %idx)
567 declare <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, i64 %idx)
569 declare <vscale x 1 x i32> @llvm.vector.extract.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
570 declare <vscale x 2 x i32> @llvm.vector.extract.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
571 declare <vscale x 4 x i32> @llvm.vector.extract.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
572 declare <vscale x 8 x i32> @llvm.vector.extract.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx)
574 declare <vscale x 2 x half> @llvm.vector.extract.nxv2f16.nxv16f16(<vscale x 16 x half> %vec, i64 %idx)
576 declare <vscale x 4 x i1> @llvm.vector.extract.nxv4i1(<vscale x 32 x i1> %vec, i64 %idx)
577 declare <vscale x 16 x i1> @llvm.vector.extract.nxv16i1(<vscale x 32 x i1> %vec, i64 %idx)
579 declare <vscale x 2 x i1> @llvm.vector.extract.nxv2i1(<vscale x 64 x i1> %vec, i64 %idx)
580 declare <vscale x 8 x i1> @llvm.vector.extract.nxv8i1(<vscale x 64 x i1> %vec, i64 %idx)