0001
0002 #ifndef _LINUX_BITREV_H
0003 #define _LINUX_BITREV_H
0004
0005 #include <linux/types.h>
0006
0007 #ifdef CONFIG_HAVE_ARCH_BITREVERSE
0008 #include <asm/bitrev.h>
0009
0010 #define __bitrev32 __arch_bitrev32
0011 #define __bitrev16 __arch_bitrev16
0012 #define __bitrev8 __arch_bitrev8
0013
0014 #else
0015 extern u8 const byte_rev_table[256];
0016 static inline u8 __bitrev8(u8 byte)
0017 {
0018 return byte_rev_table[byte];
0019 }
0020
0021 static inline u16 __bitrev16(u16 x)
0022 {
0023 return (__bitrev8(x & 0xff) << 8) | __bitrev8(x >> 8);
0024 }
0025
0026 static inline u32 __bitrev32(u32 x)
0027 {
0028 return (__bitrev16(x & 0xffff) << 16) | __bitrev16(x >> 16);
0029 }
0030
0031 #endif
0032
0033 #define __bitrev8x4(x) (__bitrev32(swab32(x)))
0034
0035 #define __constant_bitrev32(x) \
0036 ({ \
0037 u32 ___x = x; \
0038 ___x = (___x >> 16) | (___x << 16); \
0039 ___x = ((___x & (u32)0xFF00FF00UL) >> 8) | ((___x & (u32)0x00FF00FFUL) << 8); \
0040 ___x = ((___x & (u32)0xF0F0F0F0UL) >> 4) | ((___x & (u32)0x0F0F0F0FUL) << 4); \
0041 ___x = ((___x & (u32)0xCCCCCCCCUL) >> 2) | ((___x & (u32)0x33333333UL) << 2); \
0042 ___x = ((___x & (u32)0xAAAAAAAAUL) >> 1) | ((___x & (u32)0x55555555UL) << 1); \
0043 ___x; \
0044 })
0045
0046 #define __constant_bitrev16(x) \
0047 ({ \
0048 u16 ___x = x; \
0049 ___x = (___x >> 8) | (___x << 8); \
0050 ___x = ((___x & (u16)0xF0F0U) >> 4) | ((___x & (u16)0x0F0FU) << 4); \
0051 ___x = ((___x & (u16)0xCCCCU) >> 2) | ((___x & (u16)0x3333U) << 2); \
0052 ___x = ((___x & (u16)0xAAAAU) >> 1) | ((___x & (u16)0x5555U) << 1); \
0053 ___x; \
0054 })
0055
0056 #define __constant_bitrev8x4(x) \
0057 ({ \
0058 u32 ___x = x; \
0059 ___x = ((___x & (u32)0xF0F0F0F0UL) >> 4) | ((___x & (u32)0x0F0F0F0FUL) << 4); \
0060 ___x = ((___x & (u32)0xCCCCCCCCUL) >> 2) | ((___x & (u32)0x33333333UL) << 2); \
0061 ___x = ((___x & (u32)0xAAAAAAAAUL) >> 1) | ((___x & (u32)0x55555555UL) << 1); \
0062 ___x; \
0063 })
0064
0065 #define __constant_bitrev8(x) \
0066 ({ \
0067 u8 ___x = x; \
0068 ___x = (___x >> 4) | (___x << 4); \
0069 ___x = ((___x & (u8)0xCCU) >> 2) | ((___x & (u8)0x33U) << 2); \
0070 ___x = ((___x & (u8)0xAAU) >> 1) | ((___x & (u8)0x55U) << 1); \
0071 ___x; \
0072 })
0073
0074 #define bitrev32(x) \
0075 ({ \
0076 u32 __x = x; \
0077 __builtin_constant_p(__x) ? \
0078 __constant_bitrev32(__x) : \
0079 __bitrev32(__x); \
0080 })
0081
0082 #define bitrev16(x) \
0083 ({ \
0084 u16 __x = x; \
0085 __builtin_constant_p(__x) ? \
0086 __constant_bitrev16(__x) : \
0087 __bitrev16(__x); \
0088 })
0089
0090 #define bitrev8x4(x) \
0091 ({ \
0092 u32 __x = x; \
0093 __builtin_constant_p(__x) ? \
0094 __constant_bitrev8x4(__x) : \
0095 __bitrev8x4(__x); \
0096 })
0097
0098 #define bitrev8(x) \
0099 ({ \
0100 u8 __x = x; \
0101 __builtin_constant_p(__x) ? \
0102 __constant_bitrev8(__x) : \
0103 __bitrev8(__x) ; \
0104 })
0105 #endif