From: Nathan Moinvaziri Date: Mon, 26 Jan 2026 08:35:21 +0000 (-0800) Subject: Cleanup and rename bitreverse16 after ctz builtin refactoring X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f83e189ab5857abb1d83412bc1f03081789c1853;p=thirdparty%2Fzlib-ng.git Cleanup and rename bitreverse16 after ctz builtin refactoring --- diff --git a/deflate_p.h b/deflate_p.h index 7b5d56019..f7aea7eec 100644 --- a/deflate_p.h +++ b/deflate_p.h @@ -132,7 +132,7 @@ Z_FORCEINLINE static uint16_t bi_reverse(uint16_t code, int len) { /* 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); } /* =========================================================================== diff --git a/fallback_builtins.h b/fallback_builtins.h index 8ccd04e04..e83b9752a 100644 --- a/fallback_builtins.h +++ b/fallback_builtins.h @@ -67,11 +67,11 @@ Z_FORCEINLINE static uint32_t zng_ctz64(uint64_t value) { #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); @@ -79,26 +79,19 @@ Z_FORCEINLINE static uint16_t __builtin_bitreverse16(uint16_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 diff --git a/inftrees.c b/inftrees.c index 5151ff459..00f142157 100644 --- a/inftrees.c +++ b/inftrees.c @@ -315,7 +315,7 @@ int Z_INTERNAL zng_inflate_table(codetype type, uint16_t *lens, unsigned codes, /* 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++;