Skip to content

Commit c02da38

Browse files
committed
[RISCV] Add tests for deinterleave(2-8) shuffles
1 parent 62db1c8 commit c02da38

File tree

1 file changed

+308
-0
lines changed

1 file changed

+308
-0
lines changed
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=riscv32 -mattr=+v \
3+
; RUN: -lower-interleaved-accesses=false -verify-machineinstrs \
4+
; RUN: | FileCheck %s --check-prefixes=CHECK,RV32V
5+
; RUN: llc < %s -mtriple=riscv64 -mattr=+v \
6+
; RUN: -lower-interleaved-accesses=false -verify-machineinstrs \
7+
; RUN: | FileCheck %s --check-prefixes=CHECK,RV64V
8+
9+
define void @deinterleave3_0_i8(ptr %in, ptr %out) {
10+
; CHECK-LABEL: deinterleave3_0_i8:
11+
; CHECK: # %bb.0: # %entry
12+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
13+
; CHECK-NEXT: vle8.v v8, (a0)
14+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
15+
; CHECK-NEXT: vid.v v9
16+
; CHECK-NEXT: li a0, 3
17+
; CHECK-NEXT: vmul.vx v9, v9, a0
18+
; CHECK-NEXT: vrgather.vv v10, v8, v9
19+
; CHECK-NEXT: vadd.vi v9, v9, -8
20+
; CHECK-NEXT: li a0, 56
21+
; CHECK-NEXT: vmv.s.x v0, a0
22+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
23+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
24+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
25+
; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
26+
; CHECK-NEXT: vse8.v v10, (a1)
27+
; CHECK-NEXT: ret
28+
entry:
29+
%0 = load <16 x i8>, ptr %in, align 1
30+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 3, i32 6, i32 9, i32 12, i32 15, i32 undef, i32 undef>
31+
store <8 x i8> %shuffle.i5, ptr %out, align 1
32+
ret void
33+
}
34+
35+
define void @deinterleave3_8_i8(ptr %in, ptr %out) {
36+
; CHECK-LABEL: deinterleave3_8_i8:
37+
; CHECK: # %bb.0: # %entry
38+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
39+
; CHECK-NEXT: vle8.v v8, (a0)
40+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
41+
; CHECK-NEXT: vmv.v.i v9, 1
42+
; CHECK-NEXT: vid.v v10
43+
; CHECK-NEXT: li a0, 3
44+
; CHECK-NEXT: vmadd.vx v10, a0, v9
45+
; CHECK-NEXT: vrgather.vv v9, v8, v10
46+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
47+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
48+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
49+
; CHECK-NEXT: vsrl.vi v10, v8, 8
50+
; CHECK-NEXT: vsll.vi v8, v8, 8
51+
; CHECK-NEXT: li a0, 24
52+
; CHECK-NEXT: vmv.s.x v0, a0
53+
; CHECK-NEXT: vor.vv v8, v8, v10
54+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
55+
; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
56+
; CHECK-NEXT: vse8.v v8, (a1)
57+
; CHECK-NEXT: ret
58+
entry:
59+
%0 = load <16 x i8>, ptr %in, align 1
60+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 4, i32 7, i32 10, i32 13, i32 undef, i32 undef, i32 undef>
61+
store <8 x i8> %shuffle.i5, ptr %out, align 1
62+
ret void
63+
}
64+
65+
define void @deinterleave4_0_i8(ptr %in, ptr %out) {
66+
; CHECK-LABEL: deinterleave4_0_i8:
67+
; CHECK: # %bb.0: # %entry
68+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
69+
; CHECK-NEXT: vle8.v v8, (a0)
70+
; CHECK-NEXT: vsetivli zero, 4, e8, mf2, ta, ma
71+
; CHECK-NEXT: vslidedown.vi v9, v8, 4
72+
; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma
73+
; CHECK-NEXT: vwaddu.vv v10, v8, v9
74+
; CHECK-NEXT: li a0, -1
75+
; CHECK-NEXT: vwmaccu.vx v10, a0, v9
76+
; CHECK-NEXT: vmv.v.i v0, 12
77+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
78+
; CHECK-NEXT: vid.v v9
79+
; CHECK-NEXT: vsll.vi v9, v9, 2
80+
; CHECK-NEXT: vadd.vi v9, v9, -8
81+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
82+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
83+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
84+
; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
85+
; CHECK-NEXT: vse8.v v10, (a1)
86+
; CHECK-NEXT: ret
87+
entry:
88+
%0 = load <16 x i8>, ptr %in, align 1
89+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 undef, i32 undef, i32 undef, i32 undef>
90+
store <8 x i8> %shuffle.i5, ptr %out, align 1
91+
ret void
92+
}
93+
94+
define void @deinterleave4_8_i8(ptr %in, ptr %out) {
95+
; CHECK-LABEL: deinterleave4_8_i8:
96+
; CHECK: # %bb.0: # %entry
97+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
98+
; CHECK-NEXT: vle8.v v8, (a0)
99+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
100+
; CHECK-NEXT: vmv.v.i v9, -9
101+
; CHECK-NEXT: vid.v v10
102+
; CHECK-NEXT: li a0, 5
103+
; CHECK-NEXT: vmacc.vx v9, a0, v10
104+
; CHECK-NEXT: vsll.vi v10, v10, 2
105+
; CHECK-NEXT: vadd.vi v10, v10, 1
106+
; CHECK-NEXT: vrgather.vv v11, v8, v10
107+
; CHECK-NEXT: vmv.v.i v0, 12
108+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
109+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
110+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
111+
; CHECK-NEXT: vrgather.vv v11, v8, v9, v0.t
112+
; CHECK-NEXT: vse8.v v11, (a1)
113+
; CHECK-NEXT: ret
114+
entry:
115+
%0 = load <16 x i8>, ptr %in, align 1
116+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 5, i32 9, i32 14, i32 undef, i32 undef, i32 undef, i32 undef>
117+
store <8 x i8> %shuffle.i5, ptr %out, align 1
118+
ret void
119+
}
120+
121+
define void @deinterleave5_0_i8(ptr %in, ptr %out) {
122+
; CHECK-LABEL: deinterleave5_0_i8:
123+
; CHECK: # %bb.0: # %entry
124+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
125+
; CHECK-NEXT: vle8.v v8, (a0)
126+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
127+
; CHECK-NEXT: vid.v v9
128+
; CHECK-NEXT: li a0, 5
129+
; CHECK-NEXT: vmul.vx v9, v9, a0
130+
; CHECK-NEXT: vrgather.vv v10, v8, v9
131+
; CHECK-NEXT: vadd.vi v9, v9, -8
132+
; CHECK-NEXT: vmv.v.i v0, 12
133+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
134+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
135+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
136+
; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
137+
; CHECK-NEXT: vse8.v v10, (a1)
138+
; CHECK-NEXT: ret
139+
entry:
140+
%0 = load <16 x i8>, ptr %in, align 1
141+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 5, i32 10, i32 15, i32 undef, i32 undef, i32 undef, i32 undef>
142+
store <8 x i8> %shuffle.i5, ptr %out, align 1
143+
ret void
144+
}
145+
146+
define void @deinterleave5_8_i8(ptr %in, ptr %out) {
147+
; CHECK-LABEL: deinterleave5_8_i8:
148+
; CHECK: # %bb.0: # %entry
149+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
150+
; CHECK-NEXT: vle8.v v8, (a0)
151+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
152+
; CHECK-NEXT: vmv.v.i v9, 1
153+
; CHECK-NEXT: vid.v v10
154+
; CHECK-NEXT: li a0, 5
155+
; CHECK-NEXT: vmadd.vx v10, a0, v9
156+
; CHECK-NEXT: vrgather.vv v9, v8, v10
157+
; CHECK-NEXT: vmv.v.i v0, 4
158+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
159+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
160+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
161+
; CHECK-NEXT: vrgather.vi v9, v8, 3, v0.t
162+
; CHECK-NEXT: vse8.v v9, (a1)
163+
; CHECK-NEXT: ret
164+
entry:
165+
%0 = load <16 x i8>, ptr %in, align 1
166+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 6, i32 11, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
167+
store <8 x i8> %shuffle.i5, ptr %out, align 1
168+
ret void
169+
}
170+
171+
define void @deinterleave6_0_i8(ptr %in, ptr %out) {
172+
; CHECK-LABEL: deinterleave6_0_i8:
173+
; CHECK: # %bb.0: # %entry
174+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
175+
; CHECK-NEXT: vle8.v v8, (a0)
176+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
177+
; CHECK-NEXT: vid.v v9
178+
; CHECK-NEXT: li a0, 6
179+
; CHECK-NEXT: vmul.vx v9, v9, a0
180+
; CHECK-NEXT: vrgather.vv v10, v8, v9
181+
; CHECK-NEXT: vmv.v.i v0, 4
182+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
183+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
184+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
185+
; CHECK-NEXT: vrgather.vi v10, v8, 4, v0.t
186+
; CHECK-NEXT: vse8.v v10, (a1)
187+
; CHECK-NEXT: ret
188+
entry:
189+
%0 = load <16 x i8>, ptr %in, align 1
190+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 6, i32 12, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
191+
store <8 x i8> %shuffle.i5, ptr %out, align 1
192+
ret void
193+
}
194+
195+
define void @deinterleave6_8_i8(ptr %in, ptr %out) {
196+
; CHECK-LABEL: deinterleave6_8_i8:
197+
; CHECK: # %bb.0: # %entry
198+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
199+
; CHECK-NEXT: vle8.v v8, (a0)
200+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
201+
; CHECK-NEXT: vmv.v.i v9, 1
202+
; CHECK-NEXT: vid.v v10
203+
; CHECK-NEXT: li a0, 6
204+
; CHECK-NEXT: vmadd.vx v10, a0, v9
205+
; CHECK-NEXT: vrgather.vv v9, v8, v10
206+
; CHECK-NEXT: vmv.v.i v0, 4
207+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
208+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
209+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
210+
; CHECK-NEXT: vrgather.vi v9, v8, 5, v0.t
211+
; CHECK-NEXT: vse8.v v9, (a1)
212+
; CHECK-NEXT: ret
213+
entry:
214+
%0 = load <16 x i8>, ptr %in, align 1
215+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 7, i32 13, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
216+
store <8 x i8> %shuffle.i5, ptr %out, align 1
217+
ret void
218+
}
219+
220+
define void @deinterleave7_0_i8(ptr %in, ptr %out) {
221+
; CHECK-LABEL: deinterleave7_0_i8:
222+
; CHECK: # %bb.0: # %entry
223+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
224+
; CHECK-NEXT: vle8.v v8, (a0)
225+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
226+
; CHECK-NEXT: vid.v v9
227+
; CHECK-NEXT: li a0, 7
228+
; CHECK-NEXT: vmul.vx v9, v9, a0
229+
; CHECK-NEXT: vrgather.vv v10, v8, v9
230+
; CHECK-NEXT: vmv.v.i v0, 4
231+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
232+
; CHECK-NEXT: vslidedown.vi v8, v8, 8
233+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
234+
; CHECK-NEXT: vrgather.vi v10, v8, 6, v0.t
235+
; CHECK-NEXT: vse8.v v10, (a1)
236+
; CHECK-NEXT: ret
237+
entry:
238+
%0 = load <16 x i8>, ptr %in, align 1
239+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 7, i32 14, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
240+
store <8 x i8> %shuffle.i5, ptr %out, align 1
241+
ret void
242+
}
243+
244+
define void @deinterleave7_8_i8(ptr %in, ptr %out) {
245+
; CHECK-LABEL: deinterleave7_8_i8:
246+
; CHECK: # %bb.0: # %entry
247+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
248+
; CHECK-NEXT: vle8.v v8, (a0)
249+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
250+
; CHECK-NEXT: vmv.v.i v9, -6
251+
; CHECK-NEXT: vid.v v10
252+
; CHECK-NEXT: li a0, 6
253+
; CHECK-NEXT: vmadd.vx v10, a0, v9
254+
; CHECK-NEXT: vmv.v.i v0, 6
255+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
256+
; CHECK-NEXT: vslidedown.vi v9, v8, 8
257+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
258+
; CHECK-NEXT: vrgather.vi v11, v8, 1
259+
; CHECK-NEXT: vrgather.vv v11, v9, v10, v0.t
260+
; CHECK-NEXT: vse8.v v11, (a1)
261+
; CHECK-NEXT: ret
262+
entry:
263+
%0 = load <16 x i8>, ptr %in, align 1
264+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 8, i32 14, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
265+
store <8 x i8> %shuffle.i5, ptr %out, align 1
266+
ret void
267+
}
268+
269+
define void @deinterleave8_0_i8(ptr %in, ptr %out) {
270+
; CHECK-LABEL: deinterleave8_0_i8:
271+
; CHECK: # %bb.0: # %entry
272+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
273+
; CHECK-NEXT: vle8.v v8, (a0)
274+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
275+
; CHECK-NEXT: vslidedown.vi v9, v8, 8
276+
; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma
277+
; CHECK-NEXT: vslideup.vi v8, v9, 1
278+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
279+
; CHECK-NEXT: vse8.v v8, (a1)
280+
; CHECK-NEXT: ret
281+
entry:
282+
%0 = load <16 x i8>, ptr %in, align 1
283+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 8, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
284+
store <8 x i8> %shuffle.i5, ptr %out, align 1
285+
ret void
286+
}
287+
288+
define void @deinterleave8_8_i8(ptr %in, ptr %out) {
289+
; CHECK-LABEL: deinterleave8_8_i8:
290+
; CHECK: # %bb.0: # %entry
291+
; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma
292+
; CHECK-NEXT: vle8.v v8, (a0)
293+
; CHECK-NEXT: vmv.v.i v0, -3
294+
; CHECK-NEXT: vsetivli zero, 8, e8, m1, ta, ma
295+
; CHECK-NEXT: vslidedown.vi v9, v8, 8
296+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
297+
; CHECK-NEXT: vrgather.vi v9, v8, 1, v0.t
298+
; CHECK-NEXT: vse8.v v9, (a1)
299+
; CHECK-NEXT: ret
300+
entry:
301+
%0 = load <16 x i8>, ptr %in, align 1
302+
%shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 9, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
303+
store <8 x i8> %shuffle.i5, ptr %out, align 1
304+
ret void
305+
}
306+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
307+
; RV32V: {{.*}}
308+
; RV64V: {{.*}}

0 commit comments

Comments
 (0)