1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple riscv32 -mattr=+m,+d,+zfh,+zvfh,+v -verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc -mtriple riscv64 -mattr=+m,+d,+zfh,+zvfh,+v -verify-machineinstrs < %s | FileCheck %s
5 define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_0(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) {
6 ; CHECK-LABEL: insert_nxv8i32_nxv4i32_0:
8 ; CHECK-NEXT: vmv2r.v v8, v12
10 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0)
11 ret <vscale x 8 x i32> %v
14 define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_4(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) {
15 ; CHECK-LABEL: insert_nxv8i32_nxv4i32_4:
17 ; CHECK-NEXT: vmv2r.v v10, v12
19 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4)
20 ret <vscale x 8 x i32> %v
23 define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_0(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
24 ; CHECK-LABEL: insert_nxv8i32_nxv2i32_0:
26 ; CHECK-NEXT: vmv1r.v v8, v12
28 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0)
29 ret <vscale x 8 x i32> %v
32 define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_2(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
33 ; CHECK-LABEL: insert_nxv8i32_nxv2i32_2:
35 ; CHECK-NEXT: vmv1r.v v9, v12
37 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2)
38 ret <vscale x 8 x i32> %v
41 define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_4(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
42 ; CHECK-LABEL: insert_nxv8i32_nxv2i32_4:
44 ; CHECK-NEXT: vmv1r.v v10, v12
46 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4)
47 ret <vscale x 8 x i32> %v
50 define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_6(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
51 ; CHECK-LABEL: insert_nxv8i32_nxv2i32_6:
53 ; CHECK-NEXT: vmv1r.v v11, v12
55 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6)
56 ret <vscale x 8 x i32> %v
59 define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_0(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
60 ; CHECK-LABEL: insert_nxv1i8_nxv4i8_0:
62 ; CHECK-NEXT: csrr a0, vlenb
63 ; CHECK-NEXT: srli a0, a0, 3
64 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
65 ; CHECK-NEXT: vmv.v.v v8, v9
67 %v = call <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0)
68 ret <vscale x 4 x i8> %v
71 define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_3(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
72 ; CHECK-LABEL: insert_nxv1i8_nxv4i8_3:
74 ; CHECK-NEXT: csrr a0, vlenb
75 ; CHECK-NEXT: srli a0, a0, 3
76 ; CHECK-NEXT: slli a1, a0, 1
77 ; CHECK-NEXT: add a1, a1, a0
78 ; CHECK-NEXT: add a0, a1, a0
79 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
80 ; CHECK-NEXT: vslideup.vx v8, v9, a1
82 %v = call <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3)
83 ret <vscale x 4 x i8> %v
86 define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_0(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
87 ; CHECK-LABEL: insert_nxv16i32_nxv8i32_0:
89 ; CHECK-NEXT: vmv4r.v v8, v16
91 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 0)
92 ret <vscale x 16 x i32> %v
95 define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_8(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
96 ; CHECK-LABEL: insert_nxv16i32_nxv8i32_8:
98 ; CHECK-NEXT: vmv4r.v v12, v16
100 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 8)
101 ret <vscale x 16 x i32> %v
104 define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_0(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
105 ; CHECK-LABEL: insert_nxv16i32_nxv4i32_0:
107 ; CHECK-NEXT: vmv2r.v v8, v16
109 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0)
110 ret <vscale x 16 x i32> %v
113 define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_4(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
114 ; CHECK-LABEL: insert_nxv16i32_nxv4i32_4:
116 ; CHECK-NEXT: vmv2r.v v10, v16
118 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4)
119 ret <vscale x 16 x i32> %v
122 define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_8(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
123 ; CHECK-LABEL: insert_nxv16i32_nxv4i32_8:
125 ; CHECK-NEXT: vmv2r.v v12, v16
127 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 8)
128 ret <vscale x 16 x i32> %v
131 define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_12(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
132 ; CHECK-LABEL: insert_nxv16i32_nxv4i32_12:
134 ; CHECK-NEXT: vmv2r.v v14, v16
136 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 12)
137 ret <vscale x 16 x i32> %v
140 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_0(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
141 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_0:
143 ; CHECK-NEXT: vmv1r.v v8, v16
145 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0)
146 ret <vscale x 16 x i32> %v
149 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_2(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
150 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_2:
152 ; CHECK-NEXT: vmv1r.v v9, v16
154 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2)
155 ret <vscale x 16 x i32> %v
158 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_4(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
159 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_4:
161 ; CHECK-NEXT: vmv1r.v v10, v16
163 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4)
164 ret <vscale x 16 x i32> %v
167 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_6(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
168 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_6:
170 ; CHECK-NEXT: vmv1r.v v11, v16
172 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6)
173 ret <vscale x 16 x i32> %v
176 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_8(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
177 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_8:
179 ; CHECK-NEXT: vmv1r.v v12, v16
181 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 8)
182 ret <vscale x 16 x i32> %v
185 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_10(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
186 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_10:
188 ; CHECK-NEXT: vmv1r.v v13, v16
190 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 10)
191 ret <vscale x 16 x i32> %v
194 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_12(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
195 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_12:
197 ; CHECK-NEXT: vmv1r.v v14, v16
199 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 12)
200 ret <vscale x 16 x i32> %v
203 define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_14(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
204 ; CHECK-LABEL: insert_nxv16i32_nxv2i32_14:
206 ; CHECK-NEXT: vmv1r.v v15, v16
208 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 14)
209 ret <vscale x 16 x i32> %v
212 define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_0(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
213 ; CHECK-LABEL: insert_nxv16i32_nxv1i32_0:
215 ; CHECK-NEXT: csrr a0, vlenb
216 ; CHECK-NEXT: srli a0, a0, 3
217 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
218 ; CHECK-NEXT: vmv.v.v v8, v16
220 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 0)
221 ret <vscale x 16 x i32> %v
224 define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_1(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
225 ; CHECK-LABEL: insert_nxv16i32_nxv1i32_1:
227 ; CHECK-NEXT: csrr a0, vlenb
228 ; CHECK-NEXT: srli a0, a0, 3
229 ; CHECK-NEXT: add a1, a0, a0
230 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, ma
231 ; CHECK-NEXT: vslideup.vx v8, v16, a0
233 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 1)
234 ret <vscale x 16 x i32> %v
237 define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_6(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
238 ; CHECK-LABEL: insert_nxv16i32_nxv1i32_6:
240 ; CHECK-NEXT: csrr a0, vlenb
241 ; CHECK-NEXT: srli a0, a0, 3
242 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
243 ; CHECK-NEXT: vmv.v.v v11, v16
245 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 6)
246 ret <vscale x 16 x i32> %v
249 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_0(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
250 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_0:
252 ; CHECK-NEXT: csrr a0, vlenb
253 ; CHECK-NEXT: srli a0, a0, 3
254 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
255 ; CHECK-NEXT: vmv.v.v v8, v10
257 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0)
258 ret <vscale x 16 x i8> %v
261 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_1(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
262 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_1:
264 ; CHECK-NEXT: csrr a0, vlenb
265 ; CHECK-NEXT: srli a0, a0, 3
266 ; CHECK-NEXT: add a1, a0, a0
267 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma
268 ; CHECK-NEXT: vslideup.vx v8, v10, a0
270 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 1)
271 ret <vscale x 16 x i8> %v
274 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_2(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
275 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_2:
277 ; CHECK-NEXT: csrr a0, vlenb
278 ; CHECK-NEXT: srli a1, a0, 3
279 ; CHECK-NEXT: srli a0, a0, 2
280 ; CHECK-NEXT: add a1, a0, a1
281 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma
282 ; CHECK-NEXT: vslideup.vx v8, v10, a0
284 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 2)
285 ret <vscale x 16 x i8> %v
288 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_3(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
289 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_3:
291 ; CHECK-NEXT: csrr a0, vlenb
292 ; CHECK-NEXT: srli a0, a0, 3
293 ; CHECK-NEXT: slli a1, a0, 1
294 ; CHECK-NEXT: add a1, a1, a0
295 ; CHECK-NEXT: add a0, a1, a0
296 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
297 ; CHECK-NEXT: vslideup.vx v8, v10, a1
299 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3)
300 ret <vscale x 16 x i8> %v
303 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_7(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
304 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_7:
306 ; CHECK-NEXT: csrr a0, vlenb
307 ; CHECK-NEXT: srli a1, a0, 3
308 ; CHECK-NEXT: sub a1, a0, a1
309 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
310 ; CHECK-NEXT: vslideup.vx v8, v10, a1
312 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 7)
313 ret <vscale x 16 x i8> %v
316 define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_15(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
317 ; CHECK-LABEL: insert_nxv16i8_nxv1i8_15:
319 ; CHECK-NEXT: csrr a0, vlenb
320 ; CHECK-NEXT: srli a1, a0, 3
321 ; CHECK-NEXT: sub a1, a0, a1
322 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
323 ; CHECK-NEXT: vslideup.vx v9, v10, a1
325 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 15)
326 ret <vscale x 16 x i8> %v
329 define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_0(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
330 ; CHECK-LABEL: insert_nxv32f16_nxv2f16_0:
332 ; CHECK-NEXT: csrr a0, vlenb
333 ; CHECK-NEXT: srli a0, a0, 2
334 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma
335 ; CHECK-NEXT: vmv.v.v v8, v16
337 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 0)
338 ret <vscale x 32 x half> %v
341 define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_2(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
342 ; CHECK-LABEL: insert_nxv32f16_nxv2f16_2:
344 ; CHECK-NEXT: csrr a0, vlenb
345 ; CHECK-NEXT: srli a0, a0, 2
346 ; CHECK-NEXT: add a1, a0, a0
347 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma
348 ; CHECK-NEXT: vslideup.vx v8, v16, a0
350 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 2)
351 ret <vscale x 32 x half> %v
354 define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_26(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
355 ; CHECK-LABEL: insert_nxv32f16_nxv2f16_26:
357 ; CHECK-NEXT: csrr a0, vlenb
358 ; CHECK-NEXT: srli a0, a0, 2
359 ; CHECK-NEXT: add a1, a0, a0
360 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma
361 ; CHECK-NEXT: vslideup.vx v14, v16, a0
363 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 26)
364 ret <vscale x 32 x half> %v
367 define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_0(<vscale x 1 x half> %subvec) {
368 ; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_0:
371 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 0)
372 ret <vscale x 32 x half> %v
375 define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_26(<vscale x 1 x half> %subvec) {
376 ; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_26:
378 ; CHECK-NEXT: csrr a0, vlenb
379 ; CHECK-NEXT: srli a1, a0, 3
380 ; CHECK-NEXT: srli a0, a0, 2
381 ; CHECK-NEXT: add a1, a0, a1
382 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
383 ; CHECK-NEXT: vslideup.vx v14, v8, a0
385 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 26)
386 ret <vscale x 32 x half> %v
389 define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_0(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
390 ; CHECK-LABEL: insert_nxv32i1_nxv8i1_0:
392 ; CHECK-NEXT: csrr a0, vlenb
393 ; CHECK-NEXT: srli a0, a0, 3
394 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
395 ; CHECK-NEXT: vmv.v.v v0, v8
397 %vec = call <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 0)
398 ret <vscale x 32 x i1> %vec
401 define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_8(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
402 ; CHECK-LABEL: insert_nxv32i1_nxv8i1_8:
404 ; CHECK-NEXT: csrr a0, vlenb
405 ; CHECK-NEXT: srli a0, a0, 3
406 ; CHECK-NEXT: add a1, a0, a0
407 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma
408 ; CHECK-NEXT: vslideup.vx v0, v8, a0
410 %vec = call <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 8)
411 ret <vscale x 32 x i1> %vec
414 define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_0(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
415 ; CHECK-LABEL: insert_nxv4i1_nxv1i1_0:
417 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
418 ; CHECK-NEXT: vmv.v.i v9, 0
419 ; CHECK-NEXT: vmerge.vim v9, v9, 1, v0
420 ; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
421 ; CHECK-NEXT: vmv.v.i v10, 0
422 ; CHECK-NEXT: vmv1r.v v0, v8
423 ; CHECK-NEXT: vmerge.vim v8, v10, 1, v0
424 ; CHECK-NEXT: csrr a0, vlenb
425 ; CHECK-NEXT: srli a0, a0, 3
426 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
427 ; CHECK-NEXT: vmv.v.v v9, v8
428 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
429 ; CHECK-NEXT: vmsne.vi v0, v9, 0
431 %vec = call <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 0)
432 ret <vscale x 4 x i1> %vec
435 define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_2(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
436 ; CHECK-LABEL: insert_nxv4i1_nxv1i1_2:
438 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
439 ; CHECK-NEXT: vmv.v.i v9, 0
440 ; CHECK-NEXT: vmerge.vim v9, v9, 1, v0
441 ; CHECK-NEXT: csrr a0, vlenb
442 ; CHECK-NEXT: srli a1, a0, 3
443 ; CHECK-NEXT: srli a0, a0, 2
444 ; CHECK-NEXT: add a1, a0, a1
445 ; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, ma
446 ; CHECK-NEXT: vmv.v.i v10, 0
447 ; CHECK-NEXT: vmv1r.v v0, v8
448 ; CHECK-NEXT: vmerge.vim v8, v10, 1, v0
449 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma
450 ; CHECK-NEXT: vslideup.vx v9, v8, a0
451 ; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
452 ; CHECK-NEXT: vmsne.vi v0, v9, 0
454 %vec = call <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 2)
455 ret <vscale x 4 x i1> %vec
458 declare <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64>, <vscale x 8 x i64>, i64)
460 define void @insert_nxv8i64_nxv16i64(<vscale x 8 x i64> %sv0, <vscale x 8 x i64> %sv1, <vscale x 16 x i64>* %out) {
461 ; CHECK-LABEL: insert_nxv8i64_nxv16i64:
463 ; CHECK-NEXT: vs8r.v v8, (a0)
464 ; CHECK-NEXT: csrr a1, vlenb
465 ; CHECK-NEXT: slli a1, a1, 3
466 ; CHECK-NEXT: add a0, a0, a1
467 ; CHECK-NEXT: vs8r.v v16, (a0)
469 %v0 = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0)
470 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> %v0, <vscale x 8 x i64> %sv1, i64 8)
471 store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
475 define void @insert_nxv8i64_nxv16i64_lo(<vscale x 8 x i64> %sv0, <vscale x 16 x i64>* %out) {
476 ; CHECK-LABEL: insert_nxv8i64_nxv16i64_lo:
478 ; CHECK-NEXT: vs8r.v v8, (a0)
480 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0)
481 store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
485 define void @insert_nxv8i64_nxv16i64_hi(<vscale x 8 x i64> %sv0, <vscale x 16 x i64>* %out) {
486 ; CHECK-LABEL: insert_nxv8i64_nxv16i64_hi:
488 ; CHECK-NEXT: csrr a1, vlenb
489 ; CHECK-NEXT: slli a1, a1, 3
490 ; CHECK-NEXT: add a0, a0, a1
491 ; CHECK-NEXT: vs8r.v v8, (a0)
493 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 8)
494 store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
498 ; We should be able to widen the <3 x i64> subvector to a <4 x i64> here because
499 ; we know that the minimum vscale is 2
500 define <vscale x 2 x i64> @insert_nxv2i64_nxv3i64(<3 x i64> %sv) #0 {
501 ; CHECK-LABEL: insert_nxv2i64_nxv3i64:
504 %vec = call <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64> undef, <3 x i64> %sv, i64 0)
505 ret <vscale x 2 x i64> %vec
508 attributes #0 = { vscale_range(2,1024) }
510 declare <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1>, <vscale x 1 x i1>, i64)
511 declare <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1>, <vscale x 8 x i1>, i64)
513 declare <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8>, <vscale x 1 x i8>, i64)
515 declare <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half>, <vscale x 1 x half>, i64)
516 declare <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half>, <vscale x 2 x half>, i64)
518 declare <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8>, <vscale x 1 x i8>, i64 %idx)
520 declare <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32>, <vscale x 2 x i32>, i64 %idx)
521 declare <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32>, <vscale x 4 x i32>, i64 %idx)
523 declare <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32>, <vscale x 1 x i32>, i64 %idx)
524 declare <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32>, <vscale x 2 x i32>, i64 %idx)
525 declare <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32>, <vscale x 4 x i32>, i64 %idx)
526 declare <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32>, <vscale x 8 x i32>, i64 %idx)
528 declare <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64>, <3 x i64>, i64 %idx)