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