2
2
; RUN: llc -mtriple=riscv32 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV32
3
3
; RUN: llc -mtriple=riscv64 -global-isel -global-isel-abort=1 < %s 2>&1 | FileCheck %s --check-prefixes=RV64
4
4
5
- ; FIXME: andi a0, a0, 1 is unneeded
6
5
define i2 @bitreverse_i2 (i2 %x ) {
7
6
; RV32-LABEL: bitreverse_i2:
8
7
; RV32: # %bb.0:
@@ -18,15 +17,13 @@ define i2 @bitreverse_i2(i2 %x) {
18
17
; RV64-NEXT: slli a1, a0, 1
19
18
; RV64-NEXT: andi a1, a1, 2
20
19
; 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
23
21
; RV64-NEXT: or a0, a1, a0
24
22
; RV64-NEXT: ret
25
23
%rev = call i2 @llvm.bitreverse.i2 (i2 %x )
26
24
ret i2 %rev
27
25
}
28
26
29
- ; FIXME: andi a0, a0, 1 is unneeded
30
27
define i3 @bitreverse_i3 (i3 %x ) {
31
28
; RV32-LABEL: bitreverse_i3:
32
29
; RV32: # %bb.0:
@@ -46,15 +43,13 @@ define i3 @bitreverse_i3(i3 %x) {
46
43
; RV64-NEXT: andi a0, a0, 7
47
44
; RV64-NEXT: andi a2, a0, 2
48
45
; 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
51
47
; RV64-NEXT: or a0, a1, a0
52
48
; RV64-NEXT: ret
53
49
%rev = call i3 @llvm.bitreverse.i3 (i3 %x )
54
50
ret i3 %rev
55
51
}
56
52
57
- ; FIXME: andi a0, a0, 1 is unneeded
58
53
define i4 @bitreverse_i4 (i4 %x ) {
59
54
; RV32-LABEL: bitreverse_i4:
60
55
; RV32: # %bb.0:
@@ -79,18 +74,16 @@ define i4 @bitreverse_i4(i4 %x) {
79
74
; RV64-NEXT: andi a2, a2, 4
80
75
; RV64-NEXT: or a1, a1, a2
81
76
; RV64-NEXT: andi a0, a0, 15
82
- ; RV64-NEXT: srliw a2, a0, 1
77
+ ; RV64-NEXT: srli a2, a0, 1
83
78
; RV64-NEXT: andi a2, a2, 2
84
79
; 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
87
81
; RV64-NEXT: or a0, a1, a0
88
82
; RV64-NEXT: ret
89
83
%rev = call i4 @llvm.bitreverse.i4 (i4 %x )
90
84
ret i4 %rev
91
85
}
92
86
93
- ; FIXME: andi a0, a0, 1 is unneeded
94
87
define i7 @bitreverse_i7 (i7 %x ) {
95
88
; RV32-LABEL: bitreverse_i7:
96
89
; RV32: # %bb.0:
@@ -122,20 +115,20 @@ define i7 @bitreverse_i7(i7 %x) {
122
115
; RV64-NEXT: slli a2, a0, 4
123
116
; RV64-NEXT: andi a2, a2, 32
124
117
; 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
127
121
; 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
130
130
; 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
139
132
; RV64-NEXT: or a0, a1, a0
140
133
; RV64-NEXT: ret
141
134
%rev = call i7 @llvm.bitreverse.i7 (i7 %x )
@@ -179,39 +172,39 @@ define i24 @bitreverse_i24(i24 %x) {
179
172
;
180
173
; RV64-LABEL: bitreverse_i24:
181
174
; 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
192
185
; RV64-NEXT: and a3, a0, a3
193
- ; RV64-NEXT: srliw a3, a3, 4
186
+ ; RV64-NEXT: srli a3, a3, 4
194
187
; RV64-NEXT: slli a0, a0, 4
195
- ; RV64-NEXT: and a0, a0, a1
188
+ ; RV64-NEXT: and a0, a0, a2
196
189
; 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
201
194
; RV64-NEXT: and a3, a0, a3
202
- ; RV64-NEXT: srliw a3, a3, 2
195
+ ; RV64-NEXT: srli a3, a3, 2
203
196
; RV64-NEXT: slli a0, a0, 2
204
- ; RV64-NEXT: and a0, a0, a1
197
+ ; RV64-NEXT: and a0, a0, a2
205
198
; 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
215
208
; RV64-NEXT: ret
216
209
%rev = call i24 @llvm.bitreverse.i24 (i24 %x )
217
210
ret i24 %rev
0 commit comments