xref: /llvm-project/llvm/test/CodeGen/RISCV/bswap-bitreverse.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1dcd751b2SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3dcd751b2SCraig Topper; RUN:   | FileCheck %s -check-prefix=RV32I
4dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5dcd751b2SCraig Topper; RUN:   | FileCheck %s -check-prefix=RV64I
6dcd751b2SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \
7d8f929a5SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV32ZB,RV32ZBB
8dcd751b2SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zbb -verify-machineinstrs < %s \
9d8f929a5SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV64ZB,RV64ZBB
103e98ce45SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+zbkb -verify-machineinstrs < %s \
11d8f929a5SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV32ZB,RV32ZBKB
123e98ce45SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
13d8f929a5SCraig Topper; RUN:   | FileCheck %s -check-prefixes=RV64ZB,RV64ZBKB
14dcd751b2SCraig Topper
15dcd751b2SCraig Topperdeclare i16 @llvm.bswap.i16(i16)
16dcd751b2SCraig Topperdeclare i32 @llvm.bswap.i32(i32)
17dcd751b2SCraig Topperdeclare i64 @llvm.bswap.i64(i64)
18dcd751b2SCraig Topperdeclare i8 @llvm.bitreverse.i8(i8)
19dcd751b2SCraig Topperdeclare i16 @llvm.bitreverse.i16(i16)
20dcd751b2SCraig Topperdeclare i32 @llvm.bitreverse.i32(i32)
21dcd751b2SCraig Topperdeclare i64 @llvm.bitreverse.i64(i64)
22dcd751b2SCraig Topper
23dcd751b2SCraig Topperdefine i16 @test_bswap_i16(i16 %a) nounwind {
24dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i16:
25dcd751b2SCraig Topper; RV32I:       # %bb.0:
26dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a0, 8
27dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
28dcd751b2SCraig Topper; RV32I-NEXT:    srli a0, a0, 24
29dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
30dcd751b2SCraig Topper; RV32I-NEXT:    ret
31dcd751b2SCraig Topper;
32dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i16:
33dcd751b2SCraig Topper; RV64I:       # %bb.0:
34dcd751b2SCraig Topper; RV64I-NEXT:    slli a1, a0, 8
35dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
36dcd751b2SCraig Topper; RV64I-NEXT:    srli a0, a0, 56
37dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
38dcd751b2SCraig Topper; RV64I-NEXT:    ret
39dcd751b2SCraig Topper;
40dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i16:
41dcd751b2SCraig Topper; RV32ZB:       # %bb.0:
42dcd751b2SCraig Topper; RV32ZB-NEXT:    rev8 a0, a0
43dcd751b2SCraig Topper; RV32ZB-NEXT:    srli a0, a0, 16
44dcd751b2SCraig Topper; RV32ZB-NEXT:    ret
45dcd751b2SCraig Topper;
46dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i16:
47dcd751b2SCraig Topper; RV64ZB:       # %bb.0:
48dcd751b2SCraig Topper; RV64ZB-NEXT:    rev8 a0, a0
49dcd751b2SCraig Topper; RV64ZB-NEXT:    srli a0, a0, 48
50dcd751b2SCraig Topper; RV64ZB-NEXT:    ret
51dcd751b2SCraig Topper  %tmp = call i16 @llvm.bswap.i16(i16 %a)
52dcd751b2SCraig Topper  ret i16 %tmp
53dcd751b2SCraig Topper}
54dcd751b2SCraig Topper
55dcd751b2SCraig Topperdefine i32 @test_bswap_i32(i32 %a) nounwind {
56dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i32:
57dcd751b2SCraig Topper; RV32I:       # %bb.0:
58dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 8
59dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 16
60*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 24
61dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -256
62dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
63f387918dSCraig Topper; RV32I-NEXT:    and a2, a0, a2
64*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a1, a3
65f387918dSCraig Topper; RV32I-NEXT:    slli a2, a2, 8
66dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
6786eff6beSPhilip Reames; RV32I-NEXT:    or a0, a0, a2
68dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a0, a1
69dcd751b2SCraig Topper; RV32I-NEXT:    ret
70dcd751b2SCraig Topper;
71dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i32:
72dcd751b2SCraig Topper; RV64I:       # %bb.0:
7369d5a038SSimon Pilgrim; RV64I-NEXT:    srli a1, a0, 8
74dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 16
75*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a0, 24
76dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -256
77dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
78f387918dSCraig Topper; RV64I-NEXT:    and a2, a0, a2
79*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
80f387918dSCraig Topper; RV64I-NEXT:    slli a2, a2, 8
81dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 24
8286eff6beSPhilip Reames; RV64I-NEXT:    or a0, a0, a2
83dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a0, a1
84dcd751b2SCraig Topper; RV64I-NEXT:    ret
85dcd751b2SCraig Topper;
86dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i32:
87dcd751b2SCraig Topper; RV32ZB:       # %bb.0:
88dcd751b2SCraig Topper; RV32ZB-NEXT:    rev8 a0, a0
89dcd751b2SCraig Topper; RV32ZB-NEXT:    ret
90dcd751b2SCraig Topper;
91dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i32:
92dcd751b2SCraig Topper; RV64ZB:       # %bb.0:
93dcd751b2SCraig Topper; RV64ZB-NEXT:    rev8 a0, a0
94dcd751b2SCraig Topper; RV64ZB-NEXT:    srli a0, a0, 32
95dcd751b2SCraig Topper; RV64ZB-NEXT:    ret
96dcd751b2SCraig Topper  %tmp = call i32 @llvm.bswap.i32(i32 %a)
97dcd751b2SCraig Topper  ret i32 %tmp
98dcd751b2SCraig Topper}
99dcd751b2SCraig Topper
100dcd751b2SCraig Topperdefine i64 @test_bswap_i64(i64 %a) nounwind {
101dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_i64:
102dcd751b2SCraig Topper; RV32I:       # %bb.0:
103dcd751b2SCraig Topper; RV32I-NEXT:    srli a2, a1, 8
104dcd751b2SCraig Topper; RV32I-NEXT:    lui a3, 16
105*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a1, 24
106*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a0, 8
107dcd751b2SCraig Topper; RV32I-NEXT:    addi a3, a3, -256
108dcd751b2SCraig Topper; RV32I-NEXT:    and a2, a2, a3
109dcd751b2SCraig Topper; RV32I-NEXT:    or a2, a2, a4
110f387918dSCraig Topper; RV32I-NEXT:    srli a4, a0, 24
111*9122c523SPengcheng Wang; RV32I-NEXT:    and a5, a5, a3
112*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a5, a4
113*9122c523SPengcheng Wang; RV32I-NEXT:    slli a5, a1, 24
114*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
115*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 8
116*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a5, a1
117f387918dSCraig Topper; RV32I-NEXT:    and a3, a0, a3
118dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
119*9122c523SPengcheng Wang; RV32I-NEXT:    slli a3, a3, 8
120*9122c523SPengcheng Wang; RV32I-NEXT:    or a3, a0, a3
121*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a1, a2
122*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a4
123dcd751b2SCraig Topper; RV32I-NEXT:    ret
124dcd751b2SCraig Topper;
125dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_i64:
126dcd751b2SCraig Topper; RV64I:       # %bb.0:
127f387918dSCraig Topper; RV64I-NEXT:    srli a1, a0, 40
128f387918dSCraig Topper; RV64I-NEXT:    lui a2, 16
129*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 56
130*9122c523SPengcheng Wang; RV64I-NEXT:    srli a4, a0, 24
131*9122c523SPengcheng Wang; RV64I-NEXT:    lui a5, 4080
132f387918dSCraig Topper; RV64I-NEXT:    addiw a2, a2, -256
133f387918dSCraig Topper; RV64I-NEXT:    and a1, a1, a2
134f387918dSCraig Topper; RV64I-NEXT:    or a1, a1, a3
135*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 8
136*9122c523SPengcheng Wang; RV64I-NEXT:    and a4, a4, a5
137*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a3, 24
138*9122c523SPengcheng Wang; RV64I-NEXT:    slli a3, a3, 24
139*9122c523SPengcheng Wang; RV64I-NEXT:    or a3, a3, a4
140*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a4, a0, 24
141*9122c523SPengcheng Wang; RV64I-NEXT:    and a5, a0, a5
142f387918dSCraig Topper; RV64I-NEXT:    and a2, a0, a2
143f387918dSCraig Topper; RV64I-NEXT:    slli a0, a0, 56
144*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a4, 32
145*9122c523SPengcheng Wang; RV64I-NEXT:    slli a5, a5, 24
146*9122c523SPengcheng Wang; RV64I-NEXT:    or a4, a5, a4
147*9122c523SPengcheng Wang; RV64I-NEXT:    slli a2, a2, 40
148*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a3, a1
14986eff6beSPhilip Reames; RV64I-NEXT:    or a0, a0, a2
150*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a4
151f387918dSCraig Topper; RV64I-NEXT:    or a0, a0, a1
152dcd751b2SCraig Topper; RV64I-NEXT:    ret
153dcd751b2SCraig Topper;
154dcd751b2SCraig Topper; RV32ZB-LABEL: test_bswap_i64:
155dcd751b2SCraig Topper; RV32ZB:       # %bb.0:
156dcd751b2SCraig Topper; RV32ZB-NEXT:    rev8 a2, a1
157dcd751b2SCraig Topper; RV32ZB-NEXT:    rev8 a1, a0
158dcd751b2SCraig Topper; RV32ZB-NEXT:    mv a0, a2
159dcd751b2SCraig Topper; RV32ZB-NEXT:    ret
160dcd751b2SCraig Topper;
161dcd751b2SCraig Topper; RV64ZB-LABEL: test_bswap_i64:
162dcd751b2SCraig Topper; RV64ZB:       # %bb.0:
163dcd751b2SCraig Topper; RV64ZB-NEXT:    rev8 a0, a0
164dcd751b2SCraig Topper; RV64ZB-NEXT:    ret
165dcd751b2SCraig Topper  %tmp = call i64 @llvm.bswap.i64(i64 %a)
166dcd751b2SCraig Topper  ret i64 %tmp
167dcd751b2SCraig Topper}
168dcd751b2SCraig Topper
169dcd751b2SCraig Topperdefine i8 @test_bitreverse_i8(i8 %a) nounwind {
170dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i8:
171dcd751b2SCraig Topper; RV32I:       # %bb.0:
172dcd751b2SCraig Topper; RV32I-NEXT:    andi a1, a0, 15
173dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
174*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 4
175dcd751b2SCraig Topper; RV32I-NEXT:    srli a0, a0, 28
176dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a0, a1
177dcd751b2SCraig Topper; RV32I-NEXT:    andi a1, a0, 51
178dcd751b2SCraig Topper; RV32I-NEXT:    srli a0, a0, 2
179*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 2
180dcd751b2SCraig Topper; RV32I-NEXT:    andi a0, a0, 51
181dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a0, a1
182dcd751b2SCraig Topper; RV32I-NEXT:    andi a1, a0, 85
183dcd751b2SCraig Topper; RV32I-NEXT:    srli a0, a0, 1
184*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 1
185dcd751b2SCraig Topper; RV32I-NEXT:    andi a0, a0, 85
186dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a0, a1
187dcd751b2SCraig Topper; RV32I-NEXT:    ret
188dcd751b2SCraig Topper;
189dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i8:
190dcd751b2SCraig Topper; RV64I:       # %bb.0:
191dcd751b2SCraig Topper; RV64I-NEXT:    andi a1, a0, 15
192dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 56
193*9122c523SPengcheng Wang; RV64I-NEXT:    slli a1, a1, 4
194dcd751b2SCraig Topper; RV64I-NEXT:    srli a0, a0, 60
195dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a0, a1
196dcd751b2SCraig Topper; RV64I-NEXT:    andi a1, a0, 51
197dcd751b2SCraig Topper; RV64I-NEXT:    srli a0, a0, 2
198*9122c523SPengcheng Wang; RV64I-NEXT:    slli a1, a1, 2
199dcd751b2SCraig Topper; RV64I-NEXT:    andi a0, a0, 51
200dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a0, a1
201dcd751b2SCraig Topper; RV64I-NEXT:    andi a1, a0, 85
202dcd751b2SCraig Topper; RV64I-NEXT:    srli a0, a0, 1
203*9122c523SPengcheng Wang; RV64I-NEXT:    slli a1, a1, 1
204dcd751b2SCraig Topper; RV64I-NEXT:    andi a0, a0, 85
205dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a0, a1
206dcd751b2SCraig Topper; RV64I-NEXT:    ret
207dcd751b2SCraig Topper;
208d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i8:
209d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
210d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a1, a0, 15
211d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 24
212*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 4
213d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 28
214d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
215d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a1, a0, 51
216d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 2
217*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 2
218d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a0, a0, 51
219d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
220d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a1, a0, 85
221d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 1
222*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 1
223d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a0, a0, 85
224d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
225d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
226dcd751b2SCraig Topper;
227d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i8:
228d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
229d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a1, a0, 15
230d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 56
231*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a1, a1, 4
232d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 60
233d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a0, a1
234d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a1, a0, 51
235d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 2
236*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a1, a1, 2
237d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a0, a0, 51
238d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a0, a1
239d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a1, a0, 85
240d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 1
241*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a1, a1, 1
242d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a0, a0, 85
243d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a0, a1
244d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
245d8f929a5SCraig Topper;
246d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i8:
247d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
248d8f929a5SCraig Topper; RV32ZBKB-NEXT:    rev8 a0, a0
249d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
250d8f929a5SCraig Topper; RV32ZBKB-NEXT:    srli a0, a0, 24
251d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
252d8f929a5SCraig Topper;
253d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i8:
254d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
255d8f929a5SCraig Topper; RV64ZBKB-NEXT:    rev8 a0, a0
256d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
257d8f929a5SCraig Topper; RV64ZBKB-NEXT:    srli a0, a0, 56
258d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
259dcd751b2SCraig Topper  %tmp = call i8 @llvm.bitreverse.i8(i8 %a)
260dcd751b2SCraig Topper  ret i8 %tmp
261dcd751b2SCraig Topper}
262dcd751b2SCraig Topper
263dcd751b2SCraig Topperdefine i16 @test_bitreverse_i16(i16 %a) nounwind {
264dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i16:
265dcd751b2SCraig Topper; RV32I:       # %bb.0:
266dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a0, 8
267dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
268*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 1
269dcd751b2SCraig Topper; RV32I-NEXT:    srli a0, a0, 24
270*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, -241
271dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
272dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
273dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
274*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
275*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 3
276*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
277dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
278dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
279dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
280dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
281*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
282*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 5
283*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 1365
284dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
285dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
286dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
287dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
288*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
289dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
290dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
291dcd751b2SCraig Topper; RV32I-NEXT:    ret
292dcd751b2SCraig Topper;
293dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i16:
294dcd751b2SCraig Topper; RV64I:       # %bb.0:
295dcd751b2SCraig Topper; RV64I-NEXT:    slli a1, a0, 8
296dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
297*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 1
298dcd751b2SCraig Topper; RV64I-NEXT:    srli a0, a0, 56
299*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, -241
300dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
301dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
302dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
303*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
304*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 3
305*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
306dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 4
307dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
308dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
309dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
310*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
311*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 5
312*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
313dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
314dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
315dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
316dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
317*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
318dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
319dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
320dcd751b2SCraig Topper; RV64I-NEXT:    ret
321dcd751b2SCraig Topper;
322d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i16:
323d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
324d8f929a5SCraig Topper; RV32ZBB-NEXT:    rev8 a0, a0
325*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a1, 15
326*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 12
327*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a1, a1, 240
328*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a2, a1
329*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 3
330d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a0, a0, 20
331*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 819
332d8f929a5SCraig Topper; RV32ZBB-NEXT:    andi a0, a0, -241
333d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a0, a1
334d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 2
335d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
336*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
337*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 5
338*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
339d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
340d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
341d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
342d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
343*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
344d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
345d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
346d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
347dcd751b2SCraig Topper;
348d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i16:
349d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
350d8f929a5SCraig Topper; RV64ZBB-NEXT:    rev8 a0, a0
351*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a1, 15
352*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a2, a0, 44
353*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a1, a1, 240
354*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a2, a1
355*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 3
356d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a0, a0, 52
357*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
358d8f929a5SCraig Topper; RV64ZBB-NEXT:    andi a0, a0, -241
359d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a0, a1
360d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
361d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
362*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
363*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 5
364*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
365d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
366d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
367d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
368d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
369*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
370d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
371d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
372d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
373d8f929a5SCraig Topper;
374d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i16:
375d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
376d8f929a5SCraig Topper; RV32ZBKB-NEXT:    rev8 a0, a0
377d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
378d8f929a5SCraig Topper; RV32ZBKB-NEXT:    srli a0, a0, 16
379d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
380d8f929a5SCraig Topper;
381d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i16:
382d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
383d8f929a5SCraig Topper; RV64ZBKB-NEXT:    rev8 a0, a0
384d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
385d8f929a5SCraig Topper; RV64ZBKB-NEXT:    srli a0, a0, 48
386d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
387dcd751b2SCraig Topper  %tmp = call i16 @llvm.bitreverse.i16(i16 %a)
388dcd751b2SCraig Topper  ret i16 %tmp
389dcd751b2SCraig Topper}
390dcd751b2SCraig Topper
391dcd751b2SCraig Topperdefine i32 @test_bitreverse_i32(i32 %a) nounwind {
392dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i32:
393dcd751b2SCraig Topper; RV32I:       # %bb.0:
394dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 8
395dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 16
396*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 24
397dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -256
398dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
399f387918dSCraig Topper; RV32I-NEXT:    and a2, a0, a2
400dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
401*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a1, a3
402*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 61681
403*9122c523SPengcheng Wang; RV32I-NEXT:    slli a2, a2, 8
40486eff6beSPhilip Reames; RV32I-NEXT:    or a0, a0, a2
405*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 209715
406*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, -241
407dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a0, a1
408dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
409*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a3
410*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
411*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 349525
412*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
413*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, 1365
414dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
415dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
416dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
417dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
418*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
419dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
420dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
421dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
422*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a3
423*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
424dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
425dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
426dcd751b2SCraig Topper; RV32I-NEXT:    ret
427dcd751b2SCraig Topper;
428dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i32:
429dcd751b2SCraig Topper; RV64I:       # %bb.0:
43069d5a038SSimon Pilgrim; RV64I-NEXT:    srli a1, a0, 8
431dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 16
432*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a3, a0, 24
433dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -256
434dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
435f387918dSCraig Topper; RV64I-NEXT:    and a2, a0, a2
436dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 24
437*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a1, a3
438*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 61681
439*9122c523SPengcheng Wang; RV64I-NEXT:    slli a2, a2, 8
44086eff6beSPhilip Reames; RV64I-NEXT:    or a0, a0, a2
441*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
442*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, -241
443dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a0, a1
444dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
445*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a3
446*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
447*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 349525
448*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
449*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 1365
450dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 4
451dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
452dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
453dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
454*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
455dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 2
456dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
457dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
458*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a3
459*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
460dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 1
461dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
462dcd751b2SCraig Topper; RV64I-NEXT:    ret
463dcd751b2SCraig Topper;
464d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i32:
465d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
466d8f929a5SCraig Topper; RV32ZBB-NEXT:    rev8 a0, a0
467*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a1, 61681
468*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 4
469*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a1, a1, -241
470*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a2, a1
471*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a1
472*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a1, 209715
473*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a1, a1, 819
474d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
475*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
476*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 2
477*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a1
478*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a2, a1
479*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 349525
480*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
481d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
482d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
483d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
484d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
485*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
486d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
487d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
488d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
489dcd751b2SCraig Topper;
490d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i32:
491d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
492d8f929a5SCraig Topper; RV64ZBB-NEXT:    rev8 a0, a0
493*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a1, 61681
494*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a2, a0, 36
495*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a1, a1, -241
496*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a2, a1
497d8f929a5SCraig Topper; RV64ZBB-NEXT:    lui a2, 986895
498*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a0, a0, 28
49986240751SPhilip Reames; RV64ZBB-NEXT:    addi a2, a2, 240
500d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
501*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 209715
502*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
503d8f929a5SCraig Topper; RV64ZBB-NEXT:    sext.w a0, a0
504d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
505d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
506d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
507*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
508*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 349525
509*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
510d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 2
511d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
512d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
513d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
514*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
515d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 1
516d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
517d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
518d8f929a5SCraig Topper;
519d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i32:
520d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
521d8f929a5SCraig Topper; RV32ZBKB-NEXT:    rev8 a0, a0
522d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
523d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
524d8f929a5SCraig Topper;
525d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i32:
526d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
527d8f929a5SCraig Topper; RV64ZBKB-NEXT:    rev8 a0, a0
528d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
529d8f929a5SCraig Topper; RV64ZBKB-NEXT:    srli a0, a0, 32
530d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
531dcd751b2SCraig Topper  %tmp = call i32 @llvm.bitreverse.i32(i32 %a)
532dcd751b2SCraig Topper  ret i32 %tmp
533dcd751b2SCraig Topper}
534dcd751b2SCraig Topper
535dcd751b2SCraig Topperdefine i64 @test_bitreverse_i64(i64 %a) nounwind {
536dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_i64:
537dcd751b2SCraig Topper; RV32I:       # %bb.0:
538dcd751b2SCraig Topper; RV32I-NEXT:    srli a2, a1, 8
539dcd751b2SCraig Topper; RV32I-NEXT:    lui a3, 16
540*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a1, 24
541*9122c523SPengcheng Wang; RV32I-NEXT:    slli a5, a1, 24
542*9122c523SPengcheng Wang; RV32I-NEXT:    lui a6, 61681
543*9122c523SPengcheng Wang; RV32I-NEXT:    srli a7, a0, 8
544dcd751b2SCraig Topper; RV32I-NEXT:    addi a3, a3, -256
545dcd751b2SCraig Topper; RV32I-NEXT:    and a2, a2, a3
546dcd751b2SCraig Topper; RV32I-NEXT:    or a2, a2, a4
547*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a0, 24
548*9122c523SPengcheng Wang; RV32I-NEXT:    and a7, a7, a3
549*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a7, a4
550*9122c523SPengcheng Wang; RV32I-NEXT:    lui a7, 209715
551dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a3
552*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 8
553*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a5, a1
554*9122c523SPengcheng Wang; RV32I-NEXT:    lui a5, 349525
555f387918dSCraig Topper; RV32I-NEXT:    and a3, a0, a3
556dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 24
557*9122c523SPengcheng Wang; RV32I-NEXT:    addi a6, a6, -241
558*9122c523SPengcheng Wang; RV32I-NEXT:    addi a7, a7, 819
559*9122c523SPengcheng Wang; RV32I-NEXT:    addi a5, a5, 1365
560*9122c523SPengcheng Wang; RV32I-NEXT:    slli a3, a3, 8
56186eff6beSPhilip Reames; RV32I-NEXT:    or a0, a0, a3
562*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a1, a2
563*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a0, a4
564*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a1, 4
565f387918dSCraig Topper; RV32I-NEXT:    and a1, a1, a6
566*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 4
567f387918dSCraig Topper; RV32I-NEXT:    and a0, a0, a6
568*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a6
569*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 4
570*9122c523SPengcheng Wang; RV32I-NEXT:    and a3, a3, a6
571*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 4
572*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a2, a1
573*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a3, a0
574*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a1, 2
575*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a7
576*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 2
577*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a7
578*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a7
579*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 2
580*9122c523SPengcheng Wang; RV32I-NEXT:    and a3, a3, a7
581*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 2
582*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a2, a1
583*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a3, a0
584*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a1, 1
585*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a5
586*9122c523SPengcheng Wang; RV32I-NEXT:    srli a3, a0, 1
587*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a5
588*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a5
589*9122c523SPengcheng Wang; RV32I-NEXT:    slli a1, a1, 1
590*9122c523SPengcheng Wang; RV32I-NEXT:    and a3, a3, a5
591*9122c523SPengcheng Wang; RV32I-NEXT:    slli a4, a0, 1
592*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a1
593*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a4
594dcd751b2SCraig Topper; RV32I-NEXT:    ret
595dcd751b2SCraig Topper;
596dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_i64:
597dcd751b2SCraig Topper; RV64I:       # %bb.0:
598f387918dSCraig Topper; RV64I-NEXT:    srli a1, a0, 40
599f387918dSCraig Topper; RV64I-NEXT:    lui a2, 16
600*9122c523SPengcheng Wang; RV64I-NEXT:    srli a3, a0, 56
601*9122c523SPengcheng Wang; RV64I-NEXT:    srli a4, a0, 24
602*9122c523SPengcheng Wang; RV64I-NEXT:    lui a5, 4080
603*9122c523SPengcheng Wang; RV64I-NEXT:    srli a6, a0, 8
604*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a7, a0, 24
605*9122c523SPengcheng Wang; RV64I-NEXT:    lui t0, 61681
606f387918dSCraig Topper; RV64I-NEXT:    addiw a2, a2, -256
607f387918dSCraig Topper; RV64I-NEXT:    and a1, a1, a2
608f387918dSCraig Topper; RV64I-NEXT:    or a1, a1, a3
609*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 209715
610*9122c523SPengcheng Wang; RV64I-NEXT:    and a4, a4, a5
611*9122c523SPengcheng Wang; RV64I-NEXT:    srliw a6, a6, 24
612*9122c523SPengcheng Wang; RV64I-NEXT:    slli a6, a6, 24
613*9122c523SPengcheng Wang; RV64I-NEXT:    or a4, a6, a4
614*9122c523SPengcheng Wang; RV64I-NEXT:    lui a6, 349525
615*9122c523SPengcheng Wang; RV64I-NEXT:    and a5, a0, a5
616*9122c523SPengcheng Wang; RV64I-NEXT:    slli a7, a7, 32
617*9122c523SPengcheng Wang; RV64I-NEXT:    addiw t0, t0, -241
618*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 819
619*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a6, a6, 1365
620f387918dSCraig Topper; RV64I-NEXT:    slli a5, a5, 24
621*9122c523SPengcheng Wang; RV64I-NEXT:    or a5, a5, a7
622*9122c523SPengcheng Wang; RV64I-NEXT:    slli a7, t0, 32
623*9122c523SPengcheng Wang; RV64I-NEXT:    add a7, t0, a7
624*9122c523SPengcheng Wang; RV64I-NEXT:    slli t0, a3, 32
625*9122c523SPengcheng Wang; RV64I-NEXT:    add a3, a3, t0
626*9122c523SPengcheng Wang; RV64I-NEXT:    slli t0, a6, 32
627*9122c523SPengcheng Wang; RV64I-NEXT:    add a6, a6, t0
628*9122c523SPengcheng Wang; RV64I-NEXT:    or a1, a4, a1
629f387918dSCraig Topper; RV64I-NEXT:    and a2, a0, a2
630f387918dSCraig Topper; RV64I-NEXT:    slli a0, a0, 56
631*9122c523SPengcheng Wang; RV64I-NEXT:    slli a2, a2, 40
63286eff6beSPhilip Reames; RV64I-NEXT:    or a0, a0, a2
633*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a0, a5
634f387918dSCraig Topper; RV64I-NEXT:    or a0, a0, a1
635dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
636*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a7
637*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a7
638dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 4
639dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
640dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
641*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a3
642*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
643dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
644dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
645dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
646*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a6
647*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a6
648dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
649dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
650dcd751b2SCraig Topper; RV64I-NEXT:    ret
651dcd751b2SCraig Topper;
652d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_i64:
653d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
654d8f929a5SCraig Topper; RV32ZBB-NEXT:    rev8 a1, a1
655*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 61681
656*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a3, 209715
657d8f929a5SCraig Topper; RV32ZBB-NEXT:    rev8 a0, a0
658*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a4, a1, 4
659*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, -241
660*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a0, 4
661*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a4, a4, a2
662*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
663*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a5, a5, a2
664*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a2
665*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 349525
666*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a3, a3, 819
667*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
668*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 4
669d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
670*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a4, a1
671*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a5, a0
672*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a4, a1, 2
673*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a3
674*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a0, 2
675*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a3
676*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a4, a4, a3
677*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 2
678*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a3, a5, a3
679d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
680*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a4, a1
681*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a3, a0
682*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a3, a1, 1
683*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
684*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a4, a0, 1
685*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a2
686*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a3, a3, a2
687*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a1, a1, 1
688*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a4, a2
689*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a4, a0, 1
690*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a3, a1
691*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a2, a4
692d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
693dcd751b2SCraig Topper;
694d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_i64:
695d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
696d8f929a5SCraig Topper; RV64ZBB-NEXT:    rev8 a0, a0
697*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a1, 61681
69838f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    lui a2, 209715
699*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a3, 349525
700*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a1, a1, -241
70138f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    addiw a2, a2, 819
702*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a3, a3, 1365
703*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a1, 32
704*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a1, a1, a4
705*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a2, 32
706*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a2, a2, a4
707*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a3, 32
708*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a3, a3, a4
709*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a4, a0, 4
710*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a4, a4, a1
711*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a1
712*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a0, a0, 4
713*9122c523SPengcheng Wang; RV64ZBB-NEXT:    or a0, a4, a0
714*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a1, a0, 2
71538f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    and a0, a0, a2
716*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
717d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
71838f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
71938f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    srli a1, a0, 1
720*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a3
721*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a3
722d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
72338f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
724d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
725d8f929a5SCraig Topper;
726d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_i64:
727d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
728d8f929a5SCraig Topper; RV32ZBKB-NEXT:    rev8 a1, a1
729*9122c523SPengcheng Wang; RV32ZBKB-NEXT:    rev8 a2, a0
730*9122c523SPengcheng Wang; RV32ZBKB-NEXT:    brev8 a0, a1
731*9122c523SPengcheng Wang; RV32ZBKB-NEXT:    brev8 a1, a2
732d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
733d8f929a5SCraig Topper;
734d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_i64:
735d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
736d8f929a5SCraig Topper; RV64ZBKB-NEXT:    rev8 a0, a0
737d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
738d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
739dcd751b2SCraig Topper  %tmp = call i64 @llvm.bitreverse.i64(i64 %a)
740dcd751b2SCraig Topper  ret i64 %tmp
741dcd751b2SCraig Topper}
742dcd751b2SCraig Topper
743dcd751b2SCraig Topperdefine i16 @test_bswap_bitreverse_i16(i16 %a) nounwind {
744dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i16:
745dcd751b2SCraig Topper; RV32I:       # %bb.0:
746dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
747dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 1
748dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -241
749dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
750dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
751*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 3
752*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
753dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
754dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
755dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
756dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
757*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
758*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 5
759*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 1365
760dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
761dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
762dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
763dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
764*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
765dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
766dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
767dcd751b2SCraig Topper; RV32I-NEXT:    ret
768dcd751b2SCraig Topper;
769dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i16:
770dcd751b2SCraig Topper; RV64I:       # %bb.0:
771dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
772dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 1
773dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -241
774dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
775dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
776*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 3
777*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
778dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 4
779dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
780dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
781dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
782*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
783*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 5
784*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
785dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
786dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
787dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
788dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
789*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
790dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
791dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
792dcd751b2SCraig Topper; RV64I-NEXT:    ret
793dcd751b2SCraig Topper;
794d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i16:
795d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
796d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 4
797d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a2, 1
798d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a2, a2, -241
799d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a2
800d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
801*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 3
802*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 819
803d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
804d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
805d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 2
806d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
807*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
808*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 5
809*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
810d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
811d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
812d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
813d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
814*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
815d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
816d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
817d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
818dcd751b2SCraig Topper;
819d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i16:
820d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
821d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 4
822d8f929a5SCraig Topper; RV64ZBB-NEXT:    lui a2, 1
823d8f929a5SCraig Topper; RV64ZBB-NEXT:    addiw a2, a2, -241
824d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a1, a1, a2
825d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
826*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 3
827*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
828d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 4
829d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
830d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
831d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
832*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
833*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 5
834*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
835d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
836d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
837d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
838d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
839*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
840d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
841d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
842d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
843d8f929a5SCraig Topper;
844d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i16:
845d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
846d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
847d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
848d8f929a5SCraig Topper;
849d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i16:
850d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
851d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
852d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
853dcd751b2SCraig Topper  %tmp = call i16 @llvm.bswap.i16(i16 %a)
854dcd751b2SCraig Topper  %tmp2 = call i16 @llvm.bitreverse.i16(i16 %tmp)
855dcd751b2SCraig Topper  ret i16 %tmp2
856dcd751b2SCraig Topper}
857dcd751b2SCraig Topper
858dcd751b2SCraig Topperdefine i32 @test_bswap_bitreverse_i32(i32 %a) nounwind {
859dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i32:
860dcd751b2SCraig Topper; RV32I:       # %bb.0:
861dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
862dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 61681
863dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -241
864dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
865dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
866*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 209715
867*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
868dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
869dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
870dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
871dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
872*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
873*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 349525
874*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 1365
875dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
876dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
877dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
878dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
879*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
880dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
881dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
882dcd751b2SCraig Topper; RV32I-NEXT:    ret
883dcd751b2SCraig Topper;
884dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i32:
885dcd751b2SCraig Topper; RV64I:       # %bb.0:
886dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
887dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 61681
888dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -241
889dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
890dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
891*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
892*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
893dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 4
894dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
895dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
896dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
897*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
898*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 349525
899*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
900dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 2
901dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
902dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
903dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
904*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
905dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 1
906dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
907dcd751b2SCraig Topper; RV64I-NEXT:    ret
908dcd751b2SCraig Topper;
909d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i32:
910d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
911d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 4
912d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a2, 61681
913d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a2, a2, -241
914d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a2
915d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
916*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 209715
917*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 819
918d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
919d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
920d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 2
921d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
922*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
923*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 349525
924*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
925d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
926d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
927d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
928d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
929*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
930d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
931d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
932d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
933dcd751b2SCraig Topper;
934d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i32:
935d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
936d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 4
937d8f929a5SCraig Topper; RV64ZBB-NEXT:    lui a2, 61681
938d8f929a5SCraig Topper; RV64ZBB-NEXT:    addiw a2, a2, -241
939d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a1, a1, a2
940d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
941*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 209715
942*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
943d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 4
944d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
945d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
946d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
947*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
948*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 349525
949*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
950d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 2
951d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
952d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
953d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
954*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
955d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 1
956d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
957d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
958d8f929a5SCraig Topper;
959d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i32:
960d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
961d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
962d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
963d8f929a5SCraig Topper;
964d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i32:
965d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
966d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
967d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
968dcd751b2SCraig Topper  %tmp = call i32 @llvm.bswap.i32(i32 %a)
969dcd751b2SCraig Topper  %tmp2 = call i32 @llvm.bitreverse.i32(i32 %tmp)
970dcd751b2SCraig Topper  ret i32 %tmp2
971dcd751b2SCraig Topper}
972dcd751b2SCraig Topper
973dcd751b2SCraig Topperdefine i64 @test_bswap_bitreverse_i64(i64 %a) nounwind {
974dcd751b2SCraig Topper; RV32I-LABEL: test_bswap_bitreverse_i64:
975dcd751b2SCraig Topper; RV32I:       # %bb.0:
976dcd751b2SCraig Topper; RV32I-NEXT:    srli a2, a0, 4
977dcd751b2SCraig Topper; RV32I-NEXT:    lui a3, 61681
978*9122c523SPengcheng Wang; RV32I-NEXT:    lui a4, 209715
979*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a1, 4
980dcd751b2SCraig Topper; RV32I-NEXT:    addi a3, a3, -241
981dcd751b2SCraig Topper; RV32I-NEXT:    and a2, a2, a3
982dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a3
983*9122c523SPengcheng Wang; RV32I-NEXT:    and a5, a5, a3
984dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a3
985*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 349525
986*9122c523SPengcheng Wang; RV32I-NEXT:    addi a4, a4, 819
987*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, 1365
988*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 4
989dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 4
990*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
991*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a5, a1
992*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 2
993*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a4
994*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a1, 2
995dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a4
996*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a4
997*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 2
998*9122c523SPengcheng Wang; RV32I-NEXT:    and a4, a5, a4
999dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 2
1000*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
1001*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a4, a1
1002*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 1
1003*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a3
1004*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a1, 1
1005*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
1006*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a3
1007*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 1
1008*9122c523SPengcheng Wang; RV32I-NEXT:    and a3, a4, a3
1009dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 1
1010*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
1011*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
1012dcd751b2SCraig Topper; RV32I-NEXT:    ret
1013dcd751b2SCraig Topper;
1014dcd751b2SCraig Topper; RV64I-LABEL: test_bswap_bitreverse_i64:
1015dcd751b2SCraig Topper; RV64I:       # %bb.0:
1016*9122c523SPengcheng Wang; RV64I-NEXT:    lui a1, 61681
101738f7c7ebSFlorian Mayer; RV64I-NEXT:    lui a2, 209715
1018*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 349525
1019*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a1, -241
102038f7c7ebSFlorian Mayer; RV64I-NEXT:    addiw a2, a2, 819
1021*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 1365
1022*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a1, 32
1023*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a1, a4
1024*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a2, 32
1025*9122c523SPengcheng Wang; RV64I-NEXT:    add a2, a2, a4
1026*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a3, 32
1027*9122c523SPengcheng Wang; RV64I-NEXT:    add a3, a3, a4
1028*9122c523SPengcheng Wang; RV64I-NEXT:    srli a4, a0, 4
1029*9122c523SPengcheng Wang; RV64I-NEXT:    and a4, a4, a1
1030*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a1
1031*9122c523SPengcheng Wang; RV64I-NEXT:    slli a0, a0, 4
1032*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a4, a0
1033*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a0, 2
103438f7c7ebSFlorian Mayer; RV64I-NEXT:    and a0, a0, a2
1035*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1036dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
103738f7c7ebSFlorian Mayer; RV64I-NEXT:    or a0, a1, a0
103838f7c7ebSFlorian Mayer; RV64I-NEXT:    srli a1, a0, 1
1039*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a3
1040*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
1041dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
104238f7c7ebSFlorian Mayer; RV64I-NEXT:    or a0, a1, a0
1043dcd751b2SCraig Topper; RV64I-NEXT:    ret
1044dcd751b2SCraig Topper;
1045d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bswap_bitreverse_i64:
1046d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
1047d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a2, a0, 4
1048d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a3, 61681
1049*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a4, 209715
1050*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a1, 4
1051d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a3, a3, -241
1052d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a2, a2, a3
1053d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a3
1054*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a5, a5, a3
1055d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a3
1056*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a3, 349525
1057*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a4, a4, 819
1058*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a3, a3, 1365
1059*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 4
1060d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 4
1061*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1062*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a5, a1
1063*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 2
1064*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a4
1065*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a1, 2
1066d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a4
1067*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a2, a4
1068*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 2
1069*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a4, a5, a4
1070d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 2
1071*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1072*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a4, a1
1073*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 1
1074*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a3
1075*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a4, a1, 1
1076*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a3
1077*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a2, a3
1078*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 1
1079*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a3, a4, a3
1080d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 1
1081*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1082*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a3, a1
1083d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
1084dcd751b2SCraig Topper;
1085d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bswap_bitreverse_i64:
1086d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
1087*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a1, 61681
108838f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    lui a2, 209715
1089*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a3, 349525
1090*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a1, a1, -241
109138f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    addiw a2, a2, 819
1092*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a3, a3, 1365
1093*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a1, 32
1094*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a1, a1, a4
1095*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a2, 32
1096*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a2, a2, a4
1097*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a3, 32
1098*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a3, a3, a4
1099*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a4, a0, 4
1100*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a4, a4, a1
1101*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a1
1102*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a0, a0, 4
1103*9122c523SPengcheng Wang; RV64ZBB-NEXT:    or a0, a4, a0
1104*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a1, a0, 2
110538f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    and a0, a0, a2
1106*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1107d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
110838f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
110938f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    srli a1, a0, 1
1110*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a3
1111*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a3
1112d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
111338f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
1114d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
1115d8f929a5SCraig Topper;
1116d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bswap_bitreverse_i64:
1117d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
1118d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
1119d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a1, a1
1120d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
1121d8f929a5SCraig Topper;
1122d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bswap_bitreverse_i64:
1123d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
1124d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
1125d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
1126dcd751b2SCraig Topper  %tmp = call i64 @llvm.bswap.i64(i64 %a)
1127dcd751b2SCraig Topper  %tmp2 = call i64 @llvm.bitreverse.i64(i64 %tmp)
1128dcd751b2SCraig Topper  ret i64 %tmp2
1129dcd751b2SCraig Topper}
1130dcd751b2SCraig Topper
1131dcd751b2SCraig Topperdefine i16 @test_bitreverse_bswap_i16(i16 %a) nounwind {
1132dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i16:
1133dcd751b2SCraig Topper; RV32I:       # %bb.0:
1134dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
1135dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 1
1136dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -241
1137dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
1138dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1139*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 3
1140*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
1141dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
1142dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1143dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
1144dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1145*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
1146*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 5
1147*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 1365
1148dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
1149dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1150dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
1151dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1152*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
1153dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
1154dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1155dcd751b2SCraig Topper; RV32I-NEXT:    ret
1156dcd751b2SCraig Topper;
1157dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i16:
1158dcd751b2SCraig Topper; RV64I:       # %bb.0:
1159dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
1160dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 1
1161dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -241
1162dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
1163dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1164*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 3
1165*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
1166dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 4
1167dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1168dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
1169dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1170*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1171*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 5
1172*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
1173dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
1174dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1175dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
1176dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1177*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1178dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
1179dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1180dcd751b2SCraig Topper; RV64I-NEXT:    ret
1181dcd751b2SCraig Topper;
1182d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i16:
1183d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
1184d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 4
1185d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a2, 1
1186d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a2, a2, -241
1187d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a2
1188d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1189*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 3
1190*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 819
1191d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
1192d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1193d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 2
1194d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1195*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
1196*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 5
1197*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
1198d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
1199d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1200d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
1201d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1202*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
1203d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
1204d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1205d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
1206dcd751b2SCraig Topper;
1207d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i16:
1208d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
1209d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 4
1210d8f929a5SCraig Topper; RV64ZBB-NEXT:    lui a2, 1
1211d8f929a5SCraig Topper; RV64ZBB-NEXT:    addiw a2, a2, -241
1212d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a1, a1, a2
1213d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1214*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 3
1215*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
1216d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 4
1217d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1218d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
1219d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1220*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1221*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 5
1222*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
1223d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
1224d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1225d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
1226d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1227*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1228d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
1229d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1230d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
1231d8f929a5SCraig Topper;
1232d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i16:
1233d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
1234d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
1235d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
1236d8f929a5SCraig Topper;
1237d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i16:
1238d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
1239d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
1240d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
1241dcd751b2SCraig Topper  %tmp = call i16 @llvm.bitreverse.i16(i16 %a)
1242dcd751b2SCraig Topper  %tmp2 = call i16 @llvm.bswap.i16(i16 %tmp)
1243dcd751b2SCraig Topper  ret i16 %tmp2
1244dcd751b2SCraig Topper}
1245dcd751b2SCraig Topper
1246dcd751b2SCraig Topperdefine i32 @test_bitreverse_bswap_i32(i32 %a) nounwind {
1247dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i32:
1248dcd751b2SCraig Topper; RV32I:       # %bb.0:
1249dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 4
1250dcd751b2SCraig Topper; RV32I-NEXT:    lui a2, 61681
1251dcd751b2SCraig Topper; RV32I-NEXT:    addi a2, a2, -241
1252dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a2
1253dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1254*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 209715
1255*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 819
1256dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 4
1257dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1258dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 2
1259dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1260*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
1261*9122c523SPengcheng Wang; RV32I-NEXT:    lui a2, 349525
1262*9122c523SPengcheng Wang; RV32I-NEXT:    addi a2, a2, 1365
1263dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 2
1264dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1265dcd751b2SCraig Topper; RV32I-NEXT:    srli a1, a0, 1
1266dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
1267*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a2
1268dcd751b2SCraig Topper; RV32I-NEXT:    slli a0, a0, 1
1269dcd751b2SCraig Topper; RV32I-NEXT:    or a0, a1, a0
1270dcd751b2SCraig Topper; RV32I-NEXT:    ret
1271dcd751b2SCraig Topper;
1272dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i32:
1273dcd751b2SCraig Topper; RV64I:       # %bb.0:
1274dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 4
1275dcd751b2SCraig Topper; RV64I-NEXT:    lui a2, 61681
1276dcd751b2SCraig Topper; RV64I-NEXT:    addiw a2, a2, -241
1277dcd751b2SCraig Topper; RV64I-NEXT:    and a1, a1, a2
1278dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1279*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 209715
1280*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 819
1281dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 4
1282dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1283dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 2
1284dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1285*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1286*9122c523SPengcheng Wang; RV64I-NEXT:    lui a2, 349525
1287*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a2, a2, 1365
1288dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 2
1289dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1290dcd751b2SCraig Topper; RV64I-NEXT:    srli a1, a0, 1
1291dcd751b2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
1292*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1293dcd751b2SCraig Topper; RV64I-NEXT:    slliw a0, a0, 1
1294dcd751b2SCraig Topper; RV64I-NEXT:    or a0, a1, a0
1295dcd751b2SCraig Topper; RV64I-NEXT:    ret
1296dcd751b2SCraig Topper;
1297d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i32:
1298d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
1299d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 4
1300d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a2, 61681
1301d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a2, a2, -241
1302d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a2
1303d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1304*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 209715
1305*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 819
1306d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 4
1307d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1308d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 2
1309d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1310*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
1311*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a2, 349525
1312*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a2, a2, 1365
1313d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 2
1314d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1315d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 1
1316d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a2
1317*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a2
1318d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 1
1319d8f929a5SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
1320d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
1321dcd751b2SCraig Topper;
1322d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i32:
1323d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
1324d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 4
1325d8f929a5SCraig Topper; RV64ZBB-NEXT:    lui a2, 61681
1326d8f929a5SCraig Topper; RV64ZBB-NEXT:    addiw a2, a2, -241
1327d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a1, a1, a2
1328d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1329*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 209715
1330*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 819
1331d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 4
1332d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1333d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 2
1334d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1335*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1336*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a2, 349525
1337*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a2, a2, 1365
1338d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 2
1339d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1340d8f929a5SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 1
1341d8f929a5SCraig Topper; RV64ZBB-NEXT:    and a0, a0, a2
1342*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1343d8f929a5SCraig Topper; RV64ZBB-NEXT:    slliw a0, a0, 1
1344d8f929a5SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
1345d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
1346d8f929a5SCraig Topper;
1347d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i32:
1348d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
1349d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
1350d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
1351d8f929a5SCraig Topper;
1352d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i32:
1353d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
1354d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
1355d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
1356dcd751b2SCraig Topper  %tmp = call i32 @llvm.bitreverse.i32(i32 %a)
1357dcd751b2SCraig Topper  %tmp2 = call i32 @llvm.bswap.i32(i32 %tmp)
1358dcd751b2SCraig Topper  ret i32 %tmp2
1359dcd751b2SCraig Topper}
1360dcd751b2SCraig Topper
1361dcd751b2SCraig Topperdefine i64 @test_bitreverse_bswap_i64(i64 %a) nounwind {
1362dcd751b2SCraig Topper; RV32I-LABEL: test_bitreverse_bswap_i64:
1363dcd751b2SCraig Topper; RV32I:       # %bb.0:
1364dcd751b2SCraig Topper; RV32I-NEXT:    srli a2, a0, 4
1365dcd751b2SCraig Topper; RV32I-NEXT:    lui a3, 61681
1366*9122c523SPengcheng Wang; RV32I-NEXT:    lui a4, 209715
1367*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a1, 4
1368dcd751b2SCraig Topper; RV32I-NEXT:    addi a3, a3, -241
1369dcd751b2SCraig Topper; RV32I-NEXT:    and a2, a2, a3
1370dcd751b2SCraig Topper; RV32I-NEXT:    and a0, a0, a3
1371*9122c523SPengcheng Wang; RV32I-NEXT:    and a5, a5, a3
1372dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a3
1373*9122c523SPengcheng Wang; RV32I-NEXT:    lui a3, 349525
1374*9122c523SPengcheng Wang; RV32I-NEXT:    addi a4, a4, 819
1375*9122c523SPengcheng Wang; RV32I-NEXT:    addi a3, a3, 1365
1376*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 4
1377dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 4
1378*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
1379*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a5, a1
1380*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 2
1381*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a4
1382*9122c523SPengcheng Wang; RV32I-NEXT:    srli a5, a1, 2
1383dcd751b2SCraig Topper; RV32I-NEXT:    and a1, a1, a4
1384*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a4
1385*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 2
1386*9122c523SPengcheng Wang; RV32I-NEXT:    and a4, a5, a4
1387dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 2
1388*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
1389*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a4, a1
1390*9122c523SPengcheng Wang; RV32I-NEXT:    srli a2, a0, 1
1391*9122c523SPengcheng Wang; RV32I-NEXT:    and a0, a0, a3
1392*9122c523SPengcheng Wang; RV32I-NEXT:    srli a4, a1, 1
1393*9122c523SPengcheng Wang; RV32I-NEXT:    and a1, a1, a3
1394*9122c523SPengcheng Wang; RV32I-NEXT:    and a2, a2, a3
1395*9122c523SPengcheng Wang; RV32I-NEXT:    slli a0, a0, 1
1396*9122c523SPengcheng Wang; RV32I-NEXT:    and a3, a4, a3
1397dcd751b2SCraig Topper; RV32I-NEXT:    slli a1, a1, 1
1398*9122c523SPengcheng Wang; RV32I-NEXT:    or a0, a2, a0
1399*9122c523SPengcheng Wang; RV32I-NEXT:    or a1, a3, a1
1400dcd751b2SCraig Topper; RV32I-NEXT:    ret
1401dcd751b2SCraig Topper;
1402dcd751b2SCraig Topper; RV64I-LABEL: test_bitreverse_bswap_i64:
1403dcd751b2SCraig Topper; RV64I:       # %bb.0:
1404*9122c523SPengcheng Wang; RV64I-NEXT:    lui a1, 61681
140538f7c7ebSFlorian Mayer; RV64I-NEXT:    lui a2, 209715
1406*9122c523SPengcheng Wang; RV64I-NEXT:    lui a3, 349525
1407*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a1, a1, -241
140838f7c7ebSFlorian Mayer; RV64I-NEXT:    addiw a2, a2, 819
1409*9122c523SPengcheng Wang; RV64I-NEXT:    addiw a3, a3, 1365
1410*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a1, 32
1411*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a1, a4
1412*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a2, 32
1413*9122c523SPengcheng Wang; RV64I-NEXT:    add a2, a2, a4
1414*9122c523SPengcheng Wang; RV64I-NEXT:    slli a4, a3, 32
1415*9122c523SPengcheng Wang; RV64I-NEXT:    add a3, a3, a4
1416*9122c523SPengcheng Wang; RV64I-NEXT:    srli a4, a0, 4
1417*9122c523SPengcheng Wang; RV64I-NEXT:    and a4, a4, a1
1418*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a1
1419*9122c523SPengcheng Wang; RV64I-NEXT:    slli a0, a0, 4
1420*9122c523SPengcheng Wang; RV64I-NEXT:    or a0, a4, a0
1421*9122c523SPengcheng Wang; RV64I-NEXT:    srli a1, a0, 2
142238f7c7ebSFlorian Mayer; RV64I-NEXT:    and a0, a0, a2
1423*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a2
1424dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 2
142538f7c7ebSFlorian Mayer; RV64I-NEXT:    or a0, a1, a0
142638f7c7ebSFlorian Mayer; RV64I-NEXT:    srli a1, a0, 1
1427*9122c523SPengcheng Wang; RV64I-NEXT:    and a0, a0, a3
1428*9122c523SPengcheng Wang; RV64I-NEXT:    and a1, a1, a3
1429dcd751b2SCraig Topper; RV64I-NEXT:    slli a0, a0, 1
143038f7c7ebSFlorian Mayer; RV64I-NEXT:    or a0, a1, a0
1431dcd751b2SCraig Topper; RV64I-NEXT:    ret
1432dcd751b2SCraig Topper;
1433d8f929a5SCraig Topper; RV32ZBB-LABEL: test_bitreverse_bswap_i64:
1434d8f929a5SCraig Topper; RV32ZBB:       # %bb.0:
1435d8f929a5SCraig Topper; RV32ZBB-NEXT:    srli a2, a0, 4
1436d8f929a5SCraig Topper; RV32ZBB-NEXT:    lui a3, 61681
1437*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a4, 209715
1438*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a1, 4
1439d8f929a5SCraig Topper; RV32ZBB-NEXT:    addi a3, a3, -241
1440d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a2, a2, a3
1441d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a0, a0, a3
1442*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a5, a5, a3
1443d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a3
1444*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lui a3, 349525
1445*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a4, a4, 819
1446*9122c523SPengcheng Wang; RV32ZBB-NEXT:    addi a3, a3, 1365
1447*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 4
1448d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 4
1449*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1450*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a5, a1
1451*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 2
1452*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a4
1453*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a5, a1, 2
1454d8f929a5SCraig Topper; RV32ZBB-NEXT:    and a1, a1, a4
1455*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a2, a4
1456*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 2
1457*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a4, a5, a4
1458d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 2
1459*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1460*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a4, a1
1461*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a2, a0, 1
1462*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a0, a0, a3
1463*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srli a4, a1, 1
1464*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a1, a1, a3
1465*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a2, a2, a3
1466*9122c523SPengcheng Wang; RV32ZBB-NEXT:    slli a0, a0, 1
1467*9122c523SPengcheng Wang; RV32ZBB-NEXT:    and a3, a4, a3
1468d8f929a5SCraig Topper; RV32ZBB-NEXT:    slli a1, a1, 1
1469*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a0, a2, a0
1470*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a1, a3, a1
1471d8f929a5SCraig Topper; RV32ZBB-NEXT:    ret
1472dcd751b2SCraig Topper;
1473d8f929a5SCraig Topper; RV64ZBB-LABEL: test_bitreverse_bswap_i64:
1474d8f929a5SCraig Topper; RV64ZBB:       # %bb.0:
1475*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a1, 61681
147638f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    lui a2, 209715
1477*9122c523SPengcheng Wang; RV64ZBB-NEXT:    lui a3, 349525
1478*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a1, a1, -241
147938f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    addiw a2, a2, 819
1480*9122c523SPengcheng Wang; RV64ZBB-NEXT:    addiw a3, a3, 1365
1481*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a1, 32
1482*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a1, a1, a4
1483*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a2, 32
1484*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a2, a2, a4
1485*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a4, a3, 32
1486*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a3, a3, a4
1487*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a4, a0, 4
1488*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a4, a4, a1
1489*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a1
1490*9122c523SPengcheng Wang; RV64ZBB-NEXT:    slli a0, a0, 4
1491*9122c523SPengcheng Wang; RV64ZBB-NEXT:    or a0, a4, a0
1492*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a1, a0, 2
149338f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    and a0, a0, a2
1494*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a2
1495d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 2
149638f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
149738f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    srli a1, a0, 1
1498*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a0, a0, a3
1499*9122c523SPengcheng Wang; RV64ZBB-NEXT:    and a1, a1, a3
1500d8f929a5SCraig Topper; RV64ZBB-NEXT:    slli a0, a0, 1
150138f7c7ebSFlorian Mayer; RV64ZBB-NEXT:    or a0, a1, a0
1502d8f929a5SCraig Topper; RV64ZBB-NEXT:    ret
1503d8f929a5SCraig Topper;
1504d8f929a5SCraig Topper; RV32ZBKB-LABEL: test_bitreverse_bswap_i64:
1505d8f929a5SCraig Topper; RV32ZBKB:       # %bb.0:
1506d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a0, a0
1507d8f929a5SCraig Topper; RV32ZBKB-NEXT:    brev8 a1, a1
1508d8f929a5SCraig Topper; RV32ZBKB-NEXT:    ret
1509d8f929a5SCraig Topper;
1510d8f929a5SCraig Topper; RV64ZBKB-LABEL: test_bitreverse_bswap_i64:
1511d8f929a5SCraig Topper; RV64ZBKB:       # %bb.0:
1512d8f929a5SCraig Topper; RV64ZBKB-NEXT:    brev8 a0, a0
1513d8f929a5SCraig Topper; RV64ZBKB-NEXT:    ret
1514dcd751b2SCraig Topper  %tmp = call i64 @llvm.bitreverse.i64(i64 %a)
1515dcd751b2SCraig Topper  %tmp2 = call i64 @llvm.bswap.i64(i64 %tmp)
1516dcd751b2SCraig Topper  ret i64 %tmp2
1517dcd751b2SCraig Topper}
151874f6ded4SCraig Topper
151974f6ded4SCraig Topperdefine i32 @pr55484(i32 %0) {
152074f6ded4SCraig Topper; RV32I-LABEL: pr55484:
152174f6ded4SCraig Topper; RV32I:       # %bb.0:
152278739fdbSSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 8
152378739fdbSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
152478739fdbSSimon Pilgrim; RV32I-NEXT:    or a0, a0, a1
152574f6ded4SCraig Topper; RV32I-NEXT:    srai a0, a0, 16
152674f6ded4SCraig Topper; RV32I-NEXT:    ret
152774f6ded4SCraig Topper;
152874f6ded4SCraig Topper; RV64I-LABEL: pr55484:
152974f6ded4SCraig Topper; RV64I:       # %bb.0:
153078739fdbSSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 40
153178739fdbSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
153278739fdbSSimon Pilgrim; RV64I-NEXT:    or a0, a0, a1
153374f6ded4SCraig Topper; RV64I-NEXT:    srai a0, a0, 48
153474f6ded4SCraig Topper; RV64I-NEXT:    ret
153574f6ded4SCraig Topper;
153674f6ded4SCraig Topper; RV32ZBB-LABEL: pr55484:
153774f6ded4SCraig Topper; RV32ZBB:       # %bb.0:
153846eef768SCraig Topper; RV32ZBB-NEXT:    srli a1, a0, 8
153946eef768SCraig Topper; RV32ZBB-NEXT:    slli a0, a0, 8
154046eef768SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
154146eef768SCraig Topper; RV32ZBB-NEXT:    sext.h a0, a0
154274f6ded4SCraig Topper; RV32ZBB-NEXT:    ret
154374f6ded4SCraig Topper;
154474f6ded4SCraig Topper; RV64ZBB-LABEL: pr55484:
154574f6ded4SCraig Topper; RV64ZBB:       # %bb.0:
154646eef768SCraig Topper; RV64ZBB-NEXT:    srli a1, a0, 8
1547d64d3c5aSNitin John Raj; RV64ZBB-NEXT:    slli a0, a0, 8
154846eef768SCraig Topper; RV64ZBB-NEXT:    or a0, a1, a0
154946eef768SCraig Topper; RV64ZBB-NEXT:    sext.h a0, a0
155074f6ded4SCraig Topper; RV64ZBB-NEXT:    ret
155174f6ded4SCraig Topper;
155274f6ded4SCraig Topper; RV32ZBKB-LABEL: pr55484:
155374f6ded4SCraig Topper; RV32ZBKB:       # %bb.0:
155478739fdbSSimon Pilgrim; RV32ZBKB-NEXT:    slli a1, a0, 8
155578739fdbSSimon Pilgrim; RV32ZBKB-NEXT:    slli a0, a0, 24
155678739fdbSSimon Pilgrim; RV32ZBKB-NEXT:    or a0, a0, a1
155774f6ded4SCraig Topper; RV32ZBKB-NEXT:    srai a0, a0, 16
155874f6ded4SCraig Topper; RV32ZBKB-NEXT:    ret
155974f6ded4SCraig Topper;
156074f6ded4SCraig Topper; RV64ZBKB-LABEL: pr55484:
156174f6ded4SCraig Topper; RV64ZBKB:       # %bb.0:
156278739fdbSSimon Pilgrim; RV64ZBKB-NEXT:    slli a1, a0, 40
156378739fdbSSimon Pilgrim; RV64ZBKB-NEXT:    slli a0, a0, 56
156478739fdbSSimon Pilgrim; RV64ZBKB-NEXT:    or a0, a0, a1
156574f6ded4SCraig Topper; RV64ZBKB-NEXT:    srai a0, a0, 48
156674f6ded4SCraig Topper; RV64ZBKB-NEXT:    ret
156774f6ded4SCraig Topper  %2 = lshr i32 %0, 8
156874f6ded4SCraig Topper  %3 = shl i32 %0, 8
156974f6ded4SCraig Topper  %4 = or i32 %2, %3
157074f6ded4SCraig Topper  %5 = trunc i32 %4 to i16
157174f6ded4SCraig Topper  %6 = sext i16 %5 to i32
157274f6ded4SCraig Topper  ret i32 %6
157374f6ded4SCraig Topper}
1574