--- nono/lib/bitops.h 2026/04/29 17:05:26 1.1.1.4 +++ nono/lib/bitops.h 2026/04/29 17:05:57 1.1.1.6 @@ -12,24 +12,46 @@ #include "header.h" -#if defined(HAVE___BUILTIN_BITREVERSE8) -#define bitrev(x) __builtin_bitreverse8(x) +#if defined(HAVE___BUILTIN_BITREVERSE8) && \ + defined(HAVE___BUILTIN_BITREVERSE16) && \ + defined(HAVE___BUILTIN_BITREVERSE32) +#define HAVE___BUILTIN_BITREVERSE +#endif + +#if defined(HAVE___BUILTIN_BITREVERSE) +#define bitrev8(x) __builtin_bitreverse8(x) +#define bitrev16(x) __builtin_bitreverse16(x) +#define bitrev32(x) __builtin_bitreverse32(x) #else extern const uint8 bitrev_table[256]; // 8ビットを左右反転する -static inline uint8 -bitrev(uint8 x) +inline uint8 +bitrev8(uint8 x) { return bitrev_table[x]; } + +// 16ビットを左右反転する +inline uint16 +bitrev16(uint16 x) +{ + return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8); +} + +// 32ビットを左右反転する +inline uint32 +bitrev32(uint32 x) +{ + return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16); +} #endif // 左ローテート #if defined(HAVE___BUILTIN_ROTATELEFT32) #define ROL32(a, n) __builtin_rotateleft32(a, n) #else -static inline uint32 +inline uint32 ROL32(uint32 a, int n) { n &= 31; @@ -45,7 +67,7 @@ ROL32(uint32 a, int n) #if defined(HAVE___BUILTIN_ROTATERIGHT32) #define ROR32(a, n) __builtin_rotateright32(a, n) #else -static inline uint32 +inline uint32 ROR32(uint32 a, int n) { n &= 31; @@ -58,7 +80,7 @@ ROR32(uint32 a, int n) #endif // mask で指定したいずれかのビットが 0 -> 1 に変化したら true -static constexpr bool +constexpr bool bit_rising(uint before, uint after, uint mask) { // before が 0 で mask が 1 のビットだけを立てる。 @@ -67,7 +89,7 @@ bit_rising(uint before, uint after, uint } // mask で指定したいずれかのビットが 1 -> 0 に変化したら true -static constexpr bool +constexpr bool bit_falling(uint before, uint after, uint mask) { // before が 1 で mask が 1 のビットだけを立てる。