1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
2
; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \
3
- ; RUN: | FileCheck %s -check-prefixes=RV32ZBKB
3
+ ; RUN: | FileCheck %s -check-prefixes=CHECK, RV32ZBKB
4
4
; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
5
- ; RUN: | FileCheck %s -check-prefixes=RV64ZBKB
5
+ ; RUN: | FileCheck %s -check-prefixes=CHECK, RV64ZBKB
6
6
7
- ; TODO: These tests can be optimised
7
+ ; These tests can be optimised
8
8
; fold (bitreverse(srl (bitreverse c), x)) -> (shl c, x)
9
9
; fold (bitreverse(shl (bitreverse c), x)) -> (srl c, x)
10
10
@@ -14,51 +14,21 @@ declare i32 @llvm.bitreverse.i32(i32)
14
14
declare i64 @llvm.bitreverse.i64 (i64 )
15
15
16
16
define i8 @test_bitreverse_srli_bitreverse_i8 (i8 %a ) nounwind {
17
- ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i8:
18
- ; RV32ZBKB: # %bb.0:
19
- ; RV32ZBKB-NEXT: rev8 a0, a0
20
- ; RV32ZBKB-NEXT: brev8 a0, a0
21
- ; RV32ZBKB-NEXT: srli a0, a0, 27
22
- ; RV32ZBKB-NEXT: rev8 a0, a0
23
- ; RV32ZBKB-NEXT: brev8 a0, a0
24
- ; RV32ZBKB-NEXT: srli a0, a0, 24
25
- ; RV32ZBKB-NEXT: ret
26
- ;
27
- ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i8:
28
- ; RV64ZBKB: # %bb.0:
29
- ; RV64ZBKB-NEXT: rev8 a0, a0
30
- ; RV64ZBKB-NEXT: brev8 a0, a0
31
- ; RV64ZBKB-NEXT: srli a0, a0, 59
32
- ; RV64ZBKB-NEXT: rev8 a0, a0
33
- ; RV64ZBKB-NEXT: brev8 a0, a0
34
- ; RV64ZBKB-NEXT: srli a0, a0, 56
35
- ; RV64ZBKB-NEXT: ret
17
+ ; CHECK-LABEL: test_bitreverse_srli_bitreverse_i8:
18
+ ; CHECK: # %bb.0:
19
+ ; CHECK-NEXT: slli a0, a0, 3
20
+ ; CHECK-NEXT: ret
36
21
%1 = call i8 @llvm.bitreverse.i8 (i8 %a )
37
22
%2 = lshr i8 %1 , 3
38
23
%3 = call i8 @llvm.bitreverse.i8 (i8 %2 )
39
24
ret i8 %3
40
25
}
41
26
42
27
define i16 @test_bitreverse_srli_bitreverse_i16 (i16 %a ) nounwind {
43
- ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i16:
44
- ; RV32ZBKB: # %bb.0:
45
- ; RV32ZBKB-NEXT: rev8 a0, a0
46
- ; RV32ZBKB-NEXT: brev8 a0, a0
47
- ; RV32ZBKB-NEXT: srli a0, a0, 23
48
- ; RV32ZBKB-NEXT: rev8 a0, a0
49
- ; RV32ZBKB-NEXT: brev8 a0, a0
50
- ; RV32ZBKB-NEXT: srli a0, a0, 16
51
- ; RV32ZBKB-NEXT: ret
52
- ;
53
- ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i16:
54
- ; RV64ZBKB: # %bb.0:
55
- ; RV64ZBKB-NEXT: rev8 a0, a0
56
- ; RV64ZBKB-NEXT: brev8 a0, a0
57
- ; RV64ZBKB-NEXT: srli a0, a0, 55
58
- ; RV64ZBKB-NEXT: rev8 a0, a0
59
- ; RV64ZBKB-NEXT: brev8 a0, a0
60
- ; RV64ZBKB-NEXT: srli a0, a0, 48
61
- ; RV64ZBKB-NEXT: ret
28
+ ; CHECK-LABEL: test_bitreverse_srli_bitreverse_i16:
29
+ ; CHECK: # %bb.0:
30
+ ; CHECK-NEXT: slli a0, a0, 7
31
+ ; CHECK-NEXT: ret
62
32
%1 = call i16 @llvm.bitreverse.i16 (i16 %a )
63
33
%2 = lshr i16 %1 , 7
64
34
%3 = call i16 @llvm.bitreverse.i16 (i16 %2 )
@@ -68,21 +38,12 @@ define i16 @test_bitreverse_srli_bitreverse_i16(i16 %a) nounwind {
68
38
define i32 @test_bitreverse_srli_bitreverse_i32 (i32 %a ) nounwind {
69
39
; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
70
40
; RV32ZBKB: # %bb.0:
71
- ; RV32ZBKB-NEXT: rev8 a0, a0
72
- ; RV32ZBKB-NEXT: brev8 a0, a0
73
- ; RV32ZBKB-NEXT: srli a0, a0, 15
74
- ; RV32ZBKB-NEXT: rev8 a0, a0
75
- ; RV32ZBKB-NEXT: brev8 a0, a0
41
+ ; RV32ZBKB-NEXT: slli a0, a0, 15
76
42
; RV32ZBKB-NEXT: ret
77
43
;
78
44
; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
79
45
; RV64ZBKB: # %bb.0:
80
- ; RV64ZBKB-NEXT: rev8 a0, a0
81
- ; RV64ZBKB-NEXT: brev8 a0, a0
82
- ; RV64ZBKB-NEXT: srli a0, a0, 47
83
- ; RV64ZBKB-NEXT: rev8 a0, a0
84
- ; RV64ZBKB-NEXT: brev8 a0, a0
85
- ; RV64ZBKB-NEXT: srli a0, a0, 32
46
+ ; RV64ZBKB-NEXT: slliw a0, a0, 15
86
47
; RV64ZBKB-NEXT: ret
87
48
%1 = call i32 @llvm.bitreverse.i32 (i32 %a )
88
49
%2 = lshr i32 %1 , 15
@@ -93,21 +54,13 @@ define i32 @test_bitreverse_srli_bitreverse_i32(i32 %a) nounwind {
93
54
define i64 @test_bitreverse_srli_bitreverse_i64 (i64 %a ) nounwind {
94
55
; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
95
56
; RV32ZBKB: # %bb.0:
96
- ; RV32ZBKB-NEXT: rev8 a0, a0
97
- ; RV32ZBKB-NEXT: brev8 a0, a0
98
- ; RV32ZBKB-NEXT: srli a0, a0, 1
99
- ; RV32ZBKB-NEXT: rev8 a0, a0
100
- ; RV32ZBKB-NEXT: brev8 a1, a0
57
+ ; RV32ZBKB-NEXT: slli a1, a0, 1
101
58
; RV32ZBKB-NEXT: li a0, 0
102
59
; RV32ZBKB-NEXT: ret
103
60
;
104
61
; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
105
62
; RV64ZBKB: # %bb.0:
106
- ; RV64ZBKB-NEXT: rev8 a0, a0
107
- ; RV64ZBKB-NEXT: brev8 a0, a0
108
- ; RV64ZBKB-NEXT: srli a0, a0, 33
109
- ; RV64ZBKB-NEXT: rev8 a0, a0
110
- ; RV64ZBKB-NEXT: brev8 a0, a0
63
+ ; RV64ZBKB-NEXT: slli a0, a0, 33
111
64
; RV64ZBKB-NEXT: ret
112
65
%1 = call i64 @llvm.bitreverse.i64 (i64 %a )
113
66
%2 = lshr i64 %1 , 33
@@ -118,24 +71,14 @@ define i64 @test_bitreverse_srli_bitreverse_i64(i64 %a) nounwind {
118
71
define i8 @test_bitreverse_shli_bitreverse_i8 (i8 %a ) nounwind {
119
72
; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
120
73
; RV32ZBKB: # %bb.0:
121
- ; RV32ZBKB-NEXT: rev8 a0, a0
122
- ; RV32ZBKB-NEXT: brev8 a0, a0
123
- ; RV32ZBKB-NEXT: srli a0, a0, 24
124
- ; RV32ZBKB-NEXT: slli a0, a0, 3
125
- ; RV32ZBKB-NEXT: rev8 a0, a0
126
- ; RV32ZBKB-NEXT: brev8 a0, a0
127
- ; RV32ZBKB-NEXT: srli a0, a0, 24
74
+ ; RV32ZBKB-NEXT: slli a0, a0, 24
75
+ ; RV32ZBKB-NEXT: srli a0, a0, 27
128
76
; RV32ZBKB-NEXT: ret
129
77
;
130
78
; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
131
79
; RV64ZBKB: # %bb.0:
132
- ; RV64ZBKB-NEXT: rev8 a0, a0
133
- ; RV64ZBKB-NEXT: brev8 a0, a0
134
- ; RV64ZBKB-NEXT: srli a0, a0, 56
135
- ; RV64ZBKB-NEXT: slli a0, a0, 3
136
- ; RV64ZBKB-NEXT: rev8 a0, a0
137
- ; RV64ZBKB-NEXT: brev8 a0, a0
138
- ; RV64ZBKB-NEXT: srli a0, a0, 56
80
+ ; RV64ZBKB-NEXT: slli a0, a0, 56
81
+ ; RV64ZBKB-NEXT: srli a0, a0, 59
139
82
; RV64ZBKB-NEXT: ret
140
83
%1 = call i8 @llvm.bitreverse.i8 (i8 %a )
141
84
%2 = shl i8 %1 , 3
@@ -146,24 +89,14 @@ define i8 @test_bitreverse_shli_bitreverse_i8(i8 %a) nounwind {
146
89
define i16 @test_bitreverse_shli_bitreverse_i16 (i16 %a ) nounwind {
147
90
; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
148
91
; RV32ZBKB: # %bb.0:
149
- ; RV32ZBKB-NEXT: rev8 a0, a0
150
- ; RV32ZBKB-NEXT: brev8 a0, a0
151
- ; RV32ZBKB-NEXT: srli a0, a0, 16
152
- ; RV32ZBKB-NEXT: slli a0, a0, 7
153
- ; RV32ZBKB-NEXT: rev8 a0, a0
154
- ; RV32ZBKB-NEXT: brev8 a0, a0
155
- ; RV32ZBKB-NEXT: srli a0, a0, 16
92
+ ; RV32ZBKB-NEXT: slli a0, a0, 16
93
+ ; RV32ZBKB-NEXT: srli a0, a0, 23
156
94
; RV32ZBKB-NEXT: ret
157
95
;
158
96
; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
159
97
; RV64ZBKB: # %bb.0:
160
- ; RV64ZBKB-NEXT: rev8 a0, a0
161
- ; RV64ZBKB-NEXT: brev8 a0, a0
162
- ; RV64ZBKB-NEXT: srli a0, a0, 48
163
- ; RV64ZBKB-NEXT: slli a0, a0, 7
164
- ; RV64ZBKB-NEXT: rev8 a0, a0
165
- ; RV64ZBKB-NEXT: brev8 a0, a0
166
- ; RV64ZBKB-NEXT: srli a0, a0, 48
98
+ ; RV64ZBKB-NEXT: slli a0, a0, 48
99
+ ; RV64ZBKB-NEXT: srli a0, a0, 55
167
100
; RV64ZBKB-NEXT: ret
168
101
%1 = call i16 @llvm.bitreverse.i16 (i16 %a )
169
102
%2 = shl i16 %1 , 7
@@ -174,22 +107,12 @@ define i16 @test_bitreverse_shli_bitreverse_i16(i16 %a) nounwind {
174
107
define i32 @test_bitreverse_shli_bitreverse_i32 (i32 %a ) nounwind {
175
108
; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
176
109
; RV32ZBKB: # %bb.0:
177
- ; RV32ZBKB-NEXT: rev8 a0, a0
178
- ; RV32ZBKB-NEXT: brev8 a0, a0
179
- ; RV32ZBKB-NEXT: slli a0, a0, 15
180
- ; RV32ZBKB-NEXT: rev8 a0, a0
181
- ; RV32ZBKB-NEXT: brev8 a0, a0
110
+ ; RV32ZBKB-NEXT: srli a0, a0, 15
182
111
; RV32ZBKB-NEXT: ret
183
112
;
184
113
; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
185
114
; RV64ZBKB: # %bb.0:
186
- ; RV64ZBKB-NEXT: rev8 a0, a0
187
- ; RV64ZBKB-NEXT: brev8 a0, a0
188
- ; RV64ZBKB-NEXT: srli a0, a0, 32
189
- ; RV64ZBKB-NEXT: slli a0, a0, 15
190
- ; RV64ZBKB-NEXT: rev8 a0, a0
191
- ; RV64ZBKB-NEXT: brev8 a0, a0
192
- ; RV64ZBKB-NEXT: srli a0, a0, 32
115
+ ; RV64ZBKB-NEXT: srliw a0, a0, 15
193
116
; RV64ZBKB-NEXT: ret
194
117
%1 = call i32 @llvm.bitreverse.i32 (i32 %a )
195
118
%2 = shl i32 %1 , 15
@@ -200,21 +123,13 @@ define i32 @test_bitreverse_shli_bitreverse_i32(i32 %a) nounwind {
200
123
define i64 @test_bitreverse_shli_bitreverse_i64 (i64 %a ) nounwind {
201
124
; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
202
125
; RV32ZBKB: # %bb.0:
203
- ; RV32ZBKB-NEXT: rev8 a0, a1
204
- ; RV32ZBKB-NEXT: brev8 a0, a0
205
- ; RV32ZBKB-NEXT: slli a0, a0, 1
206
- ; RV32ZBKB-NEXT: rev8 a0, a0
207
- ; RV32ZBKB-NEXT: brev8 a0, a0
126
+ ; RV32ZBKB-NEXT: srli a0, a1, 1
208
127
; RV32ZBKB-NEXT: li a1, 0
209
128
; RV32ZBKB-NEXT: ret
210
129
;
211
130
; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
212
131
; RV64ZBKB: # %bb.0:
213
- ; RV64ZBKB-NEXT: rev8 a0, a0
214
- ; RV64ZBKB-NEXT: brev8 a0, a0
215
- ; RV64ZBKB-NEXT: slli a0, a0, 33
216
- ; RV64ZBKB-NEXT: rev8 a0, a0
217
- ; RV64ZBKB-NEXT: brev8 a0, a0
132
+ ; RV64ZBKB-NEXT: srli a0, a0, 33
218
133
; RV64ZBKB-NEXT: ret
219
134
%1 = call i64 @llvm.bitreverse.i64 (i64 %a )
220
135
%2 = shl i64 %1 , 33
0 commit comments