Skip to content

Commit 8675952

Browse files
committed
[RISCV] Add coverage for shuffles splitable using exact VLEN
Test coverage for an upcoming transform.
1 parent cc2c8ab commit 8675952

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
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
3+
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4+
5+
define <4 x i64> @m2_splat_0(<4 x i64> %v1) vscale_range(2,2) {
6+
; CHECK-LABEL: m2_splat_0:
7+
; CHECK: # %bb.0:
8+
; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma
9+
; CHECK-NEXT: vrgather.vi v10, v8, 0
10+
; CHECK-NEXT: vmv.v.v v8, v10
11+
; CHECK-NEXT: ret
12+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
13+
ret <4 x i64> %res
14+
}
15+
16+
define <4 x i64> @m2_splat_in_chunks(<4 x i64> %v1) vscale_range(2,2) {
17+
; CHECK-LABEL: m2_splat_in_chunks:
18+
; CHECK: # %bb.0:
19+
; CHECK-NEXT: lui a0, 8224
20+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
21+
; CHECK-NEXT: vmv.s.x v10, a0
22+
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
23+
; CHECK-NEXT: vsext.vf2 v12, v10
24+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
25+
; CHECK-NEXT: vrgatherei16.vv v10, v8, v12
26+
; CHECK-NEXT: vmv.v.v v8, v10
27+
; CHECK-NEXT: ret
28+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 0, i32 0, i32 2, i32 2>
29+
ret <4 x i64> %res
30+
}
31+
32+
define <8 x i64> @m4_splat_in_chunks(<8 x i64> %v1) vscale_range(2,2) {
33+
; CHECK-LABEL: m4_splat_in_chunks:
34+
; CHECK: # %bb.0:
35+
; CHECK-NEXT: lui a0, %hi(.LCPI2_0)
36+
; CHECK-NEXT: addi a0, a0, %lo(.LCPI2_0)
37+
; CHECK-NEXT: vl1re16.v v16, (a0)
38+
; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma
39+
; CHECK-NEXT: vrgatherei16.vv v12, v8, v16
40+
; CHECK-NEXT: vmv.v.v v8, v12
41+
; CHECK-NEXT: ret
42+
%res = shufflevector <8 x i64> %v1, <8 x i64> poison, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 4, i32 4, i32 7, i32 7>
43+
ret <8 x i64> %res
44+
}
45+
46+
47+
define <4 x i64> @m2_splat_with_tail(<4 x i64> %v1) vscale_range(2,2) {
48+
; CHECK-LABEL: m2_splat_with_tail:
49+
; CHECK: # %bb.0:
50+
; CHECK-NEXT: lui a0, 12320
51+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
52+
; CHECK-NEXT: vmv.s.x v10, a0
53+
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
54+
; CHECK-NEXT: vsext.vf2 v12, v10
55+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
56+
; CHECK-NEXT: vrgatherei16.vv v10, v8, v12
57+
; CHECK-NEXT: vmv.v.v v8, v10
58+
; CHECK-NEXT: ret
59+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
60+
ret <4 x i64> %res
61+
}
62+
63+
define <4 x i64> @m2_pair_swap_vl4(<4 x i64> %v1) vscale_range(2,2) {
64+
; CHECK-LABEL: m2_pair_swap_vl4:
65+
; CHECK: # %bb.0:
66+
; CHECK-NEXT: lui a0, 8240
67+
; CHECK-NEXT: addi a0, a0, 1
68+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
69+
; CHECK-NEXT: vmv.s.x v10, a0
70+
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
71+
; CHECK-NEXT: vsext.vf2 v12, v10
72+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
73+
; CHECK-NEXT: vrgatherei16.vv v10, v8, v12
74+
; CHECK-NEXT: vmv.v.v v8, v10
75+
; CHECK-NEXT: ret
76+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
77+
ret <4 x i64> %res
78+
}
79+
80+
define <8 x i32> @m2_pair_swap_vl8(<8 x i32> %v1) vscale_range(2,2) {
81+
; RV32-LABEL: m2_pair_swap_vl8:
82+
; RV32: # %bb.0:
83+
; RV32-NEXT: li a0, 32
84+
; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
85+
; RV32-NEXT: vmv.v.x v10, a0
86+
; RV32-NEXT: li a0, 63
87+
; RV32-NEXT: vand.vx v12, v10, a0
88+
; RV32-NEXT: vsll.vv v12, v8, v12
89+
; RV32-NEXT: vrsub.vi v10, v10, 0
90+
; RV32-NEXT: vand.vx v10, v10, a0
91+
; RV32-NEXT: vsrl.vv v8, v8, v10
92+
; RV32-NEXT: vor.vv v8, v12, v8
93+
; RV32-NEXT: ret
94+
;
95+
; RV64-LABEL: m2_pair_swap_vl8:
96+
; RV64: # %bb.0:
97+
; RV64-NEXT: li a0, 32
98+
; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma
99+
; RV64-NEXT: vsrl.vx v10, v8, a0
100+
; RV64-NEXT: vsll.vx v8, v8, a0
101+
; RV64-NEXT: vor.vv v8, v8, v10
102+
; RV64-NEXT: ret
103+
%res = shufflevector <8 x i32> %v1, <8 x i32> poison, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
104+
ret <8 x i32> %res
105+
}
106+
107+
define <4 x i64> @m2_splat_into_identity(<4 x i64> %v1) vscale_range(2,2) {
108+
; CHECK-LABEL: m2_splat_into_identity:
109+
; CHECK: # %bb.0:
110+
; CHECK-NEXT: lui a0, 12320
111+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
112+
; CHECK-NEXT: vmv.s.x v10, a0
113+
; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma
114+
; CHECK-NEXT: vsext.vf2 v12, v10
115+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
116+
; CHECK-NEXT: vrgatherei16.vv v10, v8, v12
117+
; CHECK-NEXT: vmv.v.v v8, v10
118+
; CHECK-NEXT: ret
119+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 0, i32 0, i32 2, i32 3>
120+
ret <4 x i64> %res
121+
}
122+
123+
define <4 x i64> @m2_broadcast_i128(<4 x i64> %v1) vscale_range(2,2) {
124+
; CHECK-LABEL: m2_broadcast_i128:
125+
; CHECK: # %bb.0:
126+
; CHECK-NEXT: lui a0, 16
127+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
128+
; CHECK-NEXT: vmv.v.x v12, a0
129+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
130+
; CHECK-NEXT: vrgatherei16.vv v10, v8, v12
131+
; CHECK-NEXT: vmv.v.v v8, v10
132+
; CHECK-NEXT: ret
133+
%res = shufflevector <4 x i64> %v1, <4 x i64> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
134+
ret <4 x i64> %res
135+
}
136+
137+
define <8 x i64> @m4_broadcast_i128(<8 x i64> %v1) vscale_range(2,2) {
138+
; CHECK-LABEL: m4_broadcast_i128:
139+
; CHECK: # %bb.0:
140+
; CHECK-NEXT: lui a0, 16
141+
; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma
142+
; CHECK-NEXT: vmv.v.x v16, a0
143+
; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma
144+
; CHECK-NEXT: vrgatherei16.vv v12, v8, v16
145+
; CHECK-NEXT: vmv.v.v v8, v12
146+
; CHECK-NEXT: ret
147+
%res = shufflevector <8 x i64> %v1, <8 x i64> poison, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
148+
ret <8 x i64> %res
149+
}
150+
151+
152+
define <4 x i64> @m2_splat_two_source(<4 x i64> %v1, <4 x i64> %v2) vscale_range(2,2) {
153+
; CHECK-LABEL: m2_splat_two_source:
154+
; CHECK: # %bb.0:
155+
; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma
156+
; CHECK-NEXT: vrgather.vi v12, v8, 0
157+
; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
158+
; CHECK-NEXT: vmv.v.i v0, 12
159+
; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, mu
160+
; CHECK-NEXT: vrgather.vi v12, v10, 3, v0.t
161+
; CHECK-NEXT: vmv.v.v v8, v12
162+
; CHECK-NEXT: ret
163+
%res = shufflevector <4 x i64> %v1, <4 x i64> %v2, <4 x i32> <i32 0, i32 0, i32 7, i32 7>
164+
ret <4 x i64> %res
165+
}
166+
167+
define <4 x i64> @m2_splat_into_identity_two_source(<4 x i64> %v1, <4 x i64> %v2) vscale_range(2,2) {
168+
; CHECK-LABEL: m2_splat_into_identity_two_source:
169+
; CHECK: # %bb.0:
170+
; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma
171+
; CHECK-NEXT: vrgather.vi v12, v8, 0
172+
; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
173+
; CHECK-NEXT: vmv.v.i v0, 12
174+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
175+
; CHECK-NEXT: vid.v v8
176+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, mu
177+
; CHECK-NEXT: vrgatherei16.vv v12, v10, v8, v0.t
178+
; CHECK-NEXT: vmv.v.v v8, v12
179+
; CHECK-NEXT: ret
180+
%res = shufflevector <4 x i64> %v1, <4 x i64> %v2, <4 x i32> <i32 0, i32 0, i32 6, i32 7>
181+
ret <4 x i64> %res
182+
}
183+
184+
define <4 x i64> @m2_splat_into_slide_two_source(<4 x i64> %v1, <4 x i64> %v2) vscale_range(2,2) {
185+
; CHECK-LABEL: m2_splat_into_slide_two_source:
186+
; CHECK: # %bb.0:
187+
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
188+
; CHECK-NEXT: vid.v v12
189+
; CHECK-NEXT: vadd.vi v14, v12, -1
190+
; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma
191+
; CHECK-NEXT: vrgather.vi v12, v8, 0
192+
; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma
193+
; CHECK-NEXT: vmv.v.i v0, 12
194+
; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, mu
195+
; CHECK-NEXT: vrgatherei16.vv v12, v10, v14, v0.t
196+
; CHECK-NEXT: vmv.v.v v8, v12
197+
; CHECK-NEXT: ret
198+
%res = shufflevector <4 x i64> %v1, <4 x i64> %v2, <4 x i32> <i32 0, i32 0, i32 5, i32 6>
199+
ret <4 x i64> %res
200+
}

0 commit comments

Comments
 (0)