Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / insert-subvector.ll
blob57de8341cb89cef44ab604a21d5dad943ae966e2
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:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vmv2r.v v8, v12
9 ; CHECK-NEXT:    ret
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:
16 ; CHECK:       # %bb.0:
17 ; CHECK-NEXT:    vmv2r.v v10, v12
18 ; CHECK-NEXT:    ret
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:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    vmv1r.v v8, v12
27 ; CHECK-NEXT:    ret
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:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    vmv1r.v v9, v12
36 ; CHECK-NEXT:    ret
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:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    vmv1r.v v10, v12
45 ; CHECK-NEXT:    ret
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:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    vmv1r.v v11, v12
54 ; CHECK-NEXT:    ret
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:
61 ; CHECK:       # %bb.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
66 ; CHECK-NEXT:    ret
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:
73 ; CHECK:       # %bb.0:
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
81 ; CHECK-NEXT:    ret
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:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    vmv4r.v v8, v16
90 ; CHECK-NEXT:    ret
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:
97 ; CHECK:       # %bb.0:
98 ; CHECK-NEXT:    vmv4r.v v12, v16
99 ; CHECK-NEXT:    ret
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:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    vmv2r.v v8, v16
108 ; CHECK-NEXT:    ret
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:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    vmv2r.v v10, v16
117 ; CHECK-NEXT:    ret
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:
124 ; CHECK:       # %bb.0:
125 ; CHECK-NEXT:    vmv2r.v v12, v16
126 ; CHECK-NEXT:    ret
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:
133 ; CHECK:       # %bb.0:
134 ; CHECK-NEXT:    vmv2r.v v14, v16
135 ; CHECK-NEXT:    ret
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:
142 ; CHECK:       # %bb.0:
143 ; CHECK-NEXT:    vmv1r.v v8, v16
144 ; CHECK-NEXT:    ret
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:
151 ; CHECK:       # %bb.0:
152 ; CHECK-NEXT:    vmv1r.v v9, v16
153 ; CHECK-NEXT:    ret
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:
160 ; CHECK:       # %bb.0:
161 ; CHECK-NEXT:    vmv1r.v v10, v16
162 ; CHECK-NEXT:    ret
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:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    vmv1r.v v11, v16
171 ; CHECK-NEXT:    ret
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:
178 ; CHECK:       # %bb.0:
179 ; CHECK-NEXT:    vmv1r.v v12, v16
180 ; CHECK-NEXT:    ret
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:
187 ; CHECK:       # %bb.0:
188 ; CHECK-NEXT:    vmv1r.v v13, v16
189 ; CHECK-NEXT:    ret
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:
196 ; CHECK:       # %bb.0:
197 ; CHECK-NEXT:    vmv1r.v v14, v16
198 ; CHECK-NEXT:    ret
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:
205 ; CHECK:       # %bb.0:
206 ; CHECK-NEXT:    vmv1r.v v15, v16
207 ; CHECK-NEXT:    ret
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:
214 ; CHECK:       # %bb.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
219 ; CHECK-NEXT:    ret
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:
226 ; CHECK:       # %bb.0:
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
232 ; CHECK-NEXT:    ret
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:
239 ; CHECK:       # %bb.0:
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
244 ; CHECK-NEXT:    ret
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:
251 ; CHECK:       # %bb.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
256 ; CHECK-NEXT:    ret
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:
263 ; CHECK:       # %bb.0:
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
269 ; CHECK-NEXT:    ret
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:
276 ; CHECK:       # %bb.0:
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
283 ; CHECK-NEXT:    ret
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:
290 ; CHECK:       # %bb.0:
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
298 ; CHECK-NEXT:    ret
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:
305 ; CHECK:       # %bb.0:
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
311 ; CHECK-NEXT:    ret
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:
318 ; CHECK:       # %bb.0:
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
324 ; CHECK-NEXT:    ret
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:
331 ; CHECK:       # %bb.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
336 ; CHECK-NEXT:    ret
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:
343 ; CHECK:       # %bb.0:
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
349 ; CHECK-NEXT:    ret
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:
356 ; CHECK:       # %bb.0:
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
362 ; CHECK-NEXT:    ret
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:
369 ; CHECK:       # %bb.0:
370 ; CHECK-NEXT:    ret
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:
377 ; CHECK:       # %bb.0:
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
384 ; CHECK-NEXT:    ret
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:
391 ; CHECK:       # %bb.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
396 ; CHECK-NEXT:    ret
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:
403 ; CHECK:       # %bb.0:
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
409 ; CHECK-NEXT:    ret
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:
416 ; CHECK:       # %bb.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
430 ; CHECK-NEXT:    ret
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:
437 ; CHECK:       # %bb.0:
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
453 ; CHECK-NEXT:    ret
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:
462 ; CHECK:       # %bb.0:
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)
468 ; CHECK-NEXT:    ret
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
472   ret void
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:
477 ; CHECK:       # %bb.0:
478 ; CHECK-NEXT:    vs8r.v v8, (a0)
479 ; CHECK-NEXT:    ret
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
482   ret void
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:
487 ; CHECK:       # %bb.0:
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)
492 ; CHECK-NEXT:    ret
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
495   ret void
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:
502 ; CHECK:       # %bb.0:
503 ; CHECK-NEXT:    ret
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)