/* code: the value to invert */
/* len: its bit length */
Assert(len >= 1 && len <= 15, "code length must be 1-15");
- return __builtin_bitreverse16(code) >> (16 - len);
+ return zng_bitreverse16(code) >> (16 - len);
}
/* ===========================================================================
#endif
}
-#if !__has_builtin(__builtin_bitreverse16)
-
-# if defined(ARCH_ARM) && defined(ARCH_64BIT) && !defined(_MSC_VER)
-/* ARM bit reversal for 16-bit values using rbit instruction */
-Z_FORCEINLINE static uint16_t __builtin_bitreverse16(uint16_t value) {
+Z_FORCEINLINE static uint16_t zng_bitreverse16(uint16_t value) {
+#if __has_builtin(__builtin_bitreverse16)
+ return (uint16_t)__builtin_bitreverse16(value);
+#elif defined(ARCH_ARM) && defined(ARCH_64BIT) && !defined(_MSC_VER)
+ /* ARM bit reversal for 16-bit values using rbit instruction */
uint32_t res;
# if __has_builtin(__builtin_rbit)
res = __builtin_rbit((uint32_t)value);
__asm__ volatile("rbit %w0, %w1" : "=r"(res) : "r"((uint32_t)value));
# endif
return (uint16_t)(res >> 16);
-}
-# elif defined(ARCH_LOONGARCH)
-/* LoongArch bit reversal for 16-bit values */
-Z_FORCEINLINE static uint16_t __builtin_bitreverse16(uint16_t value) {
+#elif defined(ARCH_LOONGARCH)
+ /* LoongArch bit reversal for 16-bit values */
uint32_t res;
__asm__ volatile("bitrev.w %0, %1" : "=r"(res) : "r"(value));
return (uint16_t)(res >> 16);
-}
-# else
-/* Bit reversal for 8-bit values using multiplication method */
-# define bitrev8(value) \
+#else
+ /* Bit reversal for 8-bit values using multiplication method */
+# define bitrev8(value) \
(uint8_t)((((uint8_t)(value) * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32)
-
-/* General purpose bit reversal for 16-bit values */
-Z_FORCEINLINE static uint16_t __builtin_bitreverse16(uint16_t value) {
+ /* General purpose bit reversal for 16-bit values */
return ((bitrev8(value >> 8) | (uint16_t)bitrev8(value) << 8));
+# undef bitrev8
+#endif
}
-# undef bitrev8
-# endif
-
-#endif // __builtin_bitreverse16
#endif // include guard FALLBACK_BUILTINS_H
/* backwards increment the len-bit code huff */
rhuff += (0x8000u >> (len - 1));
- huff = __builtin_bitreverse16(rhuff);
+ huff = zng_bitreverse16(rhuff);
/* go to next symbol, update count, len */
sym++;