1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2a5cfc1ecSAkinobu Mita #ifndef _LINUX_BITREV_H 3a5cfc1ecSAkinobu Mita #define _LINUX_BITREV_H 4a5cfc1ecSAkinobu Mita 5a5cfc1ecSAkinobu Mita #include <linux/types.h> 6a5cfc1ecSAkinobu Mita 7556d2f05SYalin Wang #ifdef CONFIG_HAVE_ARCH_BITREVERSE 8556d2f05SYalin Wang #include <asm/bitrev.h> 9a5cfc1ecSAkinobu Mita 10556d2f05SYalin Wang #define __bitrev32 __arch_bitrev32 11556d2f05SYalin Wang #define __bitrev16 __arch_bitrev16 12556d2f05SYalin Wang #define __bitrev8 __arch_bitrev8 13556d2f05SYalin Wang 14556d2f05SYalin Wang #else 15556d2f05SYalin Wang extern u8 const byte_rev_table[256]; __bitrev8(u8 byte)16556d2f05SYalin Wangstatic inline u8 __bitrev8(u8 byte) 17a5cfc1ecSAkinobu Mita { 18a5cfc1ecSAkinobu Mita return byte_rev_table[byte]; 19a5cfc1ecSAkinobu Mita } 20a5cfc1ecSAkinobu Mita __bitrev16(u16 x)21556d2f05SYalin Wangstatic inline u16 __bitrev16(u16 x) 22556d2f05SYalin Wang { 23556d2f05SYalin Wang return (__bitrev8(x & 0xff) << 8) | __bitrev8(x >> 8); 24556d2f05SYalin Wang } 25a5cfc1ecSAkinobu Mita __bitrev32(u32 x)26556d2f05SYalin Wangstatic inline u32 __bitrev32(u32 x) 27556d2f05SYalin Wang { 28556d2f05SYalin Wang return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16); 29556d2f05SYalin Wang } 30556d2f05SYalin Wang 31556d2f05SYalin Wang #endif /* CONFIG_HAVE_ARCH_BITREVERSE */ 32556d2f05SYalin Wang 333b88da4aSJoshua Clayton #define __bitrev8x4(x) (__bitrev32(swab32(x))) 343b88da4aSJoshua Clayton 35556d2f05SYalin Wang #define __constant_bitrev32(x) \ 36556d2f05SYalin Wang ({ \ 376147e136SArnd Bergmann u32 ___x = x; \ 386147e136SArnd Bergmann ___x = (___x >> 16) | (___x << 16); \ 396147e136SArnd Bergmann ___x = ((___x & (u32)0xFF00FF00UL) >> 8) | ((___x & (u32)0x00FF00FFUL) << 8); \ 406147e136SArnd Bergmann ___x = ((___x & (u32)0xF0F0F0F0UL) >> 4) | ((___x & (u32)0x0F0F0F0FUL) << 4); \ 416147e136SArnd Bergmann ___x = ((___x & (u32)0xCCCCCCCCUL) >> 2) | ((___x & (u32)0x33333333UL) << 2); \ 426147e136SArnd Bergmann ___x = ((___x & (u32)0xAAAAAAAAUL) >> 1) | ((___x & (u32)0x55555555UL) << 1); \ 436147e136SArnd Bergmann ___x; \ 44556d2f05SYalin Wang }) 45556d2f05SYalin Wang 46556d2f05SYalin Wang #define __constant_bitrev16(x) \ 47556d2f05SYalin Wang ({ \ 486147e136SArnd Bergmann u16 ___x = x; \ 496147e136SArnd Bergmann ___x = (___x >> 8) | (___x << 8); \ 506147e136SArnd Bergmann ___x = ((___x & (u16)0xF0F0U) >> 4) | ((___x & (u16)0x0F0FU) << 4); \ 516147e136SArnd Bergmann ___x = ((___x & (u16)0xCCCCU) >> 2) | ((___x & (u16)0x3333U) << 2); \ 526147e136SArnd Bergmann ___x = ((___x & (u16)0xAAAAU) >> 1) | ((___x & (u16)0x5555U) << 1); \ 536147e136SArnd Bergmann ___x; \ 54556d2f05SYalin Wang }) 55556d2f05SYalin Wang 563b88da4aSJoshua Clayton #define __constant_bitrev8x4(x) \ 573b88da4aSJoshua Clayton ({ \ 586147e136SArnd Bergmann u32 ___x = x; \ 596147e136SArnd Bergmann ___x = ((___x & (u32)0xF0F0F0F0UL) >> 4) | ((___x & (u32)0x0F0F0F0FUL) << 4); \ 606147e136SArnd Bergmann ___x = ((___x & (u32)0xCCCCCCCCUL) >> 2) | ((___x & (u32)0x33333333UL) << 2); \ 616147e136SArnd Bergmann ___x = ((___x & (u32)0xAAAAAAAAUL) >> 1) | ((___x & (u32)0x55555555UL) << 1); \ 626147e136SArnd Bergmann ___x; \ 633b88da4aSJoshua Clayton }) 643b88da4aSJoshua Clayton 65556d2f05SYalin Wang #define __constant_bitrev8(x) \ 66556d2f05SYalin Wang ({ \ 676147e136SArnd Bergmann u8 ___x = x; \ 686147e136SArnd Bergmann ___x = (___x >> 4) | (___x << 4); \ 696147e136SArnd Bergmann ___x = ((___x & (u8)0xCCU) >> 2) | ((___x & (u8)0x33U) << 2); \ 706147e136SArnd Bergmann ___x = ((___x & (u8)0xAAU) >> 1) | ((___x & (u8)0x55U) << 1); \ 716147e136SArnd Bergmann ___x; \ 72556d2f05SYalin Wang }) 73556d2f05SYalin Wang 74556d2f05SYalin Wang #define bitrev32(x) \ 75556d2f05SYalin Wang ({ \ 76556d2f05SYalin Wang u32 __x = x; \ 77556d2f05SYalin Wang __builtin_constant_p(__x) ? \ 78556d2f05SYalin Wang __constant_bitrev32(__x) : \ 79556d2f05SYalin Wang __bitrev32(__x); \ 80556d2f05SYalin Wang }) 81556d2f05SYalin Wang 82556d2f05SYalin Wang #define bitrev16(x) \ 83556d2f05SYalin Wang ({ \ 84556d2f05SYalin Wang u16 __x = x; \ 85556d2f05SYalin Wang __builtin_constant_p(__x) ? \ 86556d2f05SYalin Wang __constant_bitrev16(__x) : \ 87556d2f05SYalin Wang __bitrev16(__x); \ 88556d2f05SYalin Wang }) 89556d2f05SYalin Wang 903b88da4aSJoshua Clayton #define bitrev8x4(x) \ 913b88da4aSJoshua Clayton ({ \ 923b88da4aSJoshua Clayton u32 __x = x; \ 933b88da4aSJoshua Clayton __builtin_constant_p(__x) ? \ 943b88da4aSJoshua Clayton __constant_bitrev8x4(__x) : \ 953b88da4aSJoshua Clayton __bitrev8x4(__x); \ 963b88da4aSJoshua Clayton }) 973b88da4aSJoshua Clayton 98556d2f05SYalin Wang #define bitrev8(x) \ 99556d2f05SYalin Wang ({ \ 100556d2f05SYalin Wang u8 __x = x; \ 101556d2f05SYalin Wang __builtin_constant_p(__x) ? \ 102556d2f05SYalin Wang __constant_bitrev8(__x) : \ 103556d2f05SYalin Wang __bitrev8(__x) ; \ 104556d2f05SYalin Wang }) 105a5cfc1ecSAkinobu Mita #endif /* _LINUX_BITREV_H */ 106