Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-int-shuffles.ll
blob1e77b3710928d24ef3e73e43f10a485b0406db2a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
5 define <4 x i16> @shuffle_v4i16(<4 x i16> %x, <4 x i16> %y) {
6 ; CHECK-LABEL: shuffle_v4i16:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
9 ; CHECK-NEXT:    vmv.v.i v0, 11
10 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
11 ; CHECK-NEXT:    ret
12   %s = shufflevector <4 x i16> %x, <4 x i16> %y, <4 x i32> <i32 0, i32 1, i32 6, i32 3>
13   ret <4 x i16> %s
16 define <8 x i32> @shuffle_v8i32(<8 x i32> %x, <8 x i32> %y) {
17 ; CHECK-LABEL: shuffle_v8i32:
18 ; CHECK:       # %bb.0:
19 ; CHECK-NEXT:    li a0, 203
20 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
21 ; CHECK-NEXT:    vmv.s.x v0, a0
22 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
23 ; CHECK-NEXT:    ret
24   %s = shufflevector <8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 0, i32 1, i32 10, i32 3, i32 12, i32 13, i32 6, i32 7>
25   ret <8 x i32> %s
28 define <4 x i16> @shuffle_xv_v4i16(<4 x i16> %x) {
29 ; CHECK-LABEL: shuffle_xv_v4i16:
30 ; CHECK:       # %bb.0:
31 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
32 ; CHECK-NEXT:    vmv.v.i v0, 9
33 ; CHECK-NEXT:    vmerge.vim v8, v8, 5, v0
34 ; CHECK-NEXT:    ret
35   %s = shufflevector <4 x i16> <i16 5, i16 5, i16 5, i16 5>, <4 x i16> %x, <4 x i32> <i32 0, i32 5, i32 6, i32 3>
36   ret <4 x i16> %s
39 define <4 x i16> @shuffle_vx_v4i16(<4 x i16> %x) {
40 ; CHECK-LABEL: shuffle_vx_v4i16:
41 ; CHECK:       # %bb.0:
42 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
43 ; CHECK-NEXT:    vmv.v.i v0, 6
44 ; CHECK-NEXT:    vmerge.vim v8, v8, 5, v0
45 ; CHECK-NEXT:    ret
46   %s = shufflevector <4 x i16> %x, <4 x i16> <i16 5, i16 5, i16 5, i16 5>, <4 x i32> <i32 0, i32 5, i32 6, i32 3>
47   ret <4 x i16> %s
50 define <4 x i16> @vrgather_permute_shuffle_vu_v4i16(<4 x i16> %x) {
51 ; CHECK-LABEL: vrgather_permute_shuffle_vu_v4i16:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    lui a0, 4096
54 ; CHECK-NEXT:    addi a0, a0, 513
55 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
56 ; CHECK-NEXT:    vmv.s.x v9, a0
57 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
58 ; CHECK-NEXT:    vsext.vf2 v10, v9
59 ; CHECK-NEXT:    vrgather.vv v9, v8, v10
60 ; CHECK-NEXT:    vmv1r.v v8, v9
61 ; CHECK-NEXT:    ret
62   %s = shufflevector <4 x i16> %x, <4 x i16> poison, <4 x i32> <i32 1, i32 2, i32 0, i32 1>
63   ret <4 x i16> %s
66 define <4 x i16> @vrgather_permute_shuffle_uv_v4i16(<4 x i16> %x) {
67 ; CHECK-LABEL: vrgather_permute_shuffle_uv_v4i16:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    lui a0, 4096
70 ; CHECK-NEXT:    addi a0, a0, 513
71 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
72 ; CHECK-NEXT:    vmv.s.x v9, a0
73 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
74 ; CHECK-NEXT:    vsext.vf2 v10, v9
75 ; CHECK-NEXT:    vrgather.vv v9, v8, v10
76 ; CHECK-NEXT:    vmv1r.v v8, v9
77 ; CHECK-NEXT:    ret
78   %s = shufflevector <4 x i16> poison, <4 x i16> %x, <4 x i32> <i32 5, i32 6, i32 4, i32 5>
79   ret <4 x i16> %s
82 define <4 x i16> @vrgather_shuffle_vv_v4i16(<4 x i16> %x, <4 x i16> %y) {
83 ; CHECK-LABEL: vrgather_shuffle_vv_v4i16:
84 ; CHECK:       # %bb.0:
85 ; CHECK-NEXT:    lui a0, %hi(.LCPI6_0)
86 ; CHECK-NEXT:    addi a0, a0, %lo(.LCPI6_0)
87 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, mu
88 ; CHECK-NEXT:    vle16.v v11, (a0)
89 ; CHECK-NEXT:    vmv.v.i v0, 8
90 ; CHECK-NEXT:    vrgather.vv v10, v8, v11
91 ; CHECK-NEXT:    vrgather.vi v10, v9, 1, v0.t
92 ; CHECK-NEXT:    vmv1r.v v8, v10
93 ; CHECK-NEXT:    ret
94   %s = shufflevector <4 x i16> %x, <4 x i16> %y, <4 x i32> <i32 1, i32 2, i32 0, i32 5>
95   ret <4 x i16> %s
98 define <4 x i16> @vrgather_shuffle_xv_v4i16(<4 x i16> %x) {
99 ; CHECK-LABEL: vrgather_shuffle_xv_v4i16:
100 ; CHECK:       # %bb.0:
101 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, mu
102 ; CHECK-NEXT:    vid.v v9
103 ; CHECK-NEXT:    vrsub.vi v10, v9, 4
104 ; CHECK-NEXT:    vmv.v.i v0, 12
105 ; CHECK-NEXT:    vmv.v.i v9, 5
106 ; CHECK-NEXT:    vrgather.vv v9, v8, v10, v0.t
107 ; CHECK-NEXT:    vmv1r.v v8, v9
108 ; CHECK-NEXT:    ret
109   %s = shufflevector <4 x i16> <i16 5, i16 5, i16 5, i16 5>, <4 x i16> %x, <4 x i32> <i32 0, i32 3, i32 6, i32 5>
110   ret <4 x i16> %s
113 define <4 x i16> @vrgather_shuffle_vx_v4i16(<4 x i16> %x) {
114 ; CHECK-LABEL: vrgather_shuffle_vx_v4i16:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, mu
117 ; CHECK-NEXT:    vid.v v9
118 ; CHECK-NEXT:    li a0, 3
119 ; CHECK-NEXT:    vmul.vx v10, v9, a0
120 ; CHECK-NEXT:    vmv.v.i v0, 3
121 ; CHECK-NEXT:    vmv.v.i v9, 5
122 ; CHECK-NEXT:    vrgather.vv v9, v8, v10, v0.t
123 ; CHECK-NEXT:    vmv1r.v v8, v9
124 ; CHECK-NEXT:    ret
125   %s = shufflevector <4 x i16> %x, <4 x i16> <i16 5, i16 5, i16 5, i16 5>, <4 x i32> <i32 0, i32 3, i32 6, i32 5>
126   ret <4 x i16> %s
129 define <8 x i64> @vrgather_permute_shuffle_vu_v8i64(<8 x i64> %x) {
130 ; CHECK-LABEL: vrgather_permute_shuffle_vu_v8i64:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    lui a0, %hi(.LCPI9_0)
133 ; CHECK-NEXT:    addi a0, a0, %lo(.LCPI9_0)
134 ; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
135 ; CHECK-NEXT:    vle16.v v16, (a0)
136 ; CHECK-NEXT:    vrgatherei16.vv v12, v8, v16
137 ; CHECK-NEXT:    vmv.v.v v8, v12
138 ; CHECK-NEXT:    ret
139   %s = shufflevector <8 x i64> %x, <8 x i64> poison, <8 x i32> <i32 1, i32 2, i32 0, i32 1, i32 7, i32 6, i32 0, i32 1>
140   ret <8 x i64> %s
143 define <8 x i64> @vrgather_permute_shuffle_uv_v8i64(<8 x i64> %x) {
144 ; CHECK-LABEL: vrgather_permute_shuffle_uv_v8i64:
145 ; CHECK:       # %bb.0:
146 ; CHECK-NEXT:    lui a0, %hi(.LCPI10_0)
147 ; CHECK-NEXT:    addi a0, a0, %lo(.LCPI10_0)
148 ; CHECK-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
149 ; CHECK-NEXT:    vle16.v v16, (a0)
150 ; CHECK-NEXT:    vrgatherei16.vv v12, v8, v16
151 ; CHECK-NEXT:    vmv.v.v v8, v12
152 ; CHECK-NEXT:    ret
153   %s = shufflevector <8 x i64> poison, <8 x i64> %x, <8 x i32> <i32 9, i32 10, i32 8, i32 9, i32 15, i32 8, i32 8, i32 11>
154   ret <8 x i64> %s
157 define <8 x i64> @vrgather_shuffle_vv_v8i64(<8 x i64> %x, <8 x i64> %y) {
158 ; RV32-LABEL: vrgather_shuffle_vv_v8i64:
159 ; RV32:       # %bb.0:
160 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
161 ; RV32-NEXT:    vmv.v.i v16, 2
162 ; RV32-NEXT:    li a0, 5
163 ; RV32-NEXT:    lui a1, %hi(.LCPI11_0)
164 ; RV32-NEXT:    addi a1, a1, %lo(.LCPI11_0)
165 ; RV32-NEXT:    vle16.v v20, (a1)
166 ; RV32-NEXT:    vslide1down.vx v21, v16, a0
167 ; RV32-NEXT:    li a0, 164
168 ; RV32-NEXT:    vmv.s.x v0, a0
169 ; RV32-NEXT:    vsetvli zero, zero, e64, m4, ta, mu
170 ; RV32-NEXT:    vrgatherei16.vv v16, v8, v20
171 ; RV32-NEXT:    vrgatherei16.vv v16, v12, v21, v0.t
172 ; RV32-NEXT:    vmv.v.v v8, v16
173 ; RV32-NEXT:    ret
175 ; RV64-LABEL: vrgather_shuffle_vv_v8i64:
176 ; RV64:       # %bb.0:
177 ; RV64-NEXT:    lui a0, 327683
178 ; RV64-NEXT:    slli a0, a0, 3
179 ; RV64-NEXT:    addi a0, a0, 1
180 ; RV64-NEXT:    slli a0, a0, 17
181 ; RV64-NEXT:    addi a0, a0, 1
182 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
183 ; RV64-NEXT:    vmv.v.x v20, a0
184 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
185 ; RV64-NEXT:    vrgatherei16.vv v16, v8, v20
186 ; RV64-NEXT:    li a0, 164
187 ; RV64-NEXT:    vmv.s.x v0, a0
188 ; RV64-NEXT:    lui a0, 163841
189 ; RV64-NEXT:    slli a0, a0, 4
190 ; RV64-NEXT:    addi a0, a0, 1
191 ; RV64-NEXT:    slli a0, a0, 17
192 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
193 ; RV64-NEXT:    vmv.v.x v8, a0
194 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
195 ; RV64-NEXT:    vrgatherei16.vv v16, v12, v8, v0.t
196 ; RV64-NEXT:    vmv.v.v v8, v16
197 ; RV64-NEXT:    ret
198   %s = shufflevector <8 x i64> %x, <8 x i64> %y, <8 x i32> <i32 1, i32 2, i32 10, i32 5, i32 1, i32 10, i32 3, i32 13>
199   ret <8 x i64> %s
202 define <8 x i64> @vrgather_shuffle_xv_v8i64(<8 x i64> %x) {
203 ; RV32-LABEL: vrgather_shuffle_xv_v8i64:
204 ; RV32:       # %bb.0:
205 ; RV32-NEXT:    lui a0, %hi(.LCPI12_0)
206 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI12_0)
207 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
208 ; RV32-NEXT:    vle16.v v16, (a0)
209 ; RV32-NEXT:    vmv.v.i v20, -1
210 ; RV32-NEXT:    lui a0, %hi(.LCPI12_1)
211 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI12_1)
212 ; RV32-NEXT:    vle16.v v17, (a0)
213 ; RV32-NEXT:    li a0, 113
214 ; RV32-NEXT:    vmv.s.x v0, a0
215 ; RV32-NEXT:    vrgatherei16.vv v12, v20, v16
216 ; RV32-NEXT:    vrgatherei16.vv v12, v8, v17, v0.t
217 ; RV32-NEXT:    vmv.v.v v8, v12
218 ; RV32-NEXT:    ret
220 ; RV64-LABEL: vrgather_shuffle_xv_v8i64:
221 ; RV64:       # %bb.0:
222 ; RV64-NEXT:    li a0, 113
223 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
224 ; RV64-NEXT:    vmv.s.x v0, a0
225 ; RV64-NEXT:    lui a0, 98305
226 ; RV64-NEXT:    slli a0, a0, 6
227 ; RV64-NEXT:    vmv.v.x v16, a0
228 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
229 ; RV64-NEXT:    vmv.v.i v12, -1
230 ; RV64-NEXT:    vrgatherei16.vv v12, v8, v16, v0.t
231 ; RV64-NEXT:    vmv.v.v v8, v12
232 ; RV64-NEXT:    ret
233   %s = shufflevector <8 x i64> <i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1, i64 -1>, <8 x i64> %x, <8 x i32> <i32 8, i32 3, i32 6, i32 5, i32 8, i32 12, i32 14, i32 3>
234   ret <8 x i64> %s
237 define <8 x i64> @vrgather_shuffle_vx_v8i64(<8 x i64> %x) {
238 ; RV32-LABEL: vrgather_shuffle_vx_v8i64:
239 ; RV32:       # %bb.0:
240 ; RV32-NEXT:    lui a0, %hi(.LCPI13_0)
241 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI13_0)
242 ; RV32-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
243 ; RV32-NEXT:    vle16.v v16, (a0)
244 ; RV32-NEXT:    vrgatherei16.vv v12, v8, v16
245 ; RV32-NEXT:    lui a0, %hi(.LCPI13_1)
246 ; RV32-NEXT:    addi a0, a0, %lo(.LCPI13_1)
247 ; RV32-NEXT:    vle16.v v8, (a0)
248 ; RV32-NEXT:    li a0, 140
249 ; RV32-NEXT:    vmv.s.x v0, a0
250 ; RV32-NEXT:    vmv.v.i v16, 5
251 ; RV32-NEXT:    vrgatherei16.vv v12, v16, v8, v0.t
252 ; RV32-NEXT:    vmv.v.v v8, v12
253 ; RV32-NEXT:    ret
255 ; RV64-LABEL: vrgather_shuffle_vx_v8i64:
256 ; RV64:       # %bb.0:
257 ; RV64-NEXT:    lui a0, %hi(.LCPI13_0)
258 ; RV64-NEXT:    addi a0, a0, %lo(.LCPI13_0)
259 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, mu
260 ; RV64-NEXT:    vle16.v v16, (a0)
261 ; RV64-NEXT:    li a0, 115
262 ; RV64-NEXT:    vmv.s.x v0, a0
263 ; RV64-NEXT:    vmv.v.i v12, 5
264 ; RV64-NEXT:    vrgatherei16.vv v12, v8, v16, v0.t
265 ; RV64-NEXT:    vmv.v.v v8, v12
266 ; RV64-NEXT:    ret
267   %s = shufflevector <8 x i64> %x, <8 x i64> <i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5, i64 5>, <8 x i32> <i32 0, i32 3, i32 10, i32 9, i32 4, i32 1, i32 7, i32 14>
268   ret <8 x i64> %s
271 define <4 x i16> @shuffle_v8i16_to_vslidedown_1(<8 x i16> %x) {
272 ; CHECK-LABEL: shuffle_v8i16_to_vslidedown_1:
273 ; CHECK:       # %bb.0: # %entry
274 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
275 ; CHECK-NEXT:    vslidedown.vi v8, v8, 1
276 ; CHECK-NEXT:    ret
277 entry:
278   %s = shufflevector <8 x i16> %x, <8 x i16> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
279   ret <4 x i16> %s
282 define <4 x i16> @shuffle_v8i16_to_vslidedown_3(<8 x i16> %x) {
283 ; CHECK-LABEL: shuffle_v8i16_to_vslidedown_3:
284 ; CHECK:       # %bb.0: # %entry
285 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
286 ; CHECK-NEXT:    vslidedown.vi v8, v8, 3
287 ; CHECK-NEXT:    ret
288 entry:
289   %s = shufflevector <8 x i16> %x, <8 x i16> poison, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
290   ret <4 x i16> %s
293 define <2 x i32> @shuffle_v4i32_to_vslidedown(<4 x i32> %x) {
294 ; CHECK-LABEL: shuffle_v4i32_to_vslidedown:
295 ; CHECK:       # %bb.0: # %entry
296 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
297 ; CHECK-NEXT:    vslidedown.vi v8, v8, 1
298 ; CHECK-NEXT:    ret
299 entry:
300   %s = shufflevector <4 x i32> %x, <4 x i32> poison, <2 x i32> <i32 1, i32 2>
301   ret <2 x i32> %s
304 define <4 x i8> @interleave_shuffles(<4 x i8> %x) {
305 ; CHECK-LABEL: interleave_shuffles:
306 ; CHECK:       # %bb.0:
307 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
308 ; CHECK-NEXT:    vrgather.vi v9, v8, 0
309 ; CHECK-NEXT:    vrgather.vi v10, v8, 1
310 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
311 ; CHECK-NEXT:    vwaddu.vv v8, v9, v10
312 ; CHECK-NEXT:    li a0, -1
313 ; CHECK-NEXT:    vwmaccu.vx v8, a0, v10
314 ; CHECK-NEXT:    ret
315   %y = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
316   %z = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
317   %w = shufflevector <4 x i8> %y, <4 x i8> %z, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
318   ret <4 x i8> %w
321 define <8 x i8> @splat_ve4(<8 x i8> %v) {
322 ; CHECK-LABEL: splat_ve4:
323 ; CHECK:       # %bb.0:
324 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
325 ; CHECK-NEXT:    vrgather.vi v9, v8, 4
326 ; CHECK-NEXT:    vmv1r.v v8, v9
327 ; CHECK-NEXT:    ret
328   %shuff = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
329   ret <8 x i8> %shuff
332 define <8 x i8> @splat_ve4_ins_i0ve2(<8 x i8> %v) {
333 ; CHECK-LABEL: splat_ve4_ins_i0ve2:
334 ; CHECK:       # %bb.0:
335 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
336 ; CHECK-NEXT:    vmv.v.i v10, 4
337 ; CHECK-NEXT:    li a0, 2
338 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, tu, ma
339 ; CHECK-NEXT:    vmv.s.x v10, a0
340 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
341 ; CHECK-NEXT:    vrgather.vv v9, v8, v10
342 ; CHECK-NEXT:    vmv1r.v v8, v9
343 ; CHECK-NEXT:    ret
344   %shuff = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 2, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
345   ret <8 x i8> %shuff
348 define <8 x i8> @splat_ve4_ins_i1ve3(<8 x i8> %v) {
349 ; CHECK-LABEL: splat_ve4_ins_i1ve3:
350 ; CHECK:       # %bb.0:
351 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
352 ; CHECK-NEXT:    vmv.v.i v9, 3
353 ; CHECK-NEXT:    vmv.v.i v10, 4
354 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf2, tu, ma
355 ; CHECK-NEXT:    vslideup.vi v10, v9, 1
356 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
357 ; CHECK-NEXT:    vrgather.vv v9, v8, v10
358 ; CHECK-NEXT:    vmv1r.v v8, v9
359 ; CHECK-NEXT:    ret
360   %shuff = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 4, i32 3, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>
361   ret <8 x i8> %shuff
364 define <8 x i8> @splat_ve2_we0(<8 x i8> %v, <8 x i8> %w) {
365 ; CHECK-LABEL: splat_ve2_we0:
366 ; CHECK:       # %bb.0:
367 ; CHECK-NEXT:    li a0, 66
368 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
369 ; CHECK-NEXT:    vmv.s.x v0, a0
370 ; CHECK-NEXT:    vrgather.vi v10, v8, 2
371 ; CHECK-NEXT:    vrgather.vi v10, v9, 0, v0.t
372 ; CHECK-NEXT:    vmv1r.v v8, v10
373 ; CHECK-NEXT:    ret
374   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 8, i32 2, i32 2, i32 2, i32 2, i32 8, i32 2>
375   ret <8 x i8> %shuff
378 define <8 x i8> @splat_ve2_we0_ins_i0ve4(<8 x i8> %v, <8 x i8> %w) {
379 ; CHECK-LABEL: splat_ve2_we0_ins_i0ve4:
380 ; CHECK:       # %bb.0:
381 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
382 ; CHECK-NEXT:    vmv.v.i v11, 2
383 ; CHECK-NEXT:    li a0, 4
384 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, tu, ma
385 ; CHECK-NEXT:    vmv.s.x v11, a0
386 ; CHECK-NEXT:    li a0, 66
387 ; CHECK-NEXT:    vmv.s.x v0, a0
388 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, mu
389 ; CHECK-NEXT:    vrgather.vv v10, v8, v11
390 ; CHECK-NEXT:    vrgather.vi v10, v9, 0, v0.t
391 ; CHECK-NEXT:    vmv1r.v v8, v10
392 ; CHECK-NEXT:    ret
393   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 4, i32 8, i32 2, i32 2, i32 2, i32 2, i32 8, i32 2>
394   ret <8 x i8> %shuff
397 define <8 x i8> @splat_ve2_we0_ins_i0we4(<8 x i8> %v, <8 x i8> %w) {
398 ; CHECK-LABEL: splat_ve2_we0_ins_i0we4:
399 ; CHECK:       # %bb.0:
400 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
401 ; CHECK-NEXT:    vrgather.vi v10, v8, 2
402 ; CHECK-NEXT:    li a0, 67
403 ; CHECK-NEXT:    vmv.s.x v0, a0
404 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
405 ; CHECK-NEXT:    vmv.v.i v8, 4
406 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
407 ; CHECK-NEXT:    vrgather.vv v10, v9, v8, v0.t
408 ; CHECK-NEXT:    vmv1r.v v8, v10
409 ; CHECK-NEXT:    ret
410   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 12, i32 8, i32 2, i32 2, i32 2, i32 2, i32 8, i32 2>
411   ret <8 x i8> %shuff
414 define <8 x i8> @splat_ve2_we0_ins_i2ve4(<8 x i8> %v, <8 x i8> %w) {
415 ; CHECK-LABEL: splat_ve2_we0_ins_i2ve4:
416 ; CHECK:       # %bb.0:
417 ; CHECK-NEXT:    lui a0, 8256
418 ; CHECK-NEXT:    addi a0, a0, 514
419 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
420 ; CHECK-NEXT:    vmv.v.x v11, a0
421 ; CHECK-NEXT:    li a0, 66
422 ; CHECK-NEXT:    vmv.s.x v0, a0
423 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
424 ; CHECK-NEXT:    vrgather.vv v10, v8, v11
425 ; CHECK-NEXT:    vrgather.vi v10, v9, 0, v0.t
426 ; CHECK-NEXT:    vmv1r.v v8, v10
427 ; CHECK-NEXT:    ret
428   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 8, i32 4, i32 2, i32 2, i32 2, i32 8, i32 2>
429   ret <8 x i8> %shuff
432 define <8 x i8> @splat_ve2_we0_ins_i2we4(<8 x i8> %v, <8 x i8> %w) {
433 ; CHECK-LABEL: splat_ve2_we0_ins_i2we4:
434 ; CHECK:       # %bb.0:
435 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
436 ; CHECK-NEXT:    vmv.v.i v10, 4
437 ; CHECK-NEXT:    vmv.v.i v11, 0
438 ; CHECK-NEXT:    vsetivli zero, 3, e8, mf2, tu, ma
439 ; CHECK-NEXT:    vslideup.vi v11, v10, 2
440 ; CHECK-NEXT:    li a0, 70
441 ; CHECK-NEXT:    vmv.s.x v0, a0
442 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
443 ; CHECK-NEXT:    vrgather.vi v10, v8, 2
444 ; CHECK-NEXT:    vrgather.vv v10, v9, v11, v0.t
445 ; CHECK-NEXT:    vmv1r.v v8, v10
446 ; CHECK-NEXT:    ret
447   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 8, i32 12, i32 2, i32 2, i32 2, i32 8, i32 2>
448   ret <8 x i8> %shuff
451 define <8 x i8> @splat_ve2_we0_ins_i2ve4_i5we6(<8 x i8> %v, <8 x i8> %w) {
452 ; CHECK-LABEL: splat_ve2_we0_ins_i2ve4_i5we6:
453 ; CHECK:       # %bb.0:
454 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
455 ; CHECK-NEXT:    vmv.v.i v10, 6
456 ; CHECK-NEXT:    vmv.v.i v11, 0
457 ; CHECK-NEXT:    vsetivli zero, 6, e8, mf2, tu, ma
458 ; CHECK-NEXT:    vslideup.vi v11, v10, 5
459 ; CHECK-NEXT:    lui a0, 8256
460 ; CHECK-NEXT:    addi a0, a0, 2
461 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
462 ; CHECK-NEXT:    vmv.v.x v12, a0
463 ; CHECK-NEXT:    li a0, 98
464 ; CHECK-NEXT:    vmv.s.x v0, a0
465 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
466 ; CHECK-NEXT:    vrgather.vv v10, v8, v12
467 ; CHECK-NEXT:    vrgather.vv v10, v9, v11, v0.t
468 ; CHECK-NEXT:    vmv1r.v v8, v10
469 ; CHECK-NEXT:    ret
470   %shuff = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 8, i32 4, i32 2, i32 2, i32 14, i32 8, i32 2>
471   ret <8 x i8> %shuff
474 define <8 x i8> @widen_splat_ve3(<4 x i8> %v) {
475 ; CHECK-LABEL: widen_splat_ve3:
476 ; CHECK:       # %bb.0:
477 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
478 ; CHECK-NEXT:    vrgather.vi v9, v8, 3
479 ; CHECK-NEXT:    vmv1r.v v8, v9
480 ; CHECK-NEXT:    ret
481   %shuf = shufflevector <4 x i8> %v, <4 x i8> poison, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>
482   ret <8 x i8> %shuf
485 define <4 x i16> @slidedown_v4i16(<4 x i16> %x) {
486 ; CHECK-LABEL: slidedown_v4i16:
487 ; CHECK:       # %bb.0:
488 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
489 ; CHECK-NEXT:    vslidedown.vi v8, v8, 1
490 ; CHECK-NEXT:    ret
491   %s = shufflevector <4 x i16> %x, <4 x i16> poison, <4 x i32> <i32 1, i32 2, i32 3, i32 undef>
492   ret <4 x i16> %s
495 define <8 x i32> @slidedown_v8i32(<8 x i32> %x) {
496 ; CHECK-LABEL: slidedown_v8i32:
497 ; CHECK:       # %bb.0:
498 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
499 ; CHECK-NEXT:    vslidedown.vi v8, v8, 3
500 ; CHECK-NEXT:    ret
501   %s = shufflevector <8 x i32> %x, <8 x i32> poison, <8 x i32> <i32 3, i32 undef, i32 5, i32 6, i32 undef, i32 undef, i32 undef, i32 undef>
502   ret <8 x i32> %s
505 define <4 x i16> @slideup_v4i16(<4 x i16> %x) {
506 ; CHECK-LABEL: slideup_v4i16:
507 ; CHECK:       # %bb.0:
508 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
509 ; CHECK-NEXT:    vslideup.vi v9, v8, 1
510 ; CHECK-NEXT:    vmv1r.v v8, v9
511 ; CHECK-NEXT:    ret
512   %s = shufflevector <4 x i16> %x, <4 x i16> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>
513   ret <4 x i16> %s
516 define <8 x i32> @slideup_v8i32(<8 x i32> %x) {
517 ; CHECK-LABEL: slideup_v8i32:
518 ; CHECK:       # %bb.0:
519 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
520 ; CHECK-NEXT:    vslideup.vi v10, v8, 3
521 ; CHECK-NEXT:    vmv.v.v v8, v10
522 ; CHECK-NEXT:    ret
523   %s = shufflevector <8 x i32> %x, <8 x i32> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 2, i32 3, i32 4>
524   ret <8 x i32> %s
527 define <8 x i16> @splice_unary(<8 x i16> %x) {
528 ; CHECK-LABEL: splice_unary:
529 ; CHECK:       # %bb.0:
530 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
531 ; CHECK-NEXT:    vslidedown.vi v9, v8, 2
532 ; CHECK-NEXT:    vslideup.vi v9, v8, 6
533 ; CHECK-NEXT:    vmv.v.v v8, v9
534 ; CHECK-NEXT:    ret
535   %s = shufflevector <8 x i16> %x, <8 x i16> poison, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1>
536   ret <8 x i16> %s
539 define <8 x i32> @splice_unary2(<8 x i32> %x) {
540 ; CHECK-LABEL: splice_unary2:
541 ; CHECK:       # %bb.0:
542 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
543 ; CHECK-NEXT:    vslidedown.vi v10, v8, 5
544 ; CHECK-NEXT:    vslideup.vi v10, v8, 3
545 ; CHECK-NEXT:    vmv.v.v v8, v10
546 ; CHECK-NEXT:    ret
547   %s = shufflevector <8 x i32> %x, <8 x i32> poison, <8 x i32> <i32 undef, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4>
548   ret <8 x i32> %s
551 define <8 x i16> @splice_binary(<8 x i16> %x, <8 x i16> %y) {
552 ; CHECK-LABEL: splice_binary:
553 ; CHECK:       # %bb.0:
554 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
555 ; CHECK-NEXT:    vslidedown.vi v8, v8, 2
556 ; CHECK-NEXT:    vslideup.vi v8, v9, 6
557 ; CHECK-NEXT:    ret
558   %s = shufflevector <8 x i16> %x, <8 x i16> %y, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 9>
559   ret <8 x i16> %s
562 define <8 x i32> @splice_binary2(<8 x i32> %x, <8 x i32> %y) {
563 ; CHECK-LABEL: splice_binary2:
564 ; CHECK:       # %bb.0:
565 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
566 ; CHECK-NEXT:    vslidedown.vi v8, v8, 5
567 ; CHECK-NEXT:    vslideup.vi v8, v10, 3
568 ; CHECK-NEXT:    ret
569   %s = shufflevector <8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12>
570   ret <8 x i32> %s
573 define <4 x i16> @shuffle_shuffle_vslidedown(<16 x i16> %0) {
574 ; CHECK-LABEL: shuffle_shuffle_vslidedown:
575 ; CHECK:       # %bb.0: # %entry
576 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
577 ; CHECK-NEXT:    vslidedown.vi v8, v8, 5
578 ; CHECK-NEXT:    ret
579 entry:
580   %1 = shufflevector <16 x i16> %0, <16 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
581   %2 = shufflevector <16 x i16> %0, <16 x i16> poison, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
582   %3 = shufflevector <8 x i16> %1, <8 x i16> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
583   %4 = shufflevector <8 x i16> %2, <8 x i16> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
584   %5 = shufflevector <4 x i16> %3, <4 x i16> %4, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
585   ret <4 x i16> %5
588 define <8 x i8> @concat_4xi8_start(<8 x i8> %v, <8 x i8> %w) {
589 ; CHECK-LABEL: concat_4xi8_start:
590 ; CHECK:       # %bb.0:
591 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
592 ; CHECK-NEXT:    vslideup.vi v8, v9, 4
593 ; CHECK-NEXT:    ret
594   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>
595   ret <8 x i8> %res
598 define <8 x i8> @concat_4xi8_start_undef(<8 x i8> %v, <8 x i8> %w) {
599 ; CHECK-LABEL: concat_4xi8_start_undef:
600 ; CHECK:       # %bb.0:
601 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
602 ; CHECK-NEXT:    vslideup.vi v8, v9, 4
603 ; CHECK-NEXT:    ret
604   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 undef, i32 10, i32 11>
605   ret <8 x i8> %res
608 define <8 x i8> @concat_4xi8_start_undef_at_start(<8 x i8> %v, <8 x i8> %w) {
609 ; CHECK-LABEL: concat_4xi8_start_undef_at_start:
610 ; CHECK:       # %bb.0:
611 ; CHECK-NEXT:    li a0, -32
612 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
613 ; CHECK-NEXT:    vmv.s.x v0, a0
614 ; CHECK-NEXT:    vslideup.vi v8, v9, 4, v0.t
615 ; CHECK-NEXT:    ret
616   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 9, i32 10, i32 11>
617   ret <8 x i8> %res
620 define <8 x i8> @merge_start_into_end_non_contiguous(<8 x i8> %v, <8 x i8> %w) {
621 ; CHECK-LABEL: merge_start_into_end_non_contiguous:
622 ; CHECK:       # %bb.0:
623 ; CHECK-NEXT:    li a0, 144
624 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
625 ; CHECK-NEXT:    vmv.s.x v0, a0
626 ; CHECK-NEXT:    vslideup.vi v8, v9, 4, v0.t
627 ; CHECK-NEXT:    ret
628   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 5, i32 6, i32 11>
629   ret <8 x i8> %res
632 define <8 x i8> @merge_end_into_end(<8 x i8> %v, <8 x i8> %w) {
633 ; CHECK-LABEL: merge_end_into_end:
634 ; CHECK:       # %bb.0:
635 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf2, tu, ma
636 ; CHECK-NEXT:    vmv.v.v v9, v8
637 ; CHECK-NEXT:    vmv1r.v v8, v9
638 ; CHECK-NEXT:    ret
639   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>
640   ret <8 x i8> %res
643 define <8 x i8> @merge_start_into_middle(<8 x i8> %v, <8 x i8> %w) {
644 ; CHECK-LABEL: merge_start_into_middle:
645 ; CHECK:       # %bb.0:
646 ; CHECK-NEXT:    vsetivli zero, 5, e8, mf2, tu, ma
647 ; CHECK-NEXT:    vslideup.vi v8, v9, 1
648 ; CHECK-NEXT:    ret
649   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 0, i32 8, i32 9, i32 10, i32 11, i32 5, i32 6, i32 7>
650   ret <8 x i8> %res
653 define <8 x i8> @merge_start_into_start(<8 x i8> %v, <8 x i8> %w) {
654 ; CHECK-LABEL: merge_start_into_start:
655 ; CHECK:       # %bb.0:
656 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf2, tu, ma
657 ; CHECK-NEXT:    vmv.v.v v8, v9
658 ; CHECK-NEXT:    ret
659   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>
660   ret <8 x i8> %res
663 define <8 x i8> @merge_slidedown(<8 x i8> %v, <8 x i8> %w) {
664 ; CHECK-LABEL: merge_slidedown:
665 ; CHECK:       # %bb.0:
666 ; CHECK-NEXT:    li a0, 60
667 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
668 ; CHECK-NEXT:    vmv.s.x v0, a0
669 ; CHECK-NEXT:    vslidedown.vi v9, v8, 1, v0.t
670 ; CHECK-NEXT:    vmv1r.v v8, v9
671 ; CHECK-NEXT:    ret
672   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 8, i32 9, i32 3, i32 4, i32 5, i32 6, i32 14, i32 15>
673   ret <8 x i8> %res
676 ; This should slide %v down by 2 and %w up by 1 before merging them
677 define <8 x i8> @merge_non_contiguous_slideup_slidedown(<8 x i8> %v, <8 x i8> %w) {
678 ; CHECK-LABEL: merge_non_contiguous_slideup_slidedown:
679 ; CHECK:       # %bb.0:
680 ; CHECK-NEXT:    li a0, -22
681 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
682 ; CHECK-NEXT:    vmv.s.x v0, a0
683 ; CHECK-NEXT:    vslidedown.vi v8, v8, 2
684 ; CHECK-NEXT:    vslideup.vi v8, v9, 1, v0.t
685 ; CHECK-NEXT:    ret
686   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 8, i32 4, i32 10, i32 6, i32 12, i32 13, i32 14>
687   ret <8 x i8> %res
690 ; This shouldn't generate a vmerge because the elements of %w are not consecutive
691 define <8 x i8> @unmergable(<8 x i8> %v, <8 x i8> %w) {
692 ; CHECK-LABEL: unmergable:
693 ; CHECK:       # %bb.0:
694 ; CHECK-NEXT:    lui a0, %hi(.LCPI46_0)
695 ; CHECK-NEXT:    addi a0, a0, %lo(.LCPI46_0)
696 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, mu
697 ; CHECK-NEXT:    vle8.v v10, (a0)
698 ; CHECK-NEXT:    li a0, -22
699 ; CHECK-NEXT:    vmv.s.x v0, a0
700 ; CHECK-NEXT:    vslidedown.vi v8, v8, 2
701 ; CHECK-NEXT:    vrgather.vv v8, v9, v10, v0.t
702 ; CHECK-NEXT:    ret
703   %res = shufflevector <8 x i8> %v, <8 x i8> %w, <8 x i32> <i32 2, i32 9, i32 4, i32 11, i32 6, i32 13, i32 8, i32 15>
704   ret <8 x i8> %res
707 ; Make sure we use a vmv.v.i to load the mask constant.
708 define <8 x i32> @shuffle_v8i32_2(<8 x i32> %x, <8 x i32> %y) {
709 ; CHECK-LABEL: shuffle_v8i32_2:
710 ; CHECK:       # %bb.0:
711 ; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
712 ; CHECK-NEXT:    vmv.v.i v0, -13
713 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
714 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
715 ; CHECK-NEXT:    ret
716   %s = shufflevector <8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 0, i32 1, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>
717   ret <8 x i32> %s
720 ; FIXME: This could be expressed as a vrgather.vv
721 define <8 x i8> @shuffle_v64i8_v8i8(<64 x i8> %wide.vec) {
722 ; CHECK-LABEL: shuffle_v64i8_v8i8:
723 ; CHECK:       # %bb.0:
724 ; CHECK-NEXT:    li a0, 32
725 ; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, ma
726 ; CHECK-NEXT:    vid.v v12
727 ; CHECK-NEXT:    vsll.vi v14, v12, 3
728 ; CHECK-NEXT:    vrgather.vv v12, v8, v14
729 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
730 ; CHECK-NEXT:    vslidedown.vx v8, v8, a0
731 ; CHECK-NEXT:    li a1, 240
732 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
733 ; CHECK-NEXT:    vmv.s.x v0, a1
734 ; CHECK-NEXT:    lui a1, 98561
735 ; CHECK-NEXT:    addi a1, a1, -2048
736 ; CHECK-NEXT:    vmv.v.x v10, a1
737 ; CHECK-NEXT:    vsetvli zero, a0, e8, m2, ta, mu
738 ; CHECK-NEXT:    vrgather.vv v12, v8, v10, v0.t
739 ; CHECK-NEXT:    vmv1r.v v8, v12
740 ; CHECK-NEXT:    ret
741   %s = shufflevector <64 x i8> %wide.vec, <64 x i8> poison, <8 x i32> <i32 0, i32 8, i32 16, i32 24, i32 32, i32 40, i32 48, i32 56>
742   ret <8 x i8> %s