1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple riscv64 -mattr=+m,+d,+experimental-zfh,+experimental-v -verify-machineinstrs < %s | FileCheck %s
3
4define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_0(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) {
5; CHECK-LABEL: insert_nxv8i32_nxv4i32_0:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    vmv2r.v v8, v12
8; CHECK-NEXT:    ret
9  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0)
10  ret <vscale x 8 x i32> %v
11}
12
13define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_4(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) {
14; CHECK-LABEL: insert_nxv8i32_nxv4i32_4:
15; CHECK:       # %bb.0:
16; CHECK-NEXT:    vmv2r.v v10, v12
17; CHECK-NEXT:    ret
18  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4)
19  ret <vscale x 8 x i32> %v
20}
21
22define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_0(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
23; CHECK-LABEL: insert_nxv8i32_nxv2i32_0:
24; CHECK:       # %bb.0:
25; CHECK-NEXT:    vmv1r.v v8, v12
26; CHECK-NEXT:    ret
27  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0)
28  ret <vscale x 8 x i32> %v
29}
30
31define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_2(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
32; CHECK-LABEL: insert_nxv8i32_nxv2i32_2:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vmv1r.v v9, v12
35; CHECK-NEXT:    ret
36  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2)
37  ret <vscale x 8 x i32> %v
38}
39
40define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_4(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
41; CHECK-LABEL: insert_nxv8i32_nxv2i32_4:
42; CHECK:       # %bb.0:
43; CHECK-NEXT:    vmv1r.v v10, v12
44; CHECK-NEXT:    ret
45  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4)
46  ret <vscale x 8 x i32> %v
47}
48
49define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_6(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
50; CHECK-LABEL: insert_nxv8i32_nxv2i32_6:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    vmv1r.v v11, v12
53; CHECK-NEXT:    ret
54  %v = call <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6)
55  ret <vscale x 8 x i32> %v
56}
57
58define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_0(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
59; CHECK-LABEL: insert_nxv1i8_nxv4i8_0:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    csrr a0, vlenb
62; CHECK-NEXT:    srli a0, a0, 3
63; CHECK-NEXT:    vsetvli a0, a0, e8,mf2,tu,mu
64; CHECK-NEXT:    vslideup.vi v8, v9, 0
65; CHECK-NEXT:    ret
66  %v = call <vscale x 4 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0)
67  ret <vscale x 4 x i8> %v
68}
69
70define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_3(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
71; CHECK-LABEL: insert_nxv1i8_nxv4i8_3:
72; CHECK:       # %bb.0:
73; CHECK-NEXT:    csrr a0, vlenb
74; CHECK-NEXT:    srli a0, a0, 3
75; CHECK-NEXT:    slli a1, a0, 1
76; CHECK-NEXT:    add a1, a1, a0
77; CHECK-NEXT:    add a0, a1, a0
78; CHECK-NEXT:    vsetvli a0, a0, e8,mf2,tu,mu
79; CHECK-NEXT:    vslideup.vx v8, v9, a1
80; CHECK-NEXT:    ret
81  %v = call <vscale x 4 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3)
82  ret <vscale x 4 x i8> %v
83}
84
85define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_0(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
86; CHECK-LABEL: insert_nxv16i32_nxv8i32_0:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    vmv4r.v v8, v16
89; CHECK-NEXT:    ret
90  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 0)
91  ret <vscale x 16 x i32> %v
92}
93
94define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_8(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
95; CHECK-LABEL: insert_nxv16i32_nxv8i32_8:
96; CHECK:       # %bb.0:
97; CHECK-NEXT:    vmv4r.v v12, v16
98; CHECK-NEXT:    ret
99  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 8)
100  ret <vscale x 16 x i32> %v
101}
102
103define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_0(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
104; CHECK-LABEL: insert_nxv16i32_nxv4i32_0:
105; CHECK:       # %bb.0:
106; CHECK-NEXT:    vmv2r.v v8, v16
107; CHECK-NEXT:    ret
108  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0)
109  ret <vscale x 16 x i32> %v
110}
111
112define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_4(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
113; CHECK-LABEL: insert_nxv16i32_nxv4i32_4:
114; CHECK:       # %bb.0:
115; CHECK-NEXT:    vmv2r.v v10, v16
116; CHECK-NEXT:    ret
117  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4)
118  ret <vscale x 16 x i32> %v
119}
120
121define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_8(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
122; CHECK-LABEL: insert_nxv16i32_nxv4i32_8:
123; CHECK:       # %bb.0:
124; CHECK-NEXT:    vmv2r.v v12, v16
125; CHECK-NEXT:    ret
126  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 8)
127  ret <vscale x 16 x i32> %v
128}
129
130define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_12(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
131; CHECK-LABEL: insert_nxv16i32_nxv4i32_12:
132; CHECK:       # %bb.0:
133; CHECK-NEXT:    vmv2r.v v14, v16
134; CHECK-NEXT:    ret
135  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 12)
136  ret <vscale x 16 x i32> %v
137}
138
139define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_0(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
140; CHECK-LABEL: insert_nxv16i32_nxv2i32_0:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    vmv1r.v v8, v16
143; CHECK-NEXT:    ret
144  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0)
145  ret <vscale x 16 x i32> %v
146}
147
148define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_2(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
149; CHECK-LABEL: insert_nxv16i32_nxv2i32_2:
150; CHECK:       # %bb.0:
151; CHECK-NEXT:    vmv1r.v v9, v16
152; CHECK-NEXT:    ret
153  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2)
154  ret <vscale x 16 x i32> %v
155}
156
157define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_4(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
158; CHECK-LABEL: insert_nxv16i32_nxv2i32_4:
159; CHECK:       # %bb.0:
160; CHECK-NEXT:    vmv1r.v v10, v16
161; CHECK-NEXT:    ret
162  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4)
163  ret <vscale x 16 x i32> %v
164}
165
166define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_6(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
167; CHECK-LABEL: insert_nxv16i32_nxv2i32_6:
168; CHECK:       # %bb.0:
169; CHECK-NEXT:    vmv1r.v v11, v16
170; CHECK-NEXT:    ret
171  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6)
172  ret <vscale x 16 x i32> %v
173}
174
175define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_8(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
176; CHECK-LABEL: insert_nxv16i32_nxv2i32_8:
177; CHECK:       # %bb.0:
178; CHECK-NEXT:    vmv1r.v v12, v16
179; CHECK-NEXT:    ret
180  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 8)
181  ret <vscale x 16 x i32> %v
182}
183
184define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_10(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
185; CHECK-LABEL: insert_nxv16i32_nxv2i32_10:
186; CHECK:       # %bb.0:
187; CHECK-NEXT:    vmv1r.v v13, v16
188; CHECK-NEXT:    ret
189  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 10)
190  ret <vscale x 16 x i32> %v
191}
192
193define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_12(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
194; CHECK-LABEL: insert_nxv16i32_nxv2i32_12:
195; CHECK:       # %bb.0:
196; CHECK-NEXT:    vmv1r.v v14, v16
197; CHECK-NEXT:    ret
198  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 12)
199  ret <vscale x 16 x i32> %v
200}
201
202define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_14(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
203; CHECK-LABEL: insert_nxv16i32_nxv2i32_14:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    vmv1r.v v15, v16
206; CHECK-NEXT:    ret
207  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 14)
208  ret <vscale x 16 x i32> %v
209}
210
211define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_0(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
212; CHECK-LABEL: insert_nxv16i32_nxv1i32_0:
213; CHECK:       # %bb.0:
214; CHECK-NEXT:    csrr a0, vlenb
215; CHECK-NEXT:    srli a0, a0, 3
216; CHECK-NEXT:    vsetvli a0, a0, e32,m1,tu,mu
217; CHECK-NEXT:    vslideup.vi v8, v16, 0
218; CHECK-NEXT:    ret
219  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 0)
220  ret <vscale x 16 x i32> %v
221}
222
223define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_1(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
224; CHECK-LABEL: insert_nxv16i32_nxv1i32_1:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    csrr a0, vlenb
227; CHECK-NEXT:    srli a0, a0, 3
228; CHECK-NEXT:    add a1, a0, a0
229; CHECK-NEXT:    vsetvli a1, a1, e32,m1,tu,mu
230; CHECK-NEXT:    vslideup.vx v8, v16, a0
231; CHECK-NEXT:    ret
232  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 1)
233  ret <vscale x 16 x i32> %v
234}
235
236define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_6(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
237; CHECK-LABEL: insert_nxv16i32_nxv1i32_6:
238; CHECK:       # %bb.0:
239; CHECK-NEXT:    csrr a0, vlenb
240; CHECK-NEXT:    srli a0, a0, 3
241; CHECK-NEXT:    vsetvli a0, a0, e32,m1,tu,mu
242; CHECK-NEXT:    vslideup.vi v11, v16, 0
243; CHECK-NEXT:    ret
244  %v = call <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 6)
245  ret <vscale x 16 x i32> %v
246}
247
248define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_0(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
249; CHECK-LABEL: insert_nxv16i8_nxv1i8_0:
250; CHECK:       # %bb.0:
251; CHECK-NEXT:    csrr a0, vlenb
252; CHECK-NEXT:    srli a0, a0, 3
253; CHECK-NEXT:    vsetvli a0, a0, e8,m1,tu,mu
254; CHECK-NEXT:    vslideup.vi v8, v10, 0
255; CHECK-NEXT:    ret
256  %v = call <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0)
257  ret <vscale x 16 x i8> %v
258}
259
260define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_1(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
261; CHECK-LABEL: insert_nxv16i8_nxv1i8_1:
262; CHECK:       # %bb.0:
263; CHECK-NEXT:    csrr a0, vlenb
264; CHECK-NEXT:    srli a0, a0, 3
265; CHECK-NEXT:    add a1, a0, a0
266; CHECK-NEXT:    vsetvli a1, a1, e8,m1,tu,mu
267; CHECK-NEXT:    vslideup.vx v8, v10, a0
268; CHECK-NEXT:    ret
269  %v = call <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 1)
270  ret <vscale x 16 x i8> %v
271}
272
273define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_2(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
274; CHECK-LABEL: insert_nxv16i8_nxv1i8_2:
275; CHECK:       # %bb.0:
276; CHECK-NEXT:    csrr a0, vlenb
277; CHECK-NEXT:    srli a0, a0, 3
278; CHECK-NEXT:    slli a1, a0, 1
279; CHECK-NEXT:    add a0, a1, a0
280; CHECK-NEXT:    vsetvli a0, a0, e8,m1,tu,mu
281; CHECK-NEXT:    vslideup.vx v8, v10, a1
282; CHECK-NEXT:    ret
283  %v = call <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 2)
284  ret <vscale x 16 x i8> %v
285}
286
287define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_3(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
288; CHECK-LABEL: insert_nxv16i8_nxv1i8_3:
289; CHECK:       # %bb.0:
290; CHECK-NEXT:    csrr a0, vlenb
291; CHECK-NEXT:    srli a0, a0, 3
292; CHECK-NEXT:    slli a1, a0, 1
293; CHECK-NEXT:    add a1, a1, a0
294; CHECK-NEXT:    add a0, a1, a0
295; CHECK-NEXT:    vsetvli a0, a0, e8,m1,tu,mu
296; CHECK-NEXT:    vslideup.vx v8, v10, a1
297; CHECK-NEXT:    ret
298  %v = call <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3)
299  ret <vscale x 16 x i8> %v
300}
301
302define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_7(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
303; CHECK-LABEL: insert_nxv16i8_nxv1i8_7:
304; CHECK:       # %bb.0:
305; CHECK-NEXT:    csrr a0, vlenb
306; CHECK-NEXT:    srli a0, a0, 3
307; CHECK-NEXT:    slli a1, a0, 3
308; CHECK-NEXT:    sub a0, a1, a0
309; CHECK-NEXT:    vsetvli a1, a1, e8,m1,tu,mu
310; CHECK-NEXT:    vslideup.vx v8, v10, a0
311; CHECK-NEXT:    ret
312  %v = call <vscale x 16 x i8> @llvm.experimental.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
314}
315
316define <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 a0, a0, 3
321; CHECK-NEXT:    slli a1, a0, 3
322; CHECK-NEXT:    sub a0, a1, a0
323; CHECK-NEXT:    vsetvli a1, a1, e8,m1,tu,mu
324; CHECK-NEXT:    vslideup.vx v9, v10, a0
325; CHECK-NEXT:    ret
326  %v = call <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 15)
327  ret <vscale x 16 x i8> %v
328}
329
330define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_0(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
331; CHECK-LABEL: insert_nxv32f16_nxv2f16_0:
332; CHECK:       # %bb.0:
333; CHECK-NEXT:    csrr a0, vlenb
334; CHECK-NEXT:    srli a0, a0, 2
335; CHECK-NEXT:    vsetvli a0, a0, e16,m1,tu,mu
336; CHECK-NEXT:    vslideup.vi v8, v16, 0
337; CHECK-NEXT:    ret
338  %v = call <vscale x 32 x half> @llvm.experimental.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 0)
339  ret <vscale x 32 x half> %v
340}
341
342define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_2(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
343; CHECK-LABEL: insert_nxv32f16_nxv2f16_2:
344; CHECK:       # %bb.0:
345; CHECK-NEXT:    csrr a0, vlenb
346; CHECK-NEXT:    srli a0, a0, 2
347; CHECK-NEXT:    add a1, a0, a0
348; CHECK-NEXT:    vsetvli a1, a1, e16,m1,tu,mu
349; CHECK-NEXT:    vslideup.vx v8, v16, a0
350; CHECK-NEXT:    ret
351  %v = call <vscale x 32 x half> @llvm.experimental.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 2)
352  ret <vscale x 32 x half> %v
353}
354
355define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_26(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
356; CHECK-LABEL: insert_nxv32f16_nxv2f16_26:
357; CHECK:       # %bb.0:
358; CHECK-NEXT:    csrr a0, vlenb
359; CHECK-NEXT:    srli a0, a0, 2
360; CHECK-NEXT:    add a1, a0, a0
361; CHECK-NEXT:    vsetvli a1, a1, e16,m1,tu,mu
362; CHECK-NEXT:    vslideup.vx v14, v16, a0
363; CHECK-NEXT:    ret
364  %v = call <vscale x 32 x half> @llvm.experimental.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 26)
365  ret <vscale x 32 x half> %v
366}
367
368define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_0(<vscale x 1 x half> %subvec) {
369; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_0:
370; CHECK:       # %bb.0:
371; CHECK-NEXT:    # kill: def $v8 killed $v8 def $v8m8
372; CHECK-NEXT:    ret
373  %v = call <vscale x 32 x half> @llvm.experimental.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 0)
374  ret <vscale x 32 x half> %v
375}
376
377define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_26(<vscale x 1 x half> %subvec) {
378; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_26:
379; CHECK:       # %bb.0:
380; CHECK-NEXT:    csrr a0, vlenb
381; CHECK-NEXT:    srli a0, a0, 3
382; CHECK-NEXT:    slli a1, a0, 1
383; CHECK-NEXT:    add a0, a1, a0
384; CHECK-NEXT:    vsetvli a0, a0, e16,m1,ta,mu
385; CHECK-NEXT:    vslideup.vx v22, v8, a1
386; CHECK-NEXT:    vmv8r.v v8, v16
387; CHECK-NEXT:    ret
388  %v = call <vscale x 32 x half> @llvm.experimental.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 26)
389  ret <vscale x 32 x half> %v
390}
391
392define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_0(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
393; CHECK-LABEL: insert_nxv32i1_nxv8i1_0:
394; CHECK:       # %bb.0:
395; CHECK-NEXT:    csrr a0, vlenb
396; CHECK-NEXT:    srli a0, a0, 3
397; CHECK-NEXT:    vsetvli a0, a0, e8,mf2,tu,mu
398; CHECK-NEXT:    vslideup.vi v0, v8, 0
399; CHECK-NEXT:    ret
400  %vec = call <vscale x 32 x i1> @llvm.experimental.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 0)
401  ret <vscale x 32 x i1> %vec
402}
403
404define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_8(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
405; CHECK-LABEL: insert_nxv32i1_nxv8i1_8:
406; CHECK:       # %bb.0:
407; CHECK-NEXT:    csrr a0, vlenb
408; CHECK-NEXT:    srli a0, a0, 3
409; CHECK-NEXT:    add a1, a0, a0
410; CHECK-NEXT:    vsetvli a1, a1, e8,mf2,tu,mu
411; CHECK-NEXT:    vslideup.vx v0, v8, a0
412; CHECK-NEXT:    ret
413  %vec = call <vscale x 32 x i1> @llvm.experimental.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 8)
414  ret <vscale x 32 x i1> %vec
415}
416
417define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_0(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
418; CHECK-LABEL: insert_nxv4i1_nxv1i1_0:
419; CHECK:       # %bb.0:
420; CHECK-NEXT:    vsetvli a0, zero, e8,mf2,ta,mu
421; CHECK-NEXT:    vmv.v.i v25, 0
422; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
423; CHECK-NEXT:    vsetvli a0, zero, e8,mf8,ta,mu
424; CHECK-NEXT:    vmv.v.i v26, 0
425; CHECK-NEXT:    vmv1r.v v0, v8
426; CHECK-NEXT:    vmerge.vim v26, v26, 1, v0
427; CHECK-NEXT:    csrr a0, vlenb
428; CHECK-NEXT:    srli a0, a0, 3
429; CHECK-NEXT:    vsetvli a0, a0, e8,mf2,tu,mu
430; CHECK-NEXT:    vslideup.vi v25, v26, 0
431; CHECK-NEXT:    vsetvli a0, zero, e8,mf2,ta,mu
432; CHECK-NEXT:    vmsne.vi v0, v25, 0
433; CHECK-NEXT:    ret
434  %vec = call <vscale x 4 x i1> @llvm.experimental.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 0)
435  ret <vscale x 4 x i1> %vec
436}
437
438define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_2(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
439; CHECK-LABEL: insert_nxv4i1_nxv1i1_2:
440; CHECK:       # %bb.0:
441; CHECK-NEXT:    vsetvli a0, zero, e8,mf2,ta,mu
442; CHECK-NEXT:    vmv.v.i v25, 0
443; CHECK-NEXT:    vmerge.vim v25, v25, 1, v0
444; CHECK-NEXT:    csrr a0, vlenb
445; CHECK-NEXT:    srli a0, a0, 3
446; CHECK-NEXT:    slli a1, a0, 1
447; CHECK-NEXT:    add a0, a1, a0
448; CHECK-NEXT:    vsetvli a2, zero, e8,mf8,ta,mu
449; CHECK-NEXT:    vmv.v.i v26, 0
450; CHECK-NEXT:    vmv1r.v v0, v8
451; CHECK-NEXT:    vmerge.vim v26, v26, 1, v0
452; CHECK-NEXT:    vsetvli a0, a0, e8,mf2,tu,mu
453; CHECK-NEXT:    vslideup.vx v25, v26, a1
454; CHECK-NEXT:    vsetvli a0, zero, e8,mf2,ta,mu
455; CHECK-NEXT:    vmsne.vi v0, v25, 0
456; CHECK-NEXT:    ret
457  %vec = call <vscale x 4 x i1> @llvm.experimental.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 2)
458  ret <vscale x 4 x i1> %vec
459}
460
461declare <vscale x 16 x i64> @llvm.experimental.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64>, <vscale x 8 x i64>, i64)
462
463define void @insert_nxv8i64_nxv16i64(<vscale x 8 x i64> %sv0, <vscale x 8 x i64> %sv1, <vscale x 16 x i64>* %out) {
464; CHECK-LABEL: insert_nxv8i64_nxv16i64:
465; CHECK:       # %bb.0:
466; CHECK-NEXT:    vs8r.v v8, (a0)
467; CHECK-NEXT:    csrr a1, vlenb
468; CHECK-NEXT:    slli a1, a1, 3
469; CHECK-NEXT:    add a0, a0, a1
470; CHECK-NEXT:    vs8r.v v16, (a0)
471; CHECK-NEXT:    ret
472  %v0 = call <vscale x 16 x i64> @llvm.experimental.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0)
473  %v = call <vscale x 16 x i64> @llvm.experimental.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> %v0, <vscale x 8 x i64> %sv1, i64 8)
474  store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
475  ret void
476}
477
478define void @insert_nxv8i64_nxv16i64_lo(<vscale x 8 x i64> %sv0, <vscale x 16 x i64>* %out) {
479; CHECK-LABEL: insert_nxv8i64_nxv16i64_lo:
480; CHECK:       # %bb.0:
481; CHECK-NEXT:    vs8r.v v8, (a0)
482; CHECK-NEXT:    ret
483  %v = call <vscale x 16 x i64> @llvm.experimental.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0)
484  store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
485  ret void
486}
487
488define void @insert_nxv8i64_nxv16i64_hi(<vscale x 8 x i64> %sv0, <vscale x 16 x i64>* %out) {
489; CHECK-LABEL: insert_nxv8i64_nxv16i64_hi:
490; CHECK:       # %bb.0:
491; CHECK-NEXT:    csrr a1, vlenb
492; CHECK-NEXT:    slli a1, a1, 3
493; CHECK-NEXT:    add a0, a0, a1
494; CHECK-NEXT:    vs8r.v v8, (a0)
495; CHECK-NEXT:    ret
496  %v = call <vscale x 16 x i64> @llvm.experimental.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 8)
497  store <vscale x 16 x i64> %v, <vscale x 16 x i64>* %out
498  ret void
499}
500
501declare <vscale x 4 x i1> @llvm.experimental.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1>, <vscale x 1 x i1>, i64)
502declare <vscale x 32 x i1> @llvm.experimental.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1>, <vscale x 8 x i1>, i64)
503
504declare <vscale x 16 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8>, <vscale x 1 x i8>, i64)
505
506declare <vscale x 32 x half> @llvm.experimental.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half>, <vscale x 1 x half>, i64)
507declare <vscale x 32 x half> @llvm.experimental.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half>, <vscale x 2 x half>, i64)
508
509declare <vscale x 4 x i8> @llvm.experimental.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8>, <vscale x 1 x i8>, i64 %idx)
510
511declare <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32>, <vscale x 2 x i32>, i64 %idx)
512declare <vscale x 8 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32>, <vscale x 4 x i32>, i64 %idx)
513
514declare <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32>, <vscale x 1 x i32>, i64 %idx)
515declare <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32>, <vscale x 2 x i32>, i64 %idx)
516declare <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32>, <vscale x 4 x i32>, i64 %idx)
517declare <vscale x 16 x i32> @llvm.experimental.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32>, <vscale x 8 x i32>, i64 %idx)
518