1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK,RV64
4 ; RUN: llc -mtriple=riscv32 -mattr=+v,+zvfh,+zvkb -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-V
5 ; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+zvkb -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-V
6 ; RUN: llc -mtriple=riscv32 -mattr=+zve32x,+zvfh,+zvkb,+zvl64b -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-ZVE32X
7 ; RUN: llc -mtriple=riscv64 -mattr=+zve32x,+zvfh,+zvkb,+zvl64b -verify-machineinstrs < %s | FileCheck %s -check-prefixes=ZVKB-ZVE32X
9 define <8 x i1> @shuffle_v8i1_as_i8_1(<8 x i1> %v) {
10 ; CHECK-LABEL: shuffle_v8i1_as_i8_1:
12 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
13 ; CHECK-NEXT: vsrl.vi v8, v0, 1
14 ; CHECK-NEXT: vsll.vi v9, v0, 7
15 ; CHECK-NEXT: vor.vv v0, v9, v8
18 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_1:
20 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
21 ; ZVKB-V-NEXT: vror.vi v0, v0, 1
24 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_1:
25 ; ZVKB-ZVE32X: # %bb.0:
26 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
27 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 1
28 ; ZVKB-ZVE32X-NEXT: ret
29 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0>
33 define <8 x i1> @shuffle_v8i1_as_i8_2(<8 x i1> %v) {
34 ; CHECK-LABEL: shuffle_v8i1_as_i8_2:
36 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
37 ; CHECK-NEXT: vsrl.vi v8, v0, 2
38 ; CHECK-NEXT: vsll.vi v9, v0, 6
39 ; CHECK-NEXT: vor.vv v0, v9, v8
42 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_2:
44 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
45 ; ZVKB-V-NEXT: vror.vi v0, v0, 2
48 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_2:
49 ; ZVKB-ZVE32X: # %bb.0:
50 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
51 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 2
52 ; ZVKB-ZVE32X-NEXT: ret
53 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1>
57 define <8 x i1> @shuffle_v8i1_as_i8_3(<8 x i1> %v) {
58 ; CHECK-LABEL: shuffle_v8i1_as_i8_3:
60 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
61 ; CHECK-NEXT: vsrl.vi v8, v0, 3
62 ; CHECK-NEXT: vsll.vi v9, v0, 5
63 ; CHECK-NEXT: vor.vv v0, v9, v8
66 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_3:
68 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
69 ; ZVKB-V-NEXT: vror.vi v0, v0, 3
72 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_3:
73 ; ZVKB-ZVE32X: # %bb.0:
74 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
75 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 3
76 ; ZVKB-ZVE32X-NEXT: ret
77 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2>
81 define <8 x i1> @shuffle_v8i1_as_i8_4(<8 x i1> %v) {
82 ; CHECK-LABEL: shuffle_v8i1_as_i8_4:
84 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
85 ; CHECK-NEXT: vsrl.vi v8, v0, 4
86 ; CHECK-NEXT: vsll.vi v9, v0, 4
87 ; CHECK-NEXT: vor.vv v0, v9, v8
90 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_4:
92 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
93 ; ZVKB-V-NEXT: vror.vi v0, v0, 4
96 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_4:
97 ; ZVKB-ZVE32X: # %bb.0:
98 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
99 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 4
100 ; ZVKB-ZVE32X-NEXT: ret
101 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>
102 ret <8 x i1> %shuffle
105 define <8 x i1> @shuffle_v8i1_as_i8_5(<8 x i1> %v) {
106 ; CHECK-LABEL: shuffle_v8i1_as_i8_5:
108 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
109 ; CHECK-NEXT: vsrl.vi v8, v0, 5
110 ; CHECK-NEXT: vsll.vi v9, v0, 3
111 ; CHECK-NEXT: vor.vv v0, v9, v8
114 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_5:
116 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
117 ; ZVKB-V-NEXT: vror.vi v0, v0, 5
120 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_5:
121 ; ZVKB-ZVE32X: # %bb.0:
122 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
123 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 5
124 ; ZVKB-ZVE32X-NEXT: ret
125 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4>
126 ret <8 x i1> %shuffle
129 define <8 x i1> @shuffle_v8i1_as_i8_6(<8 x i1> %v) {
130 ; CHECK-LABEL: shuffle_v8i1_as_i8_6:
132 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
133 ; CHECK-NEXT: vsrl.vi v8, v0, 6
134 ; CHECK-NEXT: vsll.vi v9, v0, 2
135 ; CHECK-NEXT: vor.vv v0, v9, v8
138 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_6:
140 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
141 ; ZVKB-V-NEXT: vror.vi v0, v0, 6
144 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_6:
145 ; ZVKB-ZVE32X: # %bb.0:
146 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
147 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 6
148 ; ZVKB-ZVE32X-NEXT: ret
149 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>
150 ret <8 x i1> %shuffle
153 define <8 x i1> @shuffle_v8i1_as_i8_7(<8 x i1> %v) {
154 ; CHECK-LABEL: shuffle_v8i1_as_i8_7:
156 ; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
157 ; CHECK-NEXT: vsrl.vi v8, v0, 7
158 ; CHECK-NEXT: vadd.vv v9, v0, v0
159 ; CHECK-NEXT: vor.vv v0, v9, v8
162 ; ZVKB-V-LABEL: shuffle_v8i1_as_i8_7:
164 ; ZVKB-V-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
165 ; ZVKB-V-NEXT: vror.vi v0, v0, 7
168 ; ZVKB-ZVE32X-LABEL: shuffle_v8i1_as_i8_7:
169 ; ZVKB-ZVE32X: # %bb.0:
170 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e8, mf4, ta, ma
171 ; ZVKB-ZVE32X-NEXT: vror.vi v0, v0, 7
172 ; ZVKB-ZVE32X-NEXT: ret
173 %shuffle = shufflevector <8 x i1> %v, <8 x i1> poison, <8 x i32> <i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>
174 ret <8 x i1> %shuffle
177 define <8 x i8> @shuffle_v8i8_as_i16(<8 x i8> %v) {
178 ; CHECK-LABEL: shuffle_v8i8_as_i16:
180 ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
181 ; CHECK-NEXT: vsrl.vi v9, v8, 8
182 ; CHECK-NEXT: vsll.vi v8, v8, 8
183 ; CHECK-NEXT: vor.vv v8, v8, v9
186 ; ZVKB-V-LABEL: shuffle_v8i8_as_i16:
188 ; ZVKB-V-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
189 ; ZVKB-V-NEXT: vrev8.v v8, v8
192 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i16:
193 ; ZVKB-ZVE32X: # %bb.0:
194 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma
195 ; ZVKB-ZVE32X-NEXT: vrev8.v v8, v8
196 ; ZVKB-ZVE32X-NEXT: ret
197 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
198 ret <8 x i8> %shuffle
201 define <8 x i8> @shuffle_v8i8_as_i32_8(<8 x i8> %v) {
202 ; CHECK-LABEL: shuffle_v8i8_as_i32_8:
204 ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
205 ; CHECK-NEXT: vsrl.vi v9, v8, 8
206 ; CHECK-NEXT: vsll.vi v8, v8, 24
207 ; CHECK-NEXT: vor.vv v8, v8, v9
210 ; ZVKB-V-LABEL: shuffle_v8i8_as_i32_8:
212 ; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
213 ; ZVKB-V-NEXT: vror.vi v8, v8, 8
216 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_8:
217 ; ZVKB-ZVE32X: # %bb.0:
218 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma
219 ; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 8
220 ; ZVKB-ZVE32X-NEXT: ret
221 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4>
222 ret <8 x i8> %shuffle
225 define <8 x i8> @shuffle_v8i8_as_i32_16(<8 x i8> %v) {
226 ; CHECK-LABEL: shuffle_v8i8_as_i32_16:
228 ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
229 ; CHECK-NEXT: vsrl.vi v9, v8, 16
230 ; CHECK-NEXT: vsll.vi v8, v8, 16
231 ; CHECK-NEXT: vor.vv v8, v8, v9
234 ; ZVKB-V-LABEL: shuffle_v8i8_as_i32_16:
236 ; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
237 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
240 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_16:
241 ; ZVKB-ZVE32X: # %bb.0:
242 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma
243 ; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16
244 ; ZVKB-ZVE32X-NEXT: ret
245 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>
246 ret <8 x i8> %shuffle
249 define <8 x i8> @shuffle_v8i8_as_i32_24(<8 x i8> %v) {
250 ; CHECK-LABEL: shuffle_v8i8_as_i32_24:
252 ; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
253 ; CHECK-NEXT: vsrl.vi v9, v8, 24
254 ; CHECK-NEXT: vsll.vi v8, v8, 8
255 ; CHECK-NEXT: vor.vv v8, v8, v9
258 ; ZVKB-V-LABEL: shuffle_v8i8_as_i32_24:
260 ; ZVKB-V-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
261 ; ZVKB-V-NEXT: vror.vi v8, v8, 24
264 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i32_24:
265 ; ZVKB-ZVE32X: # %bb.0:
266 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 2, e32, m1, ta, ma
267 ; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 24
268 ; ZVKB-ZVE32X-NEXT: ret
269 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6>
270 ret <8 x i8> %shuffle
273 define <8 x i8> @shuffle_v8i8_as_i64_8(<8 x i8> %v) {
274 ; CHECK-LABEL: shuffle_v8i8_as_i64_8:
276 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
277 ; CHECK-NEXT: vslidedown.vi v9, v8, 1
278 ; CHECK-NEXT: vslideup.vi v9, v8, 7
279 ; CHECK-NEXT: vmv1r.v v8, v9
282 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_8:
284 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
285 ; ZVKB-V-NEXT: vror.vi v8, v8, 8
288 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_8:
289 ; ZVKB-ZVE32X: # %bb.0:
290 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
291 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 1
292 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 7
293 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
294 ; ZVKB-ZVE32X-NEXT: ret
295 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0>
296 ret <8 x i8> %shuffle
299 define <8 x i8> @shuffle_v8i8_as_i64_16(<8 x i8> %v) {
300 ; CHECK-LABEL: shuffle_v8i8_as_i64_16:
302 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
303 ; CHECK-NEXT: vslidedown.vi v9, v8, 2
304 ; CHECK-NEXT: vslideup.vi v9, v8, 6
305 ; CHECK-NEXT: vmv1r.v v8, v9
308 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_16:
310 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
311 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
314 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_16:
315 ; ZVKB-ZVE32X: # %bb.0:
316 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
317 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 2
318 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 6
319 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
320 ; ZVKB-ZVE32X-NEXT: ret
321 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1>
322 ret <8 x i8> %shuffle
325 define <8 x i8> @shuffle_v8i8_as_i64_24(<8 x i8> %v) {
326 ; CHECK-LABEL: shuffle_v8i8_as_i64_24:
328 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
329 ; CHECK-NEXT: vslidedown.vi v9, v8, 3
330 ; CHECK-NEXT: vslideup.vi v9, v8, 5
331 ; CHECK-NEXT: vmv1r.v v8, v9
334 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_24:
336 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
337 ; ZVKB-V-NEXT: vror.vi v8, v8, 24
340 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_24:
341 ; ZVKB-ZVE32X: # %bb.0:
342 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
343 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 3
344 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 5
345 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
346 ; ZVKB-ZVE32X-NEXT: ret
347 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2>
348 ret <8 x i8> %shuffle
351 define <8 x i8> @shuffle_v8i8_as_i64_32(<8 x i8> %v) {
352 ; CHECK-LABEL: shuffle_v8i8_as_i64_32:
354 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
355 ; CHECK-NEXT: vslidedown.vi v9, v8, 4
356 ; CHECK-NEXT: vslideup.vi v9, v8, 4
357 ; CHECK-NEXT: vmv1r.v v8, v9
360 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_32:
362 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
363 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
366 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_32:
367 ; ZVKB-ZVE32X: # %bb.0:
368 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
369 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 4
370 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 4
371 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
372 ; ZVKB-ZVE32X-NEXT: ret
373 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>
374 ret <8 x i8> %shuffle
377 define <8 x i8> @shuffle_v8i8_as_i64_40(<8 x i8> %v) {
378 ; CHECK-LABEL: shuffle_v8i8_as_i64_40:
380 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
381 ; CHECK-NEXT: vslidedown.vi v9, v8, 5
382 ; CHECK-NEXT: vslideup.vi v9, v8, 3
383 ; CHECK-NEXT: vmv1r.v v8, v9
386 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_40:
388 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
389 ; ZVKB-V-NEXT: vror.vi v8, v8, 40
392 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_40:
393 ; ZVKB-ZVE32X: # %bb.0:
394 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
395 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 5
396 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 3
397 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
398 ; ZVKB-ZVE32X-NEXT: ret
399 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4>
400 ret <8 x i8> %shuffle
403 define <8 x i8> @shuffle_v8i8_as_i64_48(<8 x i8> %v) {
404 ; CHECK-LABEL: shuffle_v8i8_as_i64_48:
406 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
407 ; CHECK-NEXT: vslidedown.vi v9, v8, 6
408 ; CHECK-NEXT: vslideup.vi v9, v8, 2
409 ; CHECK-NEXT: vmv1r.v v8, v9
412 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_48:
414 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
415 ; ZVKB-V-NEXT: vror.vi v8, v8, 48
418 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_48:
419 ; ZVKB-ZVE32X: # %bb.0:
420 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
421 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 6
422 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 2
423 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
424 ; ZVKB-ZVE32X-NEXT: ret
425 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>
426 ret <8 x i8> %shuffle
429 define <8 x i8> @shuffle_v8i8_as_i64_56(<8 x i8> %v) {
430 ; CHECK-LABEL: shuffle_v8i8_as_i64_56:
432 ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
433 ; CHECK-NEXT: vslidedown.vi v9, v8, 7
434 ; CHECK-NEXT: vslideup.vi v9, v8, 1
435 ; CHECK-NEXT: vmv1r.v v8, v9
438 ; ZVKB-V-LABEL: shuffle_v8i8_as_i64_56:
440 ; ZVKB-V-NEXT: vsetivli zero, 1, e64, m1, ta, ma
441 ; ZVKB-V-NEXT: vror.vi v8, v8, 56
444 ; ZVKB-ZVE32X-LABEL: shuffle_v8i8_as_i64_56:
445 ; ZVKB-ZVE32X: # %bb.0:
446 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e8, m1, ta, ma
447 ; ZVKB-ZVE32X-NEXT: vslidedown.vi v9, v8, 7
448 ; ZVKB-ZVE32X-NEXT: vslideup.vi v9, v8, 1
449 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v9
450 ; ZVKB-ZVE32X-NEXT: ret
451 %shuffle = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>
452 ret <8 x i8> %shuffle
455 define <8 x i16> @shuffle_v8i16_as_i32(<8 x i16> %v) {
456 ; CHECK-LABEL: shuffle_v8i16_as_i32:
458 ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
459 ; CHECK-NEXT: vsrl.vi v9, v8, 16
460 ; CHECK-NEXT: vsll.vi v8, v8, 16
461 ; CHECK-NEXT: vor.vv v8, v8, v9
464 ; ZVKB-V-LABEL: shuffle_v8i16_as_i32:
466 ; ZVKB-V-NEXT: vsetivli zero, 4, e32, m1, ta, ma
467 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
470 ; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i32:
471 ; ZVKB-ZVE32X: # %bb.0:
472 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m2, ta, ma
473 ; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16
474 ; ZVKB-ZVE32X-NEXT: ret
475 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
476 ret <8 x i16> %shuffle
479 define <8 x i16> @shuffle_v8i16_as_i64_16(<8 x i16> %v) {
480 ; RV32-LABEL: shuffle_v8i16_as_i64_16:
482 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
483 ; RV32-NEXT: vmv.v.i v9, 0
484 ; RV32-NEXT: li a0, 48
485 ; RV32-NEXT: li a1, 63
486 ; RV32-NEXT: vwsubu.vx v10, v9, a0
487 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
488 ; RV32-NEXT: vmv.v.x v9, a0
489 ; RV32-NEXT: vand.vx v10, v10, a1
490 ; RV32-NEXT: vand.vx v9, v9, a1
491 ; RV32-NEXT: vsrl.vv v10, v8, v10
492 ; RV32-NEXT: vsll.vv v8, v8, v9
493 ; RV32-NEXT: vor.vv v8, v8, v10
496 ; RV64-LABEL: shuffle_v8i16_as_i64_16:
498 ; RV64-NEXT: li a0, 48
499 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
500 ; RV64-NEXT: vsll.vx v9, v8, a0
501 ; RV64-NEXT: vsrl.vi v8, v8, 16
502 ; RV64-NEXT: vor.vv v8, v9, v8
505 ; ZVKB-V-LABEL: shuffle_v8i16_as_i64_16:
507 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
508 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
511 ; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_16:
512 ; ZVKB-ZVE32X: # %bb.0:
513 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI19_0)
514 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI19_0)
515 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
516 ; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0)
517 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
518 ; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12
519 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
520 ; ZVKB-ZVE32X-NEXT: ret
521 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4>
522 ret <8 x i16> %shuffle
525 define <8 x i16> @shuffle_v8i16_as_i64_32(<8 x i16> %v) {
526 ; RV32-LABEL: shuffle_v8i16_as_i64_32:
528 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
529 ; RV32-NEXT: vmv.v.i v9, 0
530 ; RV32-NEXT: li a0, 32
531 ; RV32-NEXT: li a1, 63
532 ; RV32-NEXT: vwsubu.vx v10, v9, a0
533 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
534 ; RV32-NEXT: vmv.v.x v9, a0
535 ; RV32-NEXT: vand.vx v10, v10, a1
536 ; RV32-NEXT: vand.vx v9, v9, a1
537 ; RV32-NEXT: vsrl.vv v10, v8, v10
538 ; RV32-NEXT: vsll.vv v8, v8, v9
539 ; RV32-NEXT: vor.vv v8, v8, v10
542 ; RV64-LABEL: shuffle_v8i16_as_i64_32:
544 ; RV64-NEXT: li a0, 32
545 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
546 ; RV64-NEXT: vsrl.vx v9, v8, a0
547 ; RV64-NEXT: vsll.vx v8, v8, a0
548 ; RV64-NEXT: vor.vv v8, v8, v9
551 ; ZVKB-V-LABEL: shuffle_v8i16_as_i64_32:
553 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
554 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
557 ; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_32:
558 ; ZVKB-ZVE32X: # %bb.0:
559 ; ZVKB-ZVE32X-NEXT: lui a0, 8240
560 ; ZVKB-ZVE32X-NEXT: addi a0, a0, 1
561 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e32, m1, ta, ma
562 ; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0
563 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma
564 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
565 ; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m2, ta, ma
566 ; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v10, v8, v12
567 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
568 ; ZVKB-ZVE32X-NEXT: ret
569 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>
570 ret <8 x i16> %shuffle
573 define <8 x i16> @shuffle_v8i16_as_i64_48(<8 x i16> %v) {
574 ; RV32-LABEL: shuffle_v8i16_as_i64_48:
576 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
577 ; RV32-NEXT: vmv.v.i v9, 0
578 ; RV32-NEXT: li a0, 16
579 ; RV32-NEXT: li a1, 63
580 ; RV32-NEXT: vwsubu.vx v10, v9, a0
581 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
582 ; RV32-NEXT: vmv.v.x v9, a0
583 ; RV32-NEXT: vand.vx v10, v10, a1
584 ; RV32-NEXT: vand.vx v9, v9, a1
585 ; RV32-NEXT: vsrl.vv v10, v8, v10
586 ; RV32-NEXT: vsll.vv v8, v8, v9
587 ; RV32-NEXT: vor.vv v8, v8, v10
590 ; RV64-LABEL: shuffle_v8i16_as_i64_48:
592 ; RV64-NEXT: li a0, 48
593 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
594 ; RV64-NEXT: vsrl.vx v9, v8, a0
595 ; RV64-NEXT: vsll.vi v8, v8, 16
596 ; RV64-NEXT: vor.vv v8, v8, v9
599 ; ZVKB-V-LABEL: shuffle_v8i16_as_i64_48:
601 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
602 ; ZVKB-V-NEXT: vror.vi v8, v8, 48
605 ; ZVKB-ZVE32X-LABEL: shuffle_v8i16_as_i64_48:
606 ; ZVKB-ZVE32X: # %bb.0:
607 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI21_0)
608 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI21_0)
609 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
610 ; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0)
611 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
612 ; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12
613 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
614 ; ZVKB-ZVE32X-NEXT: ret
615 %shuffle = shufflevector <8 x i16> %v, <8 x i16> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6>
616 ret <8 x i16> %shuffle
619 define <8 x i32> @shuffle_v8i32_as_i64(<8 x i32> %v) {
620 ; RV32-LABEL: shuffle_v8i32_as_i64:
622 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
623 ; RV32-NEXT: vmv.v.i v10, 0
624 ; RV32-NEXT: li a0, 32
625 ; RV32-NEXT: li a1, 63
626 ; RV32-NEXT: vwsubu.vx v12, v10, a0
627 ; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma
628 ; RV32-NEXT: vmv.v.x v10, a0
629 ; RV32-NEXT: vand.vx v12, v12, a1
630 ; RV32-NEXT: vand.vx v10, v10, a1
631 ; RV32-NEXT: vsrl.vv v12, v8, v12
632 ; RV32-NEXT: vsll.vv v8, v8, v10
633 ; RV32-NEXT: vor.vv v8, v8, v12
636 ; RV64-LABEL: shuffle_v8i32_as_i64:
638 ; RV64-NEXT: li a0, 32
639 ; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma
640 ; RV64-NEXT: vsrl.vx v10, v8, a0
641 ; RV64-NEXT: vsll.vx v8, v8, a0
642 ; RV64-NEXT: vor.vv v8, v8, v10
645 ; ZVKB-V-LABEL: shuffle_v8i32_as_i64:
647 ; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma
648 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
651 ; ZVKB-ZVE32X-LABEL: shuffle_v8i32_as_i64:
652 ; ZVKB-ZVE32X: # %bb.0:
653 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI22_0)
654 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI22_0)
655 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
656 ; ZVKB-ZVE32X-NEXT: vle8.v v12, (a0)
657 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v16, v12
658 ; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m4, ta, ma
659 ; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v12, v8, v16
660 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v12
661 ; ZVKB-ZVE32X-NEXT: ret
662 %shuffle = shufflevector <8 x i32> %v, <8 x i32> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
663 ret <8 x i32> %shuffle
666 define <8 x half> @shuffle_v8f16_as_i32(<8 x half> %v) {
667 ; CHECK-LABEL: shuffle_v8f16_as_i32:
669 ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
670 ; CHECK-NEXT: vsrl.vi v9, v8, 16
671 ; CHECK-NEXT: vsll.vi v8, v8, 16
672 ; CHECK-NEXT: vor.vv v8, v8, v9
675 ; ZVKB-V-LABEL: shuffle_v8f16_as_i32:
677 ; ZVKB-V-NEXT: vsetivli zero, 4, e32, m1, ta, ma
678 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
681 ; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i32:
682 ; ZVKB-ZVE32X: # %bb.0:
683 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m2, ta, ma
684 ; ZVKB-ZVE32X-NEXT: vror.vi v8, v8, 16
685 ; ZVKB-ZVE32X-NEXT: ret
686 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
687 ret <8 x half> %shuffle
690 define <8 x half> @shuffle_v8f16_as_i64_16(<8 x half> %v) {
691 ; RV32-LABEL: shuffle_v8f16_as_i64_16:
693 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
694 ; RV32-NEXT: vmv.v.i v9, 0
695 ; RV32-NEXT: li a0, 48
696 ; RV32-NEXT: li a1, 63
697 ; RV32-NEXT: vwsubu.vx v10, v9, a0
698 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
699 ; RV32-NEXT: vmv.v.x v9, a0
700 ; RV32-NEXT: vand.vx v10, v10, a1
701 ; RV32-NEXT: vand.vx v9, v9, a1
702 ; RV32-NEXT: vsrl.vv v10, v8, v10
703 ; RV32-NEXT: vsll.vv v8, v8, v9
704 ; RV32-NEXT: vor.vv v8, v8, v10
707 ; RV64-LABEL: shuffle_v8f16_as_i64_16:
709 ; RV64-NEXT: li a0, 48
710 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
711 ; RV64-NEXT: vsll.vx v9, v8, a0
712 ; RV64-NEXT: vsrl.vi v8, v8, 16
713 ; RV64-NEXT: vor.vv v8, v9, v8
716 ; ZVKB-V-LABEL: shuffle_v8f16_as_i64_16:
718 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
719 ; ZVKB-V-NEXT: vror.vi v8, v8, 16
722 ; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_16:
723 ; ZVKB-ZVE32X: # %bb.0:
724 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI24_0)
725 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI24_0)
726 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
727 ; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0)
728 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
729 ; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12
730 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
731 ; ZVKB-ZVE32X-NEXT: ret
732 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4>
733 ret <8 x half> %shuffle
736 define <8 x half> @shuffle_v8f16_as_i64_32(<8 x half> %v) {
737 ; RV32-LABEL: shuffle_v8f16_as_i64_32:
739 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
740 ; RV32-NEXT: vmv.v.i v9, 0
741 ; RV32-NEXT: li a0, 32
742 ; RV32-NEXT: li a1, 63
743 ; RV32-NEXT: vwsubu.vx v10, v9, a0
744 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
745 ; RV32-NEXT: vmv.v.x v9, a0
746 ; RV32-NEXT: vand.vx v10, v10, a1
747 ; RV32-NEXT: vand.vx v9, v9, a1
748 ; RV32-NEXT: vsrl.vv v10, v8, v10
749 ; RV32-NEXT: vsll.vv v8, v8, v9
750 ; RV32-NEXT: vor.vv v8, v8, v10
753 ; RV64-LABEL: shuffle_v8f16_as_i64_32:
755 ; RV64-NEXT: li a0, 32
756 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
757 ; RV64-NEXT: vsrl.vx v9, v8, a0
758 ; RV64-NEXT: vsll.vx v8, v8, a0
759 ; RV64-NEXT: vor.vv v8, v8, v9
762 ; ZVKB-V-LABEL: shuffle_v8f16_as_i64_32:
764 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
765 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
768 ; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_32:
769 ; ZVKB-ZVE32X: # %bb.0:
770 ; ZVKB-ZVE32X-NEXT: lui a0, 8240
771 ; ZVKB-ZVE32X-NEXT: addi a0, a0, 1
772 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 1, e32, m1, ta, ma
773 ; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0
774 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e16, m1, ta, ma
775 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
776 ; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m2, ta, ma
777 ; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v10, v8, v12
778 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
779 ; ZVKB-ZVE32X-NEXT: ret
780 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>
781 ret <8 x half> %shuffle
784 define <8 x half> @shuffle_v8f16_as_i64_48(<8 x half> %v) {
785 ; RV32-LABEL: shuffle_v8f16_as_i64_48:
787 ; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
788 ; RV32-NEXT: vmv.v.i v9, 0
789 ; RV32-NEXT: li a0, 16
790 ; RV32-NEXT: li a1, 63
791 ; RV32-NEXT: vwsubu.vx v10, v9, a0
792 ; RV32-NEXT: vsetvli zero, zero, e64, m1, ta, ma
793 ; RV32-NEXT: vmv.v.x v9, a0
794 ; RV32-NEXT: vand.vx v10, v10, a1
795 ; RV32-NEXT: vand.vx v9, v9, a1
796 ; RV32-NEXT: vsrl.vv v10, v8, v10
797 ; RV32-NEXT: vsll.vv v8, v8, v9
798 ; RV32-NEXT: vor.vv v8, v8, v10
801 ; RV64-LABEL: shuffle_v8f16_as_i64_48:
803 ; RV64-NEXT: li a0, 48
804 ; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma
805 ; RV64-NEXT: vsrl.vx v9, v8, a0
806 ; RV64-NEXT: vsll.vi v8, v8, 16
807 ; RV64-NEXT: vor.vv v8, v8, v9
810 ; ZVKB-V-LABEL: shuffle_v8f16_as_i64_48:
812 ; ZVKB-V-NEXT: vsetivli zero, 2, e64, m1, ta, ma
813 ; ZVKB-V-NEXT: vror.vi v8, v8, 48
816 ; ZVKB-ZVE32X-LABEL: shuffle_v8f16_as_i64_48:
817 ; ZVKB-ZVE32X: # %bb.0:
818 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI26_0)
819 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI26_0)
820 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
821 ; ZVKB-ZVE32X-NEXT: vle8.v v10, (a0)
822 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v12, v10
823 ; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12
824 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v10
825 ; ZVKB-ZVE32X-NEXT: ret
826 %shuffle = shufflevector <8 x half> %v, <8 x half> poison, <8 x i32> <i32 3, i32 0, i32 1, i32 2, i32 7, i32 4, i32 5, i32 6>
827 ret <8 x half> %shuffle
830 define <8 x float> @shuffle_v8f32_as_i64(<8 x float> %v) {
831 ; RV32-LABEL: shuffle_v8f32_as_i64:
833 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
834 ; RV32-NEXT: vmv.v.i v10, 0
835 ; RV32-NEXT: li a0, 32
836 ; RV32-NEXT: li a1, 63
837 ; RV32-NEXT: vwsubu.vx v12, v10, a0
838 ; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma
839 ; RV32-NEXT: vmv.v.x v10, a0
840 ; RV32-NEXT: vand.vx v12, v12, a1
841 ; RV32-NEXT: vand.vx v10, v10, a1
842 ; RV32-NEXT: vsrl.vv v12, v8, v12
843 ; RV32-NEXT: vsll.vv v8, v8, v10
844 ; RV32-NEXT: vor.vv v8, v8, v12
847 ; RV64-LABEL: shuffle_v8f32_as_i64:
849 ; RV64-NEXT: li a0, 32
850 ; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma
851 ; RV64-NEXT: vsrl.vx v10, v8, a0
852 ; RV64-NEXT: vsll.vx v8, v8, a0
853 ; RV64-NEXT: vor.vv v8, v8, v10
856 ; ZVKB-V-LABEL: shuffle_v8f32_as_i64:
858 ; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma
859 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
862 ; ZVKB-ZVE32X-LABEL: shuffle_v8f32_as_i64:
863 ; ZVKB-ZVE32X: # %bb.0:
864 ; ZVKB-ZVE32X-NEXT: lui a0, %hi(.LCPI27_0)
865 ; ZVKB-ZVE32X-NEXT: addi a0, a0, %lo(.LCPI27_0)
866 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 8, e16, m2, ta, ma
867 ; ZVKB-ZVE32X-NEXT: vle8.v v12, (a0)
868 ; ZVKB-ZVE32X-NEXT: vsext.vf2 v16, v12
869 ; ZVKB-ZVE32X-NEXT: vsetvli zero, zero, e32, m4, ta, ma
870 ; ZVKB-ZVE32X-NEXT: vrgatherei16.vv v12, v8, v16
871 ; ZVKB-ZVE32X-NEXT: vmv.v.v v8, v12
872 ; ZVKB-ZVE32X-NEXT: ret
873 %shuffle = shufflevector <8 x float> %v, <8 x float> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
874 ret <8 x float> %shuffle
877 define <8 x float> @shuffle_v8f32_as_i64_exact(<8 x float> %v) vscale_range(2,2) {
878 ; RV32-LABEL: shuffle_v8f32_as_i64_exact:
880 ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
881 ; RV32-NEXT: vmv.v.i v10, 0
882 ; RV32-NEXT: li a0, 32
883 ; RV32-NEXT: li a1, 63
884 ; RV32-NEXT: vwsubu.vx v12, v10, a0
885 ; RV32-NEXT: vsetvli zero, zero, e64, m2, ta, ma
886 ; RV32-NEXT: vmv.v.x v10, a0
887 ; RV32-NEXT: vand.vx v12, v12, a1
888 ; RV32-NEXT: vand.vx v10, v10, a1
889 ; RV32-NEXT: vsrl.vv v12, v8, v12
890 ; RV32-NEXT: vsll.vv v8, v8, v10
891 ; RV32-NEXT: vor.vv v8, v8, v12
894 ; RV64-LABEL: shuffle_v8f32_as_i64_exact:
896 ; RV64-NEXT: li a0, 32
897 ; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma
898 ; RV64-NEXT: vsrl.vx v10, v8, a0
899 ; RV64-NEXT: vsll.vx v8, v8, a0
900 ; RV64-NEXT: vor.vv v8, v8, v10
903 ; ZVKB-V-LABEL: shuffle_v8f32_as_i64_exact:
905 ; ZVKB-V-NEXT: vsetivli zero, 4, e64, m2, ta, ma
906 ; ZVKB-V-NEXT: vror.vi v8, v8, 32
909 ; ZVKB-ZVE32X-LABEL: shuffle_v8f32_as_i64_exact:
910 ; ZVKB-ZVE32X: # %bb.0:
911 ; ZVKB-ZVE32X-NEXT: lui a0, 8240
912 ; ZVKB-ZVE32X-NEXT: addi a0, a0, 1
913 ; ZVKB-ZVE32X-NEXT: vsetivli zero, 4, e32, m1, ta, ma
914 ; ZVKB-ZVE32X-NEXT: vmv.s.x v10, a0
915 ; ZVKB-ZVE32X-NEXT: vsext.vf4 v12, v10
916 ; ZVKB-ZVE32X-NEXT: vrgather.vv v11, v9, v12
917 ; ZVKB-ZVE32X-NEXT: vrgather.vv v10, v8, v12
918 ; ZVKB-ZVE32X-NEXT: vmv2r.v v8, v10
919 ; ZVKB-ZVE32X-NEXT: ret
920 %shuffle = shufflevector <8 x float> %v, <8 x float> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
921 ret <8 x float> %shuffle