xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-vslide1up.ll (revision b6c0f1bfa79a3a32d841ac5ab1f94c3aee3b5d90)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV32
3; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV64
4; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV32
5; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV64
6
7target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
8
9define <2 x i8> @vslide1up_2xi8(<2 x i8> %v, i8 %b) {
10; CHECK-LABEL: vslide1up_2xi8:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
13; CHECK-NEXT:    vslide1up.vx v9, v8, a0
14; CHECK-NEXT:    vmv1r.v v8, v9
15; CHECK-NEXT:    ret
16  %vb = insertelement <2 x i8> poison, i8 %b, i64 0
17  %v1 = shufflevector <2 x i8> %v, <2 x i8> %vb, <2 x i32> <i32 2, i32 0>
18  ret <2 x i8> %v1
19}
20
21define <4 x i8> @vslide1up_4xi8(<4 x i8> %v, i8 %b) {
22; CHECK-LABEL: vslide1up_4xi8:
23; CHECK:       # %bb.0:
24; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
25; CHECK-NEXT:    vslide1up.vx v9, v8, a0
26; CHECK-NEXT:    vmv1r.v v8, v9
27; CHECK-NEXT:    ret
28  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
29  %v1 = shufflevector <4 x i8> %v, <4 x i8> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
30  ret <4 x i8> %v1
31}
32
33define <4 x i8> @vslide1up_4xi8_swapped(<4 x i8> %v, i8 %b) {
34; CHECK-LABEL: vslide1up_4xi8_swapped:
35; CHECK:       # %bb.0:
36; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
37; CHECK-NEXT:    vslide1up.vx v9, v8, a0
38; CHECK-NEXT:    vmv1r.v v8, v9
39; CHECK-NEXT:    ret
40  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
41  %v1 = shufflevector <4 x i8> %vb, <4 x i8> %v, <4 x i32> <i32 0, i32 4, i32 5, i32 6>
42  ret <4 x i8> %v1
43}
44
45define <2 x i16> @vslide1up_2xi16(<2 x i16> %v, i16 %b) {
46; CHECK-LABEL: vslide1up_2xi16:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
49; CHECK-NEXT:    vslide1up.vx v9, v8, a0
50; CHECK-NEXT:    vmv1r.v v8, v9
51; CHECK-NEXT:    ret
52  %vb = insertelement <2 x i16> poison, i16 %b, i64 0
53  %v1 = shufflevector <2 x i16> %v, <2 x i16> %vb, <2 x i32> <i32 2, i32 0>
54  ret <2 x i16> %v1
55}
56
57define <4 x i16> @vslide1up_4xi16(<4 x i16> %v, i16 %b) {
58; CHECK-LABEL: vslide1up_4xi16:
59; CHECK:       # %bb.0:
60; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
61; CHECK-NEXT:    vslide1up.vx v9, v8, a0
62; CHECK-NEXT:    vmv1r.v v8, v9
63; CHECK-NEXT:    ret
64  %vb = insertelement <4 x i16> poison, i16 %b, i64 0
65  %v1 = shufflevector <4 x i16> %v, <4 x i16> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
66  ret <4 x i16> %v1
67}
68
69define <2 x i32> @vslide1up_2xi32(<2 x i32> %v, i32 %b) {
70; CHECK-LABEL: vslide1up_2xi32:
71; CHECK:       # %bb.0:
72; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
73; CHECK-NEXT:    vslide1up.vx v9, v8, a0
74; CHECK-NEXT:    vmv1r.v v8, v9
75; CHECK-NEXT:    ret
76  %vb = insertelement <2 x i32> poison, i32 %b, i64 0
77  %v1 = shufflevector <2 x i32> %v, <2 x i32> %vb, <2 x i32> <i32 2, i32 0>
78  ret <2 x i32> %v1
79}
80
81define <4 x i32> @vslide1up_4xi32(<4 x i32> %v, i32 %b) {
82; CHECK-LABEL: vslide1up_4xi32:
83; CHECK:       # %bb.0:
84; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
85; CHECK-NEXT:    vslide1up.vx v9, v8, a0
86; CHECK-NEXT:    vmv.v.v v8, v9
87; CHECK-NEXT:    ret
88  %vb = insertelement <4 x i32> poison, i32 %b, i64 0
89  %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
90  ret <4 x i32> %v1
91}
92
93define <2 x i64> @vslide1up_2xi64(<2 x i64> %v, i64 %b) {
94; RV32-LABEL: vslide1up_2xi64:
95; RV32:       # %bb.0:
96; RV32-NEXT:    addi sp, sp, -16
97; RV32-NEXT:    .cfi_def_cfa_offset 16
98; RV32-NEXT:    sw a0, 8(sp)
99; RV32-NEXT:    sw a1, 12(sp)
100; RV32-NEXT:    addi a0, sp, 8
101; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
102; RV32-NEXT:    vlse64.v v9, (a0), zero
103; RV32-NEXT:    vslideup.vi v9, v8, 1
104; RV32-NEXT:    vmv.v.v v8, v9
105; RV32-NEXT:    addi sp, sp, 16
106; RV32-NEXT:    .cfi_def_cfa_offset 0
107; RV32-NEXT:    ret
108;
109; RV64-LABEL: vslide1up_2xi64:
110; RV64:       # %bb.0:
111; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
112; RV64-NEXT:    vslide1up.vx v9, v8, a0
113; RV64-NEXT:    vmv.v.v v8, v9
114; RV64-NEXT:    ret
115  %vb = insertelement <2 x i64> poison, i64 %b, i64 0
116  %v1 = shufflevector <2 x i64> %v, <2 x i64> %vb, <2 x i32> <i32 2, i32 0>
117  ret <2 x i64> %v1
118}
119
120define <4 x i64> @vslide1up_4xi64(<4 x i64> %v, i64 %b) {
121; RV32-LABEL: vslide1up_4xi64:
122; RV32:       # %bb.0:
123; RV32-NEXT:    addi sp, sp, -16
124; RV32-NEXT:    .cfi_def_cfa_offset 16
125; RV32-NEXT:    sw a0, 8(sp)
126; RV32-NEXT:    sw a1, 12(sp)
127; RV32-NEXT:    addi a0, sp, 8
128; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
129; RV32-NEXT:    vlse64.v v10, (a0), zero
130; RV32-NEXT:    vslideup.vi v10, v8, 1
131; RV32-NEXT:    vmv.v.v v8, v10
132; RV32-NEXT:    addi sp, sp, 16
133; RV32-NEXT:    .cfi_def_cfa_offset 0
134; RV32-NEXT:    ret
135;
136; RV64-LABEL: vslide1up_4xi64:
137; RV64:       # %bb.0:
138; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
139; RV64-NEXT:    vslide1up.vx v10, v8, a0
140; RV64-NEXT:    vmv.v.v v8, v10
141; RV64-NEXT:    ret
142  %vb = insertelement <4 x i64> poison, i64 %b, i64 0
143  %v1 = shufflevector <4 x i64> %v, <4 x i64> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
144  ret <4 x i64> %v1
145}
146
147define <2 x bfloat> @vslide1up_2xbf16(<2 x bfloat> %v, bfloat %b) {
148; CHECK-LABEL: vslide1up_2xbf16:
149; CHECK:       # %bb.0:
150; CHECK-NEXT:    fmv.x.h a0, fa0
151; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
152; CHECK-NEXT:    vslide1up.vx v9, v8, a0
153; CHECK-NEXT:    vmv1r.v v8, v9
154; CHECK-NEXT:    ret
155  %vb = insertelement <2 x bfloat> poison, bfloat %b, i64 0
156  %v1 = shufflevector <2 x bfloat> %v, <2 x bfloat> %vb, <2 x i32> <i32 2, i32 0>
157  ret <2 x bfloat> %v1
158}
159
160define <4 x bfloat> @vslide1up_4xbf16(<4 x bfloat> %v, bfloat %b) {
161; CHECK-LABEL: vslide1up_4xbf16:
162; CHECK:       # %bb.0:
163; CHECK-NEXT:    fmv.x.h a0, fa0
164; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
165; CHECK-NEXT:    vslide1up.vx v9, v8, a0
166; CHECK-NEXT:    vmv1r.v v8, v9
167; CHECK-NEXT:    ret
168  %vb = insertelement <4 x bfloat> poison, bfloat %b, i64 0
169  %v1 = shufflevector <4 x bfloat> %v, <4 x bfloat> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
170  ret <4 x bfloat> %v1
171}
172
173define <2 x half> @vslide1up_2xf16(<2 x half> %v, half %b) {
174; ZVFH-LABEL: vslide1up_2xf16:
175; ZVFH:       # %bb.0:
176; ZVFH-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
177; ZVFH-NEXT:    vfslide1up.vf v9, v8, fa0
178; ZVFH-NEXT:    vmv1r.v v8, v9
179; ZVFH-NEXT:    ret
180;
181; ZVFHMIN-LABEL: vslide1up_2xf16:
182; ZVFHMIN:       # %bb.0:
183; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
184; ZVFHMIN-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
185; ZVFHMIN-NEXT:    vslide1up.vx v9, v8, a0
186; ZVFHMIN-NEXT:    vmv1r.v v8, v9
187; ZVFHMIN-NEXT:    ret
188  %vb = insertelement <2 x half> poison, half %b, i64 0
189  %v1 = shufflevector <2 x half> %v, <2 x half> %vb, <2 x i32> <i32 2, i32 0>
190  ret <2 x half> %v1
191}
192
193define <4 x half> @vslide1up_4xf16(<4 x half> %v, half %b) {
194; ZVFH-LABEL: vslide1up_4xf16:
195; ZVFH:       # %bb.0:
196; ZVFH-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
197; ZVFH-NEXT:    vfslide1up.vf v9, v8, fa0
198; ZVFH-NEXT:    vmv1r.v v8, v9
199; ZVFH-NEXT:    ret
200;
201; ZVFHMIN-LABEL: vslide1up_4xf16:
202; ZVFHMIN:       # %bb.0:
203; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
204; ZVFHMIN-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
205; ZVFHMIN-NEXT:    vslide1up.vx v9, v8, a0
206; ZVFHMIN-NEXT:    vmv1r.v v8, v9
207; ZVFHMIN-NEXT:    ret
208  %vb = insertelement <4 x half> poison, half %b, i64 0
209  %v1 = shufflevector <4 x half> %v, <4 x half> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
210  ret <4 x half> %v1
211}
212
213define <2 x float> @vslide1up_2xf32(<2 x float> %v, float %b) {
214; CHECK-LABEL: vslide1up_2xf32:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
217; CHECK-NEXT:    vfslide1up.vf v9, v8, fa0
218; CHECK-NEXT:    vmv1r.v v8, v9
219; CHECK-NEXT:    ret
220  %vb = insertelement <2 x float> poison, float %b, i64 0
221  %v1 = shufflevector <2 x float> %v, <2 x float> %vb, <2 x i32> <i32 2, i32 0>
222  ret <2 x float> %v1
223}
224
225define <4 x float> @vslide1up_4xf32(<4 x float> %v, float %b) {
226; CHECK-LABEL: vslide1up_4xf32:
227; CHECK:       # %bb.0:
228; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
229; CHECK-NEXT:    vfslide1up.vf v9, v8, fa0
230; CHECK-NEXT:    vmv.v.v v8, v9
231; CHECK-NEXT:    ret
232  %vb = insertelement <4 x float> poison, float %b, i64 0
233  %v1 = shufflevector <4 x float> %v, <4 x float> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
234  ret <4 x float> %v1
235}
236
237define <2 x double> @vslide1up_2xf64(<2 x double> %v, double %b) {
238; CHECK-LABEL: vslide1up_2xf64:
239; CHECK:       # %bb.0:
240; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
241; CHECK-NEXT:    vfslide1up.vf v9, v8, fa0
242; CHECK-NEXT:    vmv.v.v v8, v9
243; CHECK-NEXT:    ret
244  %vb = insertelement <2 x double> poison, double %b, i64 0
245  %v1 = shufflevector <2 x double> %v, <2 x double> %vb, <2 x i32> <i32 2, i32 0>
246  ret <2 x double> %v1
247}
248
249define <4 x double> @vslide1up_4xf64(<4 x double> %v, double %b) {
250; CHECK-LABEL: vslide1up_4xf64:
251; CHECK:       # %bb.0:
252; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
253; CHECK-NEXT:    vfmv.v.f v10, fa0
254; CHECK-NEXT:    vslideup.vi v10, v8, 3
255; CHECK-NEXT:    vmv.v.v v8, v10
256; CHECK-NEXT:    ret
257  %vb = insertelement <4 x double> poison, double %b, i64 0
258  %v1 = shufflevector <4 x double> %v, <4 x double> %vb, <4 x i32> <i32 4, i32 5, i32 6, i32 0>
259  ret <4 x double> %v1
260}
261
262define <4 x i8> @vslide1up_4xi8_with_splat(<4 x i8> %v, i8 %b) {
263; CHECK-LABEL: vslide1up_4xi8_with_splat:
264; CHECK:       # %bb.0:
265; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
266; CHECK-NEXT:    vslide1up.vx v9, v8, a0
267; CHECK-NEXT:    vmv1r.v v8, v9
268; CHECK-NEXT:    ret
269  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
270  %v1 = shufflevector <4 x i8> %vb, <4 x i8> poison, <4 x i32> zeroinitializer
271  %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <4 x i32> <i32 1, i32 4, i32 5, i32 6>
272  ret <4 x i8> %v2
273}
274
275define <2 x double> @vslide1up_v2f64_inverted(<2 x double> %v, double %b) {
276; CHECK-LABEL: vslide1up_v2f64_inverted:
277; CHECK:       # %bb.0:
278; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
279; CHECK-NEXT:    vrgather.vi v9, v8, 0
280; CHECK-NEXT:    vsetvli zero, zero, e64, m1, tu, ma
281; CHECK-NEXT:    vfmv.s.f v9, fa0
282; CHECK-NEXT:    vmv1r.v v8, v9
283; CHECK-NEXT:    ret
284  %v1 = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0>
285  %v2 = insertelement <2 x double> %v1, double %b, i64 0
286  ret <2 x double> %v2
287}
288
289define <4 x i8> @vslide1up_4xi8_inverted(<4 x i8> %v, i8 %b) {
290; CHECK-LABEL: vslide1up_4xi8_inverted:
291; CHECK:       # %bb.0:
292; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
293; CHECK-NEXT:    vslideup.vi v9, v8, 1
294; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, tu, ma
295; CHECK-NEXT:    vmv.s.x v9, a0
296; CHECK-NEXT:    vmv1r.v v8, v9
297; CHECK-NEXT:    ret
298  %v1 = shufflevector <4 x i8> %v, <4 x i8> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>
299  %v2 = insertelement <4 x i8> %v1, i8 %b, i64 0
300  ret <4 x i8> %v2
301}
302
303define <2 x double> @vslide1up_2xf64_as_rotate(<2 x double> %v, double %b) {
304; CHECK-LABEL: vslide1up_2xf64_as_rotate:
305; CHECK:       # %bb.0:
306; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
307; CHECK-NEXT:    vfmv.s.f v9, fa0
308; CHECK-NEXT:    vslideup.vi v8, v9, 1
309; CHECK-NEXT:    vslidedown.vi v9, v8, 1
310; CHECK-NEXT:    vslideup.vi v9, v8, 1
311; CHECK-NEXT:    vmv.v.v v8, v9
312; CHECK-NEXT:    ret
313  %v1 = insertelement <2 x double> %v, double %b, i64 1
314  %v2 = shufflevector <2 x double> %v1, <2 x double> poison, <2 x i32> <i32 1, i32 0>
315  ret <2 x double> %v2
316}
317
318define <4 x i8> @vslide1up_4xi8_as_rotate(<4 x i8> %v, i8 %b) {
319; CHECK-LABEL: vslide1up_4xi8_as_rotate:
320; CHECK:       # %bb.0:
321; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
322; CHECK-NEXT:    vmv.s.x v9, a0
323; CHECK-NEXT:    vslideup.vi v8, v9, 3
324; CHECK-NEXT:    vslidedown.vi v9, v8, 3
325; CHECK-NEXT:    vslideup.vi v9, v8, 1
326; CHECK-NEXT:    vmv1r.v v8, v9
327; CHECK-NEXT:    ret
328  %v1 = insertelement <4 x i8> %v, i8 %b, i64 3
329  %v2 = shufflevector <4 x i8> %v1, <4 x i8> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
330  ret <4 x i8> %v2
331}
332
333; The length of the shift is less than the suffix, since we'd have to
334; materailize the splat, using the vslide1up doesn't help us.
335define <4 x i32> @vslide1up_4xi32_neg1(<4 x i32> %v, i32 %b) {
336; CHECK-LABEL: vslide1up_4xi32_neg1:
337; CHECK:       # %bb.0:
338; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
339; CHECK-NEXT:    vmv.v.x v9, a0
340; CHECK-NEXT:    vsetivli zero, 3, e32, m1, tu, ma
341; CHECK-NEXT:    vslideup.vi v9, v8, 1
342; CHECK-NEXT:    vmv1r.v v8, v9
343; CHECK-NEXT:    ret
344  %vb = insertelement <4 x i32> poison, i32 %b, i64 0
345  %vb2 = insertelement <4 x i32> %vb, i32 %b, i64 3
346  %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb2, <4 x i32> <i32 4, i32 0, i32 1, i32 7>
347  ret <4 x i32> %v1
348}
349
350; We don't know the scalar to do the vslide1up
351define <4 x i32> @vslide1up_4xi32_neg2(<4 x i32> %v1, <4 x i32> %v2) {
352; CHECK-LABEL: vslide1up_4xi32_neg2:
353; CHECK:       # %bb.0:
354; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
355; CHECK-NEXT:    vslideup.vi v9, v8, 1
356; CHECK-NEXT:    vmv.v.v v8, v9
357; CHECK-NEXT:    ret
358  %res = shufflevector <4 x i32> %v1, <4 x i32> %v2, <4 x i32> <i32 4, i32 0, i32 1, i32 2>
359  ret <4 x i32> %res
360}
361
362; Not profitable - can just use a slideup instead
363define <4 x i8> @vslide1up_4xi8_neg_undef_insert(<4 x i8> %v, i8 %b) {
364; CHECK-LABEL: vslide1up_4xi8_neg_undef_insert:
365; CHECK:       # %bb.0:
366; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
367; CHECK-NEXT:    vslideup.vi v9, v8, 1
368; CHECK-NEXT:    vmv1r.v v8, v9
369; CHECK-NEXT:    ret
370  %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 0, i32 4, i32 5, i32 6>
371  ret <4 x i8> %v2
372}
373
374define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert(<4 x i8> %v, i8 %b) {
375; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert:
376; CHECK:       # %bb.0:
377; CHECK-NEXT:    lui a0, 8208
378; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
379; CHECK-NEXT:    vmv.s.x v10, a0
380; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
381; CHECK-NEXT:    vrgather.vv v9, v8, v10
382; CHECK-NEXT:    vmv1r.v v8, v9
383; CHECK-NEXT:    ret
384  %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 4, i32 4, i32 5, i32 6>
385  ret <4 x i8> %v2
386}
387
388define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert2(<4 x i8> %v, i8 %b) {
389; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert2:
390; CHECK:       # %bb.0:
391; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
392; CHECK-NEXT:    vslidedown.vi v9, v8, 3
393; CHECK-NEXT:    vslideup.vi v9, v8, 1
394; CHECK-NEXT:    vmv1r.v v8, v9
395; CHECK-NEXT:    ret
396  %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 7, i32 4, i32 5, i32 6>
397  ret <4 x i8> %v2
398}
399
400define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert3(<4 x i8> %v, i8 %b) {
401; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert3:
402; CHECK:       # %bb.0:
403; CHECK-NEXT:    lui a0, 8208
404; CHECK-NEXT:    addi a0, a0, 1
405; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
406; CHECK-NEXT:    vmv.s.x v10, a0
407; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
408; CHECK-NEXT:    vrgather.vv v9, v8, v10
409; CHECK-NEXT:    vmv1r.v v8, v9
410; CHECK-NEXT:    ret
411  %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 5, i32 4, i32 5, i32 6>
412  ret <4 x i8> %v2
413}
414
415define <2 x i8> @vslide1up_4xi8_neg_length_changing(<4 x i8> %v, i8 %b) {
416; CHECK-LABEL: vslide1up_4xi8_neg_length_changing:
417; CHECK:       # %bb.0:
418; CHECK-NEXT:    vsetivli zero, 1, e8, m1, tu, ma
419; CHECK-NEXT:    vmv1r.v v9, v8
420; CHECK-NEXT:    vmv.s.x v9, a0
421; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
422; CHECK-NEXT:    vslideup.vi v9, v8, 1
423; CHECK-NEXT:    vmv1r.v v8, v9
424; CHECK-NEXT:    ret
425  %v1 = insertelement <4 x i8> %v, i8 %b, i64 0
426  %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <2 x i32> <i32 0, i32 4>
427  ret <2 x i8> %v2
428}
429