1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \
3 ; RUN: | FileCheck %s -check-prefixes=RV32ZBKB
4 ; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
5 ; RUN: | FileCheck %s -check-prefixes=RV64ZBKB
7 ; TODO: These tests can be optmised
8 ; fold (bitreverse(srl (bitreverse c), x)) -> (shl c, x)
9 ; fold (bitreverse(shl (bitreverse c), x)) -> (srl c, x)
11 declare i8 @llvm.bitreverse.i8(i8)
12 declare i16 @llvm.bitreverse.i16(i16)
13 declare i32 @llvm.bitreverse.i32(i32)
14 declare i64 @llvm.bitreverse.i64(i64)
16 define i8 @test_bitreverse_srli_bitreverse_i8(i8 %a) nounwind {
17 ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i8:
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
27 ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i8:
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
36 %1 = call i8 @llvm.bitreverse.i8(i8 %a)
38 %3 = call i8 @llvm.bitreverse.i8(i8 %2)
42 define i16 @test_bitreverse_srli_bitreverse_i16(i16 %a) nounwind {
43 ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i16:
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
53 ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i16:
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
62 %1 = call i16 @llvm.bitreverse.i16(i16 %a)
64 %3 = call i16 @llvm.bitreverse.i16(i16 %2)
68 define i32 @test_bitreverse_srli_bitreverse_i32(i32 %a) nounwind {
69 ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
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
78 ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i32:
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
87 %1 = call i32 @llvm.bitreverse.i32(i32 %a)
89 %3 = call i32 @llvm.bitreverse.i32(i32 %2)
93 define i64 @test_bitreverse_srli_bitreverse_i64(i64 %a) nounwind {
94 ; RV32ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
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
101 ; RV32ZBKB-NEXT: li a0, 0
104 ; RV64ZBKB-LABEL: test_bitreverse_srli_bitreverse_i64:
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
112 %1 = call i64 @llvm.bitreverse.i64(i64 %a)
114 %3 = call i64 @llvm.bitreverse.i64(i64 %2)
118 define i8 @test_bitreverse_shli_bitreverse_i8(i8 %a) nounwind {
119 ; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
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
130 ; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i8:
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
140 %1 = call i8 @llvm.bitreverse.i8(i8 %a)
142 %3 = call i8 @llvm.bitreverse.i8(i8 %2)
146 define i16 @test_bitreverse_shli_bitreverse_i16(i16 %a) nounwind {
147 ; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
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
158 ; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i16:
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
168 %1 = call i16 @llvm.bitreverse.i16(i16 %a)
170 %3 = call i16 @llvm.bitreverse.i16(i16 %2)
174 define i32 @test_bitreverse_shli_bitreverse_i32(i32 %a) nounwind {
175 ; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
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
184 ; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i32:
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
194 %1 = call i32 @llvm.bitreverse.i32(i32 %a)
196 %3 = call i32 @llvm.bitreverse.i32(i32 %2)
200 define i64 @test_bitreverse_shli_bitreverse_i64(i64 %a) nounwind {
201 ; RV32ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
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
208 ; RV32ZBKB-NEXT: li a1, 0
211 ; RV64ZBKB-LABEL: test_bitreverse_shli_bitreverse_i64:
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
219 %1 = call i64 @llvm.bitreverse.i64(i64 %a)
221 %3 = call i64 @llvm.bitreverse.i64(i64 %2)