1*9c2cb97eSBin Meng /* SPDX-License-Identifier: GPL-2.0 */ 20dd9c7a9SMike Dunn #ifndef _LINUX_BITREV_H 30dd9c7a9SMike Dunn #define _LINUX_BITREV_H 40dd9c7a9SMike Dunn 50dd9c7a9SMike Dunn #include <linux/types.h> 60dd9c7a9SMike Dunn 7*9c2cb97eSBin Meng #ifdef CONFIG_HAVE_ARCH_BITREVERSE 8*9c2cb97eSBin Meng #include <asm/bitrev.h> 90dd9c7a9SMike Dunn 10*9c2cb97eSBin Meng #define __bitrev32 __arch_bitrev32 11*9c2cb97eSBin Meng #define __bitrev16 __arch_bitrev16 12*9c2cb97eSBin Meng #define __bitrev8 __arch_bitrev8 13*9c2cb97eSBin Meng 14*9c2cb97eSBin Meng #else 15*9c2cb97eSBin Meng extern u8 const byte_rev_table[256]; __bitrev8(u8 byte)16*9c2cb97eSBin Mengstatic inline u8 __bitrev8(u8 byte) 170dd9c7a9SMike Dunn { 180dd9c7a9SMike Dunn return byte_rev_table[byte]; 190dd9c7a9SMike Dunn } 200dd9c7a9SMike Dunn __bitrev16(u16 x)21*9c2cb97eSBin Mengstatic inline u16 __bitrev16(u16 x) 22*9c2cb97eSBin Meng { 23*9c2cb97eSBin Meng return (__bitrev8(x & 0xff) << 8) | __bitrev8(x >> 8); 24*9c2cb97eSBin Meng } 250dd9c7a9SMike Dunn __bitrev32(u32 x)26*9c2cb97eSBin Mengstatic inline u32 __bitrev32(u32 x) 27*9c2cb97eSBin Meng { 28*9c2cb97eSBin Meng return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16); 29*9c2cb97eSBin Meng } 30*9c2cb97eSBin Meng 31*9c2cb97eSBin Meng #endif /* CONFIG_HAVE_ARCH_BITREVERSE */ 32*9c2cb97eSBin Meng 33*9c2cb97eSBin Meng #define __bitrev8x4(x) (__bitrev32(swab32(x))) 34*9c2cb97eSBin Meng 35*9c2cb97eSBin Meng #define __constant_bitrev32(x) \ 36*9c2cb97eSBin Meng ({ \ 37*9c2cb97eSBin Meng u32 __x = x; \ 38*9c2cb97eSBin Meng __x = (__x >> 16) | (__x << 16);\ 39*9c2cb97eSBin Meng __x = ((__x & (u32)0xFF00FF00UL) >> 8) | ((__x & (u32)0x00FF00FFUL) << 8); \ 40*9c2cb97eSBin Meng __x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \ 41*9c2cb97eSBin Meng __x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \ 42*9c2cb97eSBin Meng __x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \ 43*9c2cb97eSBin Meng __x; \ 44*9c2cb97eSBin Meng }) 45*9c2cb97eSBin Meng 46*9c2cb97eSBin Meng #define __constant_bitrev16(x) \ 47*9c2cb97eSBin Meng ({ \ 48*9c2cb97eSBin Meng u16 __x = x; \ 49*9c2cb97eSBin Meng __x = (__x >> 8) | (__x << 8); \ 50*9c2cb97eSBin Meng __x = ((__x & (u16)0xF0F0U) >> 4) | ((__x & (u16)0x0F0FU) << 4); \ 51*9c2cb97eSBin Meng __x = ((__x & (u16)0xCCCCU) >> 2) | ((__x & (u16)0x3333U) << 2); \ 52*9c2cb97eSBin Meng __x = ((__x & (u16)0xAAAAU) >> 1) | ((__x & (u16)0x5555U) << 1); \ 53*9c2cb97eSBin Meng __x; \ 54*9c2cb97eSBin Meng }) 55*9c2cb97eSBin Meng 56*9c2cb97eSBin Meng #define __constant_bitrev8x4(x) \ 57*9c2cb97eSBin Meng ({ \ 58*9c2cb97eSBin Meng u32 __x = x; \ 59*9c2cb97eSBin Meng __x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \ 60*9c2cb97eSBin Meng __x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \ 61*9c2cb97eSBin Meng __x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \ 62*9c2cb97eSBin Meng __x; \ 63*9c2cb97eSBin Meng }) 64*9c2cb97eSBin Meng 65*9c2cb97eSBin Meng #define __constant_bitrev8(x) \ 66*9c2cb97eSBin Meng ({ \ 67*9c2cb97eSBin Meng u8 __x = x; \ 68*9c2cb97eSBin Meng __x = (__x >> 4) | (__x << 4); \ 69*9c2cb97eSBin Meng __x = ((__x & (u8)0xCCU) >> 2) | ((__x & (u8)0x33U) << 2); \ 70*9c2cb97eSBin Meng __x = ((__x & (u8)0xAAU) >> 1) | ((__x & (u8)0x55U) << 1); \ 71*9c2cb97eSBin Meng __x; \ 72*9c2cb97eSBin Meng }) 73*9c2cb97eSBin Meng 74*9c2cb97eSBin Meng #define bitrev32(x) \ 75*9c2cb97eSBin Meng ({ \ 76*9c2cb97eSBin Meng u32 __x = x; \ 77*9c2cb97eSBin Meng __builtin_constant_p(__x) ? \ 78*9c2cb97eSBin Meng __constant_bitrev32(__x) : \ 79*9c2cb97eSBin Meng __bitrev32(__x); \ 80*9c2cb97eSBin Meng }) 81*9c2cb97eSBin Meng 82*9c2cb97eSBin Meng #define bitrev16(x) \ 83*9c2cb97eSBin Meng ({ \ 84*9c2cb97eSBin Meng u16 __x = x; \ 85*9c2cb97eSBin Meng __builtin_constant_p(__x) ? \ 86*9c2cb97eSBin Meng __constant_bitrev16(__x) : \ 87*9c2cb97eSBin Meng __bitrev16(__x); \ 88*9c2cb97eSBin Meng }) 89*9c2cb97eSBin Meng 90*9c2cb97eSBin Meng #define bitrev8x4(x) \ 91*9c2cb97eSBin Meng ({ \ 92*9c2cb97eSBin Meng u32 __x = x; \ 93*9c2cb97eSBin Meng __builtin_constant_p(__x) ? \ 94*9c2cb97eSBin Meng __constant_bitrev8x4(__x) : \ 95*9c2cb97eSBin Meng __bitrev8x4(__x); \ 96*9c2cb97eSBin Meng }) 97*9c2cb97eSBin Meng 98*9c2cb97eSBin Meng #define bitrev8(x) \ 99*9c2cb97eSBin Meng ({ \ 100*9c2cb97eSBin Meng u8 __x = x; \ 101*9c2cb97eSBin Meng __builtin_constant_p(__x) ? \ 102*9c2cb97eSBin Meng __constant_bitrev8(__x) : \ 103*9c2cb97eSBin Meng __bitrev8(__x) ; \ 104*9c2cb97eSBin Meng }) 1050dd9c7a9SMike Dunn #endif /* _LINUX_BITREV_H */ 106