xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/insert-subvector.ll (revision b6c0f1bfa79a3a32d841ac5ab1f94c3aee3b5d90)
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
4
5define <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:    vsetivli zero, 1, e8, m1, ta, ma
9; CHECK-NEXT:    vmv2r.v v8, v12
10; CHECK-NEXT:    ret
11  %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)
12  ret <vscale x 8 x i32> %v
13}
14
15define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_4(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) {
16; CHECK-LABEL: insert_nxv8i32_nxv4i32_4:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
19; CHECK-NEXT:    vmv2r.v v10, v12
20; CHECK-NEXT:    ret
21  %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)
22  ret <vscale x 8 x i32> %v
23}
24
25define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_0(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
26; CHECK-LABEL: insert_nxv8i32_nxv2i32_0:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
29; CHECK-NEXT:    vmv1r.v v8, v12
30; CHECK-NEXT:    ret
31  %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)
32  ret <vscale x 8 x i32> %v
33}
34
35define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_2(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
36; CHECK-LABEL: insert_nxv8i32_nxv2i32_2:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
39; CHECK-NEXT:    vmv1r.v v9, v12
40; CHECK-NEXT:    ret
41  %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)
42  ret <vscale x 8 x i32> %v
43}
44
45define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_4(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
46; CHECK-LABEL: insert_nxv8i32_nxv2i32_4:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
49; CHECK-NEXT:    vmv1r.v v10, v12
50; CHECK-NEXT:    ret
51  %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)
52  ret <vscale x 8 x i32> %v
53}
54
55define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_6(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) {
56; CHECK-LABEL: insert_nxv8i32_nxv2i32_6:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
59; CHECK-NEXT:    vmv1r.v v11, v12
60; CHECK-NEXT:    ret
61  %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)
62  ret <vscale x 8 x i32> %v
63}
64
65define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_0(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
66; CHECK-LABEL: insert_nxv1i8_nxv4i8_0:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    csrr a0, vlenb
69; CHECK-NEXT:    srli a0, a0, 3
70; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, ma
71; CHECK-NEXT:    vmv.v.v v8, v9
72; CHECK-NEXT:    ret
73  %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)
74  ret <vscale x 4 x i8> %v
75}
76
77define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_3(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) {
78; CHECK-LABEL: insert_nxv1i8_nxv4i8_3:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    csrr a0, vlenb
81; CHECK-NEXT:    srli a0, a0, 3
82; CHECK-NEXT:    slli a1, a0, 1
83; CHECK-NEXT:    add a1, a1, a0
84; CHECK-NEXT:    add a0, a1, a0
85; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
86; CHECK-NEXT:    vslideup.vx v8, v9, a1
87; CHECK-NEXT:    ret
88  %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)
89  ret <vscale x 4 x i8> %v
90}
91
92define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_0(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
93; CHECK-LABEL: insert_nxv16i32_nxv8i32_0:
94; CHECK:       # %bb.0:
95; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
96; CHECK-NEXT:    vmv4r.v v8, v16
97; CHECK-NEXT:    ret
98  %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)
99  ret <vscale x 16 x i32> %v
100}
101
102define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_8(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) {
103; CHECK-LABEL: insert_nxv16i32_nxv8i32_8:
104; CHECK:       # %bb.0:
105; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
106; CHECK-NEXT:    vmv4r.v v12, v16
107; CHECK-NEXT:    ret
108  %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)
109  ret <vscale x 16 x i32> %v
110}
111
112define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_0(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
113; CHECK-LABEL: insert_nxv16i32_nxv4i32_0:
114; CHECK:       # %bb.0:
115; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
116; CHECK-NEXT:    vmv2r.v v8, 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 0)
119  ret <vscale x 16 x i32> %v
120}
121
122define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_4(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
123; CHECK-LABEL: insert_nxv16i32_nxv4i32_4:
124; CHECK:       # %bb.0:
125; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
126; CHECK-NEXT:    vmv2r.v v10, v16
127; CHECK-NEXT:    ret
128  %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)
129  ret <vscale x 16 x i32> %v
130}
131
132define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_8(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
133; CHECK-LABEL: insert_nxv16i32_nxv4i32_8:
134; CHECK:       # %bb.0:
135; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
136; CHECK-NEXT:    vmv2r.v v12, v16
137; CHECK-NEXT:    ret
138  %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)
139  ret <vscale x 16 x i32> %v
140}
141
142define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_12(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) {
143; CHECK-LABEL: insert_nxv16i32_nxv4i32_12:
144; CHECK:       # %bb.0:
145; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
146; CHECK-NEXT:    vmv2r.v v14, v16
147; CHECK-NEXT:    ret
148  %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)
149  ret <vscale x 16 x i32> %v
150}
151
152define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_0(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
153; CHECK-LABEL: insert_nxv16i32_nxv2i32_0:
154; CHECK:       # %bb.0:
155; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
156; CHECK-NEXT:    vmv1r.v v8, v16
157; CHECK-NEXT:    ret
158  %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)
159  ret <vscale x 16 x i32> %v
160}
161
162define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_2(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
163; CHECK-LABEL: insert_nxv16i32_nxv2i32_2:
164; CHECK:       # %bb.0:
165; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
166; CHECK-NEXT:    vmv1r.v v9, v16
167; CHECK-NEXT:    ret
168  %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)
169  ret <vscale x 16 x i32> %v
170}
171
172define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_4(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
173; CHECK-LABEL: insert_nxv16i32_nxv2i32_4:
174; CHECK:       # %bb.0:
175; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
176; CHECK-NEXT:    vmv1r.v v10, v16
177; CHECK-NEXT:    ret
178  %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)
179  ret <vscale x 16 x i32> %v
180}
181
182define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_6(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
183; CHECK-LABEL: insert_nxv16i32_nxv2i32_6:
184; CHECK:       # %bb.0:
185; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
186; CHECK-NEXT:    vmv1r.v v11, v16
187; CHECK-NEXT:    ret
188  %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)
189  ret <vscale x 16 x i32> %v
190}
191
192define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_8(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
193; CHECK-LABEL: insert_nxv16i32_nxv2i32_8:
194; CHECK:       # %bb.0:
195; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
196; CHECK-NEXT:    vmv1r.v v12, v16
197; CHECK-NEXT:    ret
198  %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)
199  ret <vscale x 16 x i32> %v
200}
201
202define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_10(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
203; CHECK-LABEL: insert_nxv16i32_nxv2i32_10:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
206; CHECK-NEXT:    vmv1r.v v13, 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 10)
209  ret <vscale x 16 x i32> %v
210}
211
212define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_12(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
213; CHECK-LABEL: insert_nxv16i32_nxv2i32_12:
214; CHECK:       # %bb.0:
215; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
216; CHECK-NEXT:    vmv1r.v v14, v16
217; CHECK-NEXT:    ret
218  %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)
219  ret <vscale x 16 x i32> %v
220}
221
222define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_14(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) {
223; CHECK-LABEL: insert_nxv16i32_nxv2i32_14:
224; CHECK:       # %bb.0:
225; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
226; CHECK-NEXT:    vmv1r.v v15, v16
227; CHECK-NEXT:    ret
228  %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)
229  ret <vscale x 16 x i32> %v
230}
231
232define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_0(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
233; CHECK-LABEL: insert_nxv16i32_nxv1i32_0:
234; CHECK:       # %bb.0:
235; CHECK-NEXT:    csrr a0, vlenb
236; CHECK-NEXT:    srli a0, a0, 3
237; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, ma
238; CHECK-NEXT:    vmv.v.v v8, v16
239; CHECK-NEXT:    ret
240  %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)
241  ret <vscale x 16 x i32> %v
242}
243
244define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_1(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
245; CHECK-LABEL: insert_nxv16i32_nxv1i32_1:
246; CHECK:       # %bb.0:
247; CHECK-NEXT:    csrr a0, vlenb
248; CHECK-NEXT:    srli a0, a0, 3
249; CHECK-NEXT:    add a1, a0, a0
250; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
251; CHECK-NEXT:    vslideup.vx v8, v16, a0
252; CHECK-NEXT:    ret
253  %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)
254  ret <vscale x 16 x i32> %v
255}
256
257define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_6(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) {
258; CHECK-LABEL: insert_nxv16i32_nxv1i32_6:
259; CHECK:       # %bb.0:
260; CHECK-NEXT:    csrr a0, vlenb
261; CHECK-NEXT:    srli a0, a0, 3
262; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, ma
263; CHECK-NEXT:    vmv.v.v v11, v16
264; CHECK-NEXT:    ret
265  %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)
266  ret <vscale x 16 x i32> %v
267}
268
269define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_0(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
270; CHECK-LABEL: insert_nxv16i8_nxv1i8_0:
271; CHECK:       # %bb.0:
272; CHECK-NEXT:    csrr a0, vlenb
273; CHECK-NEXT:    srli a0, a0, 3
274; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, ma
275; CHECK-NEXT:    vmv.v.v v8, v10
276; CHECK-NEXT:    ret
277  %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)
278  ret <vscale x 16 x i8> %v
279}
280
281define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_1(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
282; CHECK-LABEL: insert_nxv16i8_nxv1i8_1:
283; CHECK:       # %bb.0:
284; CHECK-NEXT:    csrr a0, vlenb
285; CHECK-NEXT:    srli a0, a0, 3
286; CHECK-NEXT:    add a1, a0, a0
287; CHECK-NEXT:    vsetvli zero, a1, e8, m1, tu, ma
288; CHECK-NEXT:    vslideup.vx v8, v10, a0
289; CHECK-NEXT:    ret
290  %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)
291  ret <vscale x 16 x i8> %v
292}
293
294define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_2(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
295; CHECK-LABEL: insert_nxv16i8_nxv1i8_2:
296; CHECK:       # %bb.0:
297; CHECK-NEXT:    csrr a0, vlenb
298; CHECK-NEXT:    srli a1, a0, 3
299; CHECK-NEXT:    srli a0, a0, 2
300; CHECK-NEXT:    add a1, a0, a1
301; CHECK-NEXT:    vsetvli zero, a1, e8, m1, tu, ma
302; CHECK-NEXT:    vslideup.vx v8, v10, a0
303; CHECK-NEXT:    ret
304  %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)
305  ret <vscale x 16 x i8> %v
306}
307
308define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_3(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
309; CHECK-LABEL: insert_nxv16i8_nxv1i8_3:
310; CHECK:       # %bb.0:
311; CHECK-NEXT:    csrr a0, vlenb
312; CHECK-NEXT:    srli a0, a0, 3
313; CHECK-NEXT:    slli a1, a0, 1
314; CHECK-NEXT:    add a1, a1, a0
315; CHECK-NEXT:    add a0, a1, a0
316; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, ma
317; CHECK-NEXT:    vslideup.vx v8, v10, a1
318; CHECK-NEXT:    ret
319  %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)
320  ret <vscale x 16 x i8> %v
321}
322
323define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_7(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
324; CHECK-LABEL: insert_nxv16i8_nxv1i8_7:
325; CHECK:       # %bb.0:
326; CHECK-NEXT:    csrr a0, vlenb
327; CHECK-NEXT:    srli a1, a0, 3
328; CHECK-NEXT:    sub a0, a0, a1
329; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
330; CHECK-NEXT:    vslideup.vx v8, v10, a0
331; CHECK-NEXT:    ret
332  %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)
333  ret <vscale x 16 x i8> %v
334}
335
336define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_15(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) {
337; CHECK-LABEL: insert_nxv16i8_nxv1i8_15:
338; CHECK:       # %bb.0:
339; CHECK-NEXT:    csrr a0, vlenb
340; CHECK-NEXT:    srli a1, a0, 3
341; CHECK-NEXT:    sub a0, a0, a1
342; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
343; CHECK-NEXT:    vslideup.vx v9, v10, a0
344; CHECK-NEXT:    ret
345  %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)
346  ret <vscale x 16 x i8> %v
347}
348
349define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_0(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
350; CHECK-LABEL: insert_nxv32f16_nxv2f16_0:
351; CHECK:       # %bb.0:
352; CHECK-NEXT:    csrr a0, vlenb
353; CHECK-NEXT:    srli a0, a0, 2
354; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
355; CHECK-NEXT:    vmv.v.v v8, v16
356; CHECK-NEXT:    ret
357  %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)
358  ret <vscale x 32 x half> %v
359}
360
361define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_2(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
362; CHECK-LABEL: insert_nxv32f16_nxv2f16_2:
363; CHECK:       # %bb.0:
364; CHECK-NEXT:    csrr a0, vlenb
365; CHECK-NEXT:    srli a0, a0, 2
366; CHECK-NEXT:    add a1, a0, a0
367; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
368; CHECK-NEXT:    vslideup.vx v8, v16, a0
369; CHECK-NEXT:    ret
370  %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)
371  ret <vscale x 32 x half> %v
372}
373
374define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_26(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) {
375; CHECK-LABEL: insert_nxv32f16_nxv2f16_26:
376; CHECK:       # %bb.0:
377; CHECK-NEXT:    csrr a0, vlenb
378; CHECK-NEXT:    srli a0, a0, 2
379; CHECK-NEXT:    add a1, a0, a0
380; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
381; CHECK-NEXT:    vslideup.vx v14, v16, a0
382; CHECK-NEXT:    ret
383  %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)
384  ret <vscale x 32 x half> %v
385}
386
387define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_0(<vscale x 1 x half> %subvec) {
388; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_0:
389; CHECK:       # %bb.0:
390; CHECK-NEXT:    ret
391  %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)
392  ret <vscale x 32 x half> %v
393}
394
395define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_26(<vscale x 1 x half> %subvec) {
396; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_26:
397; CHECK:       # %bb.0:
398; CHECK-NEXT:    csrr a0, vlenb
399; CHECK-NEXT:    srli a1, a0, 3
400; CHECK-NEXT:    srli a0, a0, 2
401; CHECK-NEXT:    add a1, a0, a1
402; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
403; CHECK-NEXT:    vslideup.vx v14, v8, a0
404; CHECK-NEXT:    ret
405  %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)
406  ret <vscale x 32 x half> %v
407}
408
409define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_0(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
410; CHECK-LABEL: insert_nxv32i1_nxv8i1_0:
411; CHECK:       # %bb.0:
412; CHECK-NEXT:    csrr a0, vlenb
413; CHECK-NEXT:    srli a0, a0, 3
414; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, ma
415; CHECK-NEXT:    vmv.v.v v0, v8
416; CHECK-NEXT:    ret
417  %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)
418  ret <vscale x 32 x i1> %vec
419}
420
421define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_8(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) {
422; CHECK-LABEL: insert_nxv32i1_nxv8i1_8:
423; CHECK:       # %bb.0:
424; CHECK-NEXT:    csrr a0, vlenb
425; CHECK-NEXT:    srli a0, a0, 3
426; CHECK-NEXT:    add a1, a0, a0
427; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, tu, ma
428; CHECK-NEXT:    vslideup.vx v0, v8, a0
429; CHECK-NEXT:    ret
430  %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)
431  ret <vscale x 32 x i1> %vec
432}
433
434define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_0(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
435; CHECK-LABEL: insert_nxv4i1_nxv1i1_0:
436; CHECK:       # %bb.0:
437; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
438; CHECK-NEXT:    vmv.v.i v9, 0
439; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
440; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
441; CHECK-NEXT:    vmv.v.i v10, 0
442; CHECK-NEXT:    csrr a0, vlenb
443; CHECK-NEXT:    vmv1r.v v0, v8
444; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
445; CHECK-NEXT:    srli a0, a0, 3
446; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, ma
447; CHECK-NEXT:    vmv.v.v v9, v8
448; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
449; CHECK-NEXT:    vmsne.vi v0, v9, 0
450; CHECK-NEXT:    ret
451  %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)
452  ret <vscale x 4 x i1> %vec
453}
454
455define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_2(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) {
456; CHECK-LABEL: insert_nxv4i1_nxv1i1_2:
457; CHECK:       # %bb.0:
458; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
459; CHECK-NEXT:    vmv.v.i v9, 0
460; CHECK-NEXT:    csrr a0, vlenb
461; CHECK-NEXT:    vmerge.vim v9, v9, 1, v0
462; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
463; CHECK-NEXT:    vmv.v.i v10, 0
464; CHECK-NEXT:    srli a1, a0, 3
465; CHECK-NEXT:    srli a0, a0, 2
466; CHECK-NEXT:    add a1, a0, a1
467; CHECK-NEXT:    vmv1r.v v0, v8
468; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
469; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, tu, ma
470; CHECK-NEXT:    vslideup.vx v9, v8, a0
471; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
472; CHECK-NEXT:    vmsne.vi v0, v9, 0
473; CHECK-NEXT:    ret
474  %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)
475  ret <vscale x 4 x i1> %vec
476}
477
478declare <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64>, <vscale x 8 x i64>, i64)
479
480define void @insert_nxv8i64_nxv16i64(<vscale x 8 x i64> %sv0, <vscale x 8 x i64> %sv1, ptr %out) {
481; CHECK-LABEL: insert_nxv8i64_nxv16i64:
482; CHECK:       # %bb.0:
483; CHECK-NEXT:    vs8r.v v8, (a0)
484; CHECK-NEXT:    csrr a1, vlenb
485; CHECK-NEXT:    slli a1, a1, 3
486; CHECK-NEXT:    add a0, a0, a1
487; CHECK-NEXT:    vs8r.v v16, (a0)
488; CHECK-NEXT:    ret
489  %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)
490  %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)
491  store <vscale x 16 x i64> %v, ptr %out
492  ret void
493}
494
495define void @insert_nxv8i64_nxv16i64_lo(<vscale x 8 x i64> %sv0, ptr %out) {
496; CHECK-LABEL: insert_nxv8i64_nxv16i64_lo:
497; CHECK:       # %bb.0:
498; CHECK-NEXT:    vs8r.v v8, (a0)
499; CHECK-NEXT:    ret
500  %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)
501  store <vscale x 16 x i64> %v, ptr %out
502  ret void
503}
504
505define void @insert_nxv8i64_nxv16i64_hi(<vscale x 8 x i64> %sv0, ptr %out) {
506; CHECK-LABEL: insert_nxv8i64_nxv16i64_hi:
507; CHECK:       # %bb.0:
508; CHECK-NEXT:    csrr a1, vlenb
509; CHECK-NEXT:    slli a1, a1, 3
510; CHECK-NEXT:    add a0, a0, a1
511; CHECK-NEXT:    vs8r.v v8, (a0)
512; CHECK-NEXT:    ret
513  %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)
514  store <vscale x 16 x i64> %v, ptr %out
515  ret void
516}
517
518; We should be able to widen the <3 x i64> subvector to a <4 x i64> here because
519; we know that the minimum vscale is 2
520define <vscale x 2 x i64> @insert_nxv2i64_nxv3i64(<3 x i64> %sv) #0 {
521; CHECK-LABEL: insert_nxv2i64_nxv3i64:
522; CHECK:       # %bb.0:
523; CHECK-NEXT:    ret
524  %vec = call <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64> undef, <3 x i64> %sv, i64 0)
525  ret <vscale x 2 x i64> %vec
526}
527
528; This shows a case where we were miscompiling because the index of the
529; outer expects a scalable inner and the inner most subvector is fixed length.
530; The code generated happens to be correct if VLEN=128, but is wrong if
531; VLEN=256.
532define <vscale x 8 x i32> @insert_insert_combine(<2 x i32> %subvec) {
533; CHECK-LABEL: insert_insert_combine:
534; CHECK:       # %bb.0:
535; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
536; CHECK-NEXT:    vmv1r.v v10, v8
537; CHECK-NEXT:    ret
538  %inner = call <vscale x 4 x i32> @llvm.vector.insert.nxv4i32.v2i32(<vscale x 4 x i32> undef, <2 x i32> %subvec, i64 0)
539  %outer = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> undef, <vscale x 4 x i32> %inner, i64 4)
540  ret <vscale x 8 x i32> %outer
541}
542
543; We can combine these two (even with non-zero index on the outer) because
544; the vector must be an even multiple.
545define <vscale x 8 x i32> @insert_insert_combine2(<vscale x 2 x i32> %subvec) {
546; CHECK-LABEL: insert_insert_combine2:
547; CHECK:       # %bb.0:
548; CHECK-NEXT:    vsetivli zero, 1, e8, m1, ta, ma
549; CHECK-NEXT:    vmv1r.v v10, v8
550; CHECK-NEXT:    ret
551  %inner = call <vscale x 4 x i32> @llvm.vector.insert.nxv2i32.nxv4i32(<vscale x 4 x i32> undef, <vscale x 2 x i32> %subvec, i64 0)
552  %outer = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> undef, <vscale x 4 x i32> %inner, i64 4)
553  ret <vscale x 8 x i32> %outer
554}
555
556define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_0(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) {
557; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_0:
558; CHECK:       # %bb.0:
559; CHECK-NEXT:    csrr a0, vlenb
560; CHECK-NEXT:    srli a0, a0, 2
561; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, ma
562; CHECK-NEXT:    vmv.v.v v8, v16
563; CHECK-NEXT:    ret
564  %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 0)
565  ret <vscale x 32 x bfloat> %v
566}
567
568define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_2(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) {
569; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_2:
570; CHECK:       # %bb.0:
571; CHECK-NEXT:    csrr a0, vlenb
572; CHECK-NEXT:    srli a0, a0, 2
573; CHECK-NEXT:    add a1, a0, a0
574; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
575; CHECK-NEXT:    vslideup.vx v8, v16, a0
576; CHECK-NEXT:    ret
577  %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 2)
578  ret <vscale x 32 x bfloat> %v
579}
580
581define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_26(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) {
582; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_26:
583; CHECK:       # %bb.0:
584; CHECK-NEXT:    csrr a0, vlenb
585; CHECK-NEXT:    srli a0, a0, 2
586; CHECK-NEXT:    add a1, a0, a0
587; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
588; CHECK-NEXT:    vslideup.vx v14, v16, a0
589; CHECK-NEXT:    ret
590  %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 26)
591  ret <vscale x 32 x bfloat> %v
592}
593
594define <vscale x 32 x bfloat> @insert_nxv32bf16_undef_nxv1bf16_0(<vscale x 1 x bfloat> %subvec) {
595; CHECK-LABEL: insert_nxv32bf16_undef_nxv1bf16_0:
596; CHECK:       # %bb.0:
597; CHECK-NEXT:    ret
598  %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv1bf16.nxv32bf16(<vscale x 32 x bfloat> undef, <vscale x 1 x bfloat> %subvec, i64 0)
599  ret <vscale x 32 x bfloat> %v
600}
601
602define <vscale x 32 x bfloat> @insert_nxv32bf16_undef_nxv1bf16_26(<vscale x 1 x bfloat> %subvec) {
603; CHECK-LABEL: insert_nxv32bf16_undef_nxv1bf16_26:
604; CHECK:       # %bb.0:
605; CHECK-NEXT:    csrr a0, vlenb
606; CHECK-NEXT:    srli a1, a0, 3
607; CHECK-NEXT:    srli a0, a0, 2
608; CHECK-NEXT:    add a1, a0, a1
609; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
610; CHECK-NEXT:    vslideup.vx v14, v8, a0
611; CHECK-NEXT:    ret
612  %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv1bf16.nxv32bf16(<vscale x 32 x bfloat> undef, <vscale x 1 x bfloat> %subvec, i64 26)
613  ret <vscale x 32 x bfloat> %v
614}
615
616attributes #0 = { vscale_range(2,1024) }
617
618declare <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1>, <vscale x 1 x i1>, i64)
619declare <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1>, <vscale x 8 x i1>, i64)
620
621declare <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8>, <vscale x 1 x i8>, i64)
622
623declare <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half>, <vscale x 1 x half>, i64)
624declare <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half>, <vscale x 2 x half>, i64)
625
626declare <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8>, <vscale x 1 x i8>, i64 %idx)
627
628declare <vscale x 4 x i32> @llvm.vector.insert.nxv2i32.nxv4i32(<vscale x 4 x i32>, <vscale x 2 x i32>, i64)
629declare <vscale x 4 x i32> @llvm.vector.insert.nxv4i32.v2i32(<vscale x 4 x i32>, <2 x i32>, i64)
630
631declare <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32>, <vscale x 2 x i32>, i64 %idx)
632declare <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32>, <vscale x 4 x i32>, i64 %idx)
633
634declare <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32>, <vscale x 1 x i32>, i64 %idx)
635declare <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32>, <vscale x 2 x i32>, i64 %idx)
636declare <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32>, <vscale x 4 x i32>, i64 %idx)
637declare <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32>, <vscale x 8 x i32>, i64 %idx)
638
639declare <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64>, <3 x i64>, i64 %idx)
640