xref: /linux/arch/riscv/include/asm/bitrev.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1*e8620bd7SJinjie Ruan /* SPDX-License-Identifier: GPL-2.0 */
2*e8620bd7SJinjie Ruan #ifndef __ASM_BITREV_H
3*e8620bd7SJinjie Ruan #define __ASM_BITREV_H
4*e8620bd7SJinjie Ruan 
5*e8620bd7SJinjie Ruan #include <linux/types.h>
6*e8620bd7SJinjie Ruan #include <asm/cpufeature-macros.h>
7*e8620bd7SJinjie Ruan #include <asm/hwcap.h>
8*e8620bd7SJinjie Ruan #include <asm-generic/bitops/__bitrev.h>
9*e8620bd7SJinjie Ruan 
10*e8620bd7SJinjie Ruan static __always_inline __attribute_const__ u32 __arch_bitrev32(u32 x)
11*e8620bd7SJinjie Ruan {
12*e8620bd7SJinjie Ruan 	unsigned long result;
13*e8620bd7SJinjie Ruan 
14*e8620bd7SJinjie Ruan 	if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBKB))
15*e8620bd7SJinjie Ruan 		return generic___bitrev32(x);
16*e8620bd7SJinjie Ruan 
17*e8620bd7SJinjie Ruan 	asm volatile(
18*e8620bd7SJinjie Ruan 		".option push\n"
19*e8620bd7SJinjie Ruan 		".option arch,+zbkb\n"
20*e8620bd7SJinjie Ruan 		"rev8 %0, %1\n"
21*e8620bd7SJinjie Ruan 		"brev8 %0, %0\n"
22*e8620bd7SJinjie Ruan 		".option pop"
23*e8620bd7SJinjie Ruan 		: "=r" (result) : "r" ((long)x)
24*e8620bd7SJinjie Ruan 	);
25*e8620bd7SJinjie Ruan 
26*e8620bd7SJinjie Ruan 	return result >> (__riscv_xlen - 32);
27*e8620bd7SJinjie Ruan }
28*e8620bd7SJinjie Ruan 
29*e8620bd7SJinjie Ruan static __always_inline __attribute_const__ u16 __arch_bitrev16(u16 x)
30*e8620bd7SJinjie Ruan {
31*e8620bd7SJinjie Ruan 	return __arch_bitrev32(x) >> 16;
32*e8620bd7SJinjie Ruan }
33*e8620bd7SJinjie Ruan 
34*e8620bd7SJinjie Ruan static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x)
35*e8620bd7SJinjie Ruan {
36*e8620bd7SJinjie Ruan 	unsigned long result;
37*e8620bd7SJinjie Ruan 
38*e8620bd7SJinjie Ruan 	if (!riscv_has_extension_likely(RISCV_ISA_EXT_ZBKB))
39*e8620bd7SJinjie Ruan 		return generic___bitrev8(x);
40*e8620bd7SJinjie Ruan 
41*e8620bd7SJinjie Ruan 	asm volatile(
42*e8620bd7SJinjie Ruan 		".option push\n"
43*e8620bd7SJinjie Ruan 		".option arch,+zbkb\n"
44*e8620bd7SJinjie Ruan 		"brev8 %0, %1\n"
45*e8620bd7SJinjie Ruan 		".option pop"
46*e8620bd7SJinjie Ruan 		: "=r" (result) : "r" ((long)x)
47*e8620bd7SJinjie Ruan 	);
48*e8620bd7SJinjie Ruan 
49*e8620bd7SJinjie Ruan 	return result;
50*e8620bd7SJinjie Ruan }
51*e8620bd7SJinjie Ruan #endif
52