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