22; RUN: llc -mtriple=riscv32 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV32
33; RUN: llc -mtriple=riscv64 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV64
44
5- ; FIXME: andi a0, a0, 1 is unneeded
65define i2 @bitreverse_i2 (i2 %x ) {
76; RV32-LABEL: bitreverse_i2:
87; RV32: # %bb.0:
@@ -18,15 +17,13 @@ define i2 @bitreverse_i2(i2 %x) {
1817; RV64-NEXT: slli a1, a0, 1
1918; RV64-NEXT: andi a1, a1, 2
2019; RV64-NEXT: andi a0, a0, 3
21- ; RV64-NEXT: srliw a0, a0, 1
22- ; RV64-NEXT: andi a0, a0, 1
20+ ; RV64-NEXT: srli a0, a0, 1
2321; RV64-NEXT: or a0, a1, a0
2422; RV64-NEXT: ret
2523 %rev = call i2 @llvm.bitreverse.i2 (i2 %x )
2624 ret i2 %rev
2725}
2826
29- ; FIXME: andi a0, a0, 1 is unneeded
3027define i3 @bitreverse_i3 (i3 %x ) {
3128; RV32-LABEL: bitreverse_i3:
3229; RV32: # %bb.0:
@@ -46,15 +43,13 @@ define i3 @bitreverse_i3(i3 %x) {
4643; RV64-NEXT: andi a0, a0, 7
4744; RV64-NEXT: andi a2, a0, 2
4845; RV64-NEXT: or a1, a1, a2
49- ; RV64-NEXT: srliw a0, a0, 2
50- ; RV64-NEXT: andi a0, a0, 1
46+ ; RV64-NEXT: srli a0, a0, 2
5147; RV64-NEXT: or a0, a1, a0
5248; RV64-NEXT: ret
5349 %rev = call i3 @llvm.bitreverse.i3 (i3 %x )
5450 ret i3 %rev
5551}
5652
57- ; FIXME: andi a0, a0, 1 is unneeded
5853define i4 @bitreverse_i4 (i4 %x ) {
5954; RV32-LABEL: bitreverse_i4:
6055; RV32: # %bb.0:
@@ -79,18 +74,16 @@ define i4 @bitreverse_i4(i4 %x) {
7974; RV64-NEXT: andi a2, a2, 4
8075; RV64-NEXT: or a1, a1, a2
8176; RV64-NEXT: andi a0, a0, 15
82- ; RV64-NEXT: srliw a2, a0, 1
77+ ; RV64-NEXT: srli a2, a0, 1
8378; RV64-NEXT: andi a2, a2, 2
8479; RV64-NEXT: or a1, a1, a2
85- ; RV64-NEXT: srliw a0, a0, 3
86- ; RV64-NEXT: andi a0, a0, 1
80+ ; RV64-NEXT: srli a0, a0, 3
8781; RV64-NEXT: or a0, a1, a0
8882; RV64-NEXT: ret
8983 %rev = call i4 @llvm.bitreverse.i4 (i4 %x )
9084 ret i4 %rev
9185}
9286
93- ; FIXME: andi a0, a0, 1 is unneeded
9487define i7 @bitreverse_i7 (i7 %x ) {
9588; RV32-LABEL: bitreverse_i7:
9689; RV32: # %bb.0:
@@ -122,20 +115,20 @@ define i7 @bitreverse_i7(i7 %x) {
122115; RV64-NEXT: slli a2, a0, 4
123116; RV64-NEXT: andi a2, a2, 32
124117; RV64-NEXT: or a1, a1, a2
125- ; RV64-NEXT: slli a2, a0, 2
126- ; RV64-NEXT: andi a2, a2, 16
118+ ; RV64-NEXT: li a2, 2
119+ ; RV64-NEXT: slli a3, a0, 2
120+ ; RV64-NEXT: andi a3, a3, 16
127121; RV64-NEXT: andi a0, a0, 127
128- ; RV64-NEXT: andi a3, a0, 8
129- ; RV64-NEXT: or a2, a2, a3
122+ ; RV64-NEXT: andi a4, a0, 8
123+ ; RV64-NEXT: or a3, a3, a4
124+ ; RV64-NEXT: or a1, a1, a3
125+ ; RV64-NEXT: srli a3, a0, 2
126+ ; RV64-NEXT: andi a3, a3, 4
127+ ; RV64-NEXT: srli a4, a0, 4
128+ ; RV64-NEXT: and a2, a4, a2
129+ ; RV64-NEXT: or a2, a3, a2
130130; RV64-NEXT: or a1, a1, a2
131- ; RV64-NEXT: srliw a2, a0, 2
132- ; RV64-NEXT: andi a2, a2, 4
133- ; RV64-NEXT: srliw a3, a0, 4
134- ; RV64-NEXT: andi a3, a3, 2
135- ; RV64-NEXT: or a2, a2, a3
136- ; RV64-NEXT: or a1, a1, a2
137- ; RV64-NEXT: srliw a0, a0, 6
138- ; RV64-NEXT: andi a0, a0, 1
131+ ; RV64-NEXT: srli a0, a0, 6
139132; RV64-NEXT: or a0, a1, a0
140133; RV64-NEXT: ret
141134 %rev = call i7 @llvm.bitreverse.i7 (i7 %x )
@@ -179,39 +172,39 @@ define i24 @bitreverse_i24(i24 %x) {
179172;
180173; RV64-LABEL: bitreverse_i24:
181174; RV64: # %bb.0:
182- ; RV64-NEXT: slli a1, a0, 16
183- ; RV64-NEXT: lui a2, 4096
184- ; RV64-NEXT: addi a2, a2, -1
185- ; RV64-NEXT: and a0, a0, a2
186- ; RV64-NEXT: srliw a0, a0, 16
187- ; RV64-NEXT: or a0, a0, a1
188- ; RV64-NEXT: lui a1 , 65521
189- ; RV64-NEXT: addi a1, a1 , -241
190- ; RV64-NEXT: slli a1, a1 , 4
191- ; RV64-NEXT: and a3, a1, a2
175+ ; RV64-NEXT: lui a1, 4096
176+ ; RV64-NEXT: addiw a1, a1, -1
177+ ; RV64-NEXT: slli a2, a0, 16
178+ ; RV64-NEXT: and a0, a0, a1
179+ ; RV64-NEXT: srli a0, a0, 16
180+ ; RV64-NEXT: or a0, a0, a2
181+ ; RV64-NEXT: lui a2 , 65521
182+ ; RV64-NEXT: addiw a2, a2 , -241
183+ ; RV64-NEXT: slli a2, a2 , 4
184+ ; RV64-NEXT: and a3, a2, a1
192185; RV64-NEXT: and a3, a0, a3
193- ; RV64-NEXT: srliw a3, a3, 4
186+ ; RV64-NEXT: srli a3, a3, 4
194187; RV64-NEXT: slli a0, a0, 4
195- ; RV64-NEXT: and a0, a0, a1
188+ ; RV64-NEXT: and a0, a0, a2
196189; RV64-NEXT: or a0, a3, a0
197- ; RV64-NEXT: lui a1 , 261939
198- ; RV64-NEXT: addi a1, a1 , 819
199- ; RV64-NEXT: slli a1, a1 , 2
200- ; RV64-NEXT: and a3, a1, a2
190+ ; RV64-NEXT: lui a2 , 261939
191+ ; RV64-NEXT: addiw a2, a2 , 819
192+ ; RV64-NEXT: slli a2, a2 , 2
193+ ; RV64-NEXT: and a3, a2, a1
201194; RV64-NEXT: and a3, a0, a3
202- ; RV64-NEXT: srliw a3, a3, 2
195+ ; RV64-NEXT: srli a3, a3, 2
203196; RV64-NEXT: slli a0, a0, 2
204- ; RV64-NEXT: and a0, a0, a1
197+ ; RV64-NEXT: and a0, a0, a2
205198; RV64-NEXT: or a0, a3, a0
206- ; RV64-NEXT: lui a1 , 523605
207- ; RV64-NEXT: addiw a1, a1 , 1365
208- ; RV64-NEXT: slli a1, a1 , 1
209- ; RV64-NEXT: and a2, a1, a2
210- ; RV64-NEXT: and a2 , a0, a2
211- ; RV64-NEXT: srliw a2, a2 , 1
212- ; RV64-NEXT: slliw a0, a0, 1
213- ; RV64-NEXT: and a0, a0, a1
214- ; RV64-NEXT: or a0, a2 , a0
199+ ; RV64-NEXT: lui a2 , 523605
200+ ; RV64-NEXT: addiw a2, a2 , 1365
201+ ; RV64-NEXT: slli a2, a2 , 1
202+ ; RV64-NEXT: and a1, a2, a1
203+ ; RV64-NEXT: and a1 , a0, a1
204+ ; RV64-NEXT: srli a1, a1 , 1
205+ ; RV64-NEXT: slli a0, a0, 1
206+ ; RV64-NEXT: and a0, a0, a2
207+ ; RV64-NEXT: or a0, a1 , a0
215208; RV64-NEXT: ret
216209 %rev = call i24 @llvm.bitreverse.i24 (i24 %x )
217210 ret i24 %rev
0 commit comments