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