> stdc_memreverse8u: New module. With this done, it is easy to make use of this module:
2026-03-15 Bruno Haible <[email protected]> byteswap: Rely on <stdbit.h>. * lib/byteswap.in.h: Include <stdbit.h>. (_GL_BYTESWAP_HAS_BUILTIN_BSWAP16, _GL_BYTESWAP_HAS_BUILTIN_BSWAP32, _GL_BYTESWAP_HAS_BUILTIN_BSWAP64): Remove macros. (bswap_16): Just call stdc_memreverse8u16. (bswap_32): Just call stdc_memreverse8u32. (bswap_64): Just call stdc_memreverse8u64. * modules/byteswap (Depends-on): Add stdc_memreverse8u. Remove bool. 2026-03-15 Bruno Haible <[email protected]> stdc_load8_aligned, stdc_store8_aligned: Don't use <byteswap.h>. * lib/stdbit.in.h: Don't include <byteswap.h>. (_GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64): Remove macros. (stdc_memreverse8u8, stdc_memreverse8u16, stdc_memreverse8u32, stdc_memreverse8u64): Generalize: Take uint_least* parameter. (stdc_load8_aligned_*, stdc_store8_aligned_*): Use stdc_memreverse8u16, stdc_memreverse8u32, stdc_memreverse8u64 instead of _GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64.
>From 56df4533909e63aea39f3345b0ce9d62bcb31f88 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Sun, 15 Mar 2026 13:24:24 +0100 Subject: [PATCH 1/2] stdc_load8_aligned, stdc_store8_aligned: Don't use <byteswap.h>. * lib/stdbit.in.h: Don't include <byteswap.h>. (_GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64): Remove macros. (stdc_memreverse8u8, stdc_memreverse8u16, stdc_memreverse8u32, stdc_memreverse8u64): Generalize: Take uint_least* parameter. (stdc_load8_aligned_*, stdc_store8_aligned_*): Use stdc_memreverse8u16, stdc_memreverse8u32, stdc_memreverse8u64 instead of _GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64. --- ChangeLog | 12 +++++++ lib/stdbit.in.h | 62 ++++++++++++------------------------- modules/stdc_load8_aligned | 2 +- modules/stdc_store8_aligned | 2 +- 4 files changed, 34 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 190494ebc5..f246cf39a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2026-03-15 Bruno Haible <[email protected]> + + stdc_load8_aligned, stdc_store8_aligned: Don't use <byteswap.h>. + * lib/stdbit.in.h: Don't include <byteswap.h>. + (_GL_STDBIT_BSWAP16, _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64): Remove + macros. + (stdc_memreverse8u8, stdc_memreverse8u16, stdc_memreverse8u32, + stdc_memreverse8u64): Generalize: Take uint_least* parameter. + (stdc_load8_aligned_*, stdc_store8_aligned_*): Use stdc_memreverse8u16, + stdc_memreverse8u32, stdc_memreverse8u64 instead of _GL_STDBIT_BSWAP16, + _GL_STDBIT_BSWAP32, _GL_STDBIT_BSWAP64. + 2026-03-15 Bruno Haible <[email protected]> stdc_memreverse8u: Add tests. diff --git a/lib/stdbit.in.h b/lib/stdbit.in.h index 3443ed4715..65aab488cd 100644 --- a/lib/stdbit.in.h +++ b/lib/stdbit.in.h @@ -74,28 +74,6 @@ #if @GNULIB_STDC_LOAD8_ALIGNED@ || @GNULIB_STDC_STORE8_ALIGNED@ -/* Get bswap_16, bswap_32, bswap_64, but keep namespace clean on GNU. */ -# if ! (defined _GL_STDBIT_HAS_BUILTIN_BSWAP16 \ - && defined _GL_STDBIT_HAS_BUILTIN_BSWAP32 \ - && defined _GL_STDBIT_HAS_BUILTIN_BSWAP64) -# include <byteswap.h> -# endif -# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP16 -# define _GL_STDBIT_BSWAP16(x) __builtin_bswap16 (x) -# else -# define _GL_STDBIT_BSWAP16(x) bswap_16 (x) -# endif -# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP32 -# define _GL_STDBIT_BSWAP32(x) __builtin_bswap32 (x) -# else -# define _GL_STDBIT_BSWAP32(x) bswap_32 (x) -# endif -# ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP64 -# define _GL_STDBIT_BSWAP64(x) __builtin_bswap64 (x) -# else -# define _GL_STDBIT_BSWAP64(x) bswap_64 (x) -# endif - /* Get memcpy, but keep namespace clean on GNU. */ # ifdef __has_builtin # if __has_builtin (__builtin_memcpy) @@ -1177,14 +1155,14 @@ stdc_bit_ceil_ull (unsigned long long int n) #if @GNULIB_STDC_MEMREVERSE8U@ -_GL_STDC_MEMREVERSE8U_INLINE uint8_t -stdc_memreverse8u8 (uint8_t value) +_GL_STDC_MEMREVERSE8U_INLINE uint_least8_t +stdc_memreverse8u8 (uint_least8_t value) { return value; } -_GL_STDC_MEMREVERSE8U_INLINE uint16_t -stdc_memreverse8u16 (uint16_t value) +_GL_STDC_MEMREVERSE8U_INLINE uint_least16_t +stdc_memreverse8u16 (uint_least16_t value) { # ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP16 return __builtin_bswap16 (value); @@ -1195,8 +1173,8 @@ stdc_memreverse8u16 (uint16_t value) # endif } -_GL_STDC_MEMREVERSE8U_INLINE uint32_t -stdc_memreverse8u32 (uint32_t value) +_GL_STDC_MEMREVERSE8U_INLINE uint_least32_t +stdc_memreverse8u32 (uint_least32_t value) { # ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP32 return __builtin_bswap32 (value); @@ -1209,8 +1187,8 @@ stdc_memreverse8u32 (uint32_t value) # endif } -_GL_STDC_MEMREVERSE8U_INLINE uint64_t -stdc_memreverse8u64 (uint64_t value) +_GL_STDC_MEMREVERSE8U_INLINE uint_least64_t +stdc_memreverse8u64 (uint_least64_t value) { # ifdef _GL_STDBIT_HAS_BUILTIN_BSWAP64 return __builtin_bswap64 (value); @@ -1479,7 +1457,7 @@ stdc_load8_aligned_beu16 (const unsigned char ptr[2]) uint_least16_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2); if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP16 (value); + value = stdc_memreverse8u16 (value); return value; } else @@ -1494,7 +1472,7 @@ stdc_load8_aligned_beu32 (const unsigned char ptr[4]) uint_least32_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4); if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP32 (value); + value = stdc_memreverse8u32 (value); return value; } else @@ -1509,7 +1487,7 @@ stdc_load8_aligned_beu64 (const unsigned char ptr[8]) uint_least64_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8); if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP64 (value); + value = stdc_memreverse8u64 (value); return value; } else @@ -1530,7 +1508,7 @@ stdc_load8_aligned_leu16 (const unsigned char ptr[2]) uint_least16_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 2), 2); if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP16 (value); + value = stdc_memreverse8u16 (value); return value; } else @@ -1545,7 +1523,7 @@ stdc_load8_aligned_leu32 (const unsigned char ptr[4]) uint_least32_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 4), 4); if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP32 (value); + value = stdc_memreverse8u32 (value); return value; } else @@ -1560,7 +1538,7 @@ stdc_load8_aligned_leu64 (const unsigned char ptr[8]) uint_least64_t value; _GL_STDBIT_MEMCPY (&value, _GL_STDBIT_ASSUME_ALIGNED (ptr, 8), 8); if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP64 (value); + value = stdc_memreverse8u64 (value); return value; } else @@ -1756,7 +1734,7 @@ stdc_store8_aligned_beu16 (uint_least16_t value, unsigned char ptr[2]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP16 (value); + value = stdc_memreverse8u16 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2); } else @@ -1769,7 +1747,7 @@ stdc_store8_aligned_beu32 (uint_least32_t value, unsigned char ptr[4]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP32 (value); + value = stdc_memreverse8u32 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4); } else @@ -1782,7 +1760,7 @@ stdc_store8_aligned_beu64 (uint_least64_t value, unsigned char ptr[8]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (!_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP64 (value); + value = stdc_memreverse8u64 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8); } else @@ -1801,7 +1779,7 @@ stdc_store8_aligned_leu16 (uint_least16_t value, unsigned char ptr[2]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP16 (value); + value = stdc_memreverse8u16 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 2), &value, 2); } else @@ -1814,7 +1792,7 @@ stdc_store8_aligned_leu32 (uint_least32_t value, unsigned char ptr[4]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP32 (value); + value = stdc_memreverse8u32 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 4), &value, 4); } else @@ -1827,7 +1805,7 @@ stdc_store8_aligned_leu64 (uint_least64_t value, unsigned char ptr[8]) if (_GL_STDBIT_OPTIMIZE_VIA_MEMCPY) { if (_GL_STDBIT_BIGENDIAN) - value = _GL_STDBIT_BSWAP64 (value); + value = stdc_memreverse8u64 (value); _GL_STDBIT_MEMCPY (_GL_STDBIT_ASSUME_ALIGNED (ptr, 8), &value, 8); } else diff --git a/modules/stdc_load8_aligned b/modules/stdc_load8_aligned index 6a9cca24c1..aaf85e894c 100644 --- a/modules/stdc_load8_aligned +++ b/modules/stdc_load8_aligned @@ -8,7 +8,7 @@ Depends-on: stdbit-h stdc_load8 stdint-h -byteswap +stdc_memreverse8u configure.ac: AC_REQUIRE([gl_STDBIT_H]) diff --git a/modules/stdc_store8_aligned b/modules/stdc_store8_aligned index f80625afea..4dba00f5e9 100644 --- a/modules/stdc_store8_aligned +++ b/modules/stdc_store8_aligned @@ -8,7 +8,7 @@ Depends-on: stdbit-h stdc_store8 stdint-h -byteswap +stdc_memreverse8u configure.ac: AC_REQUIRE([gl_STDBIT_H]) -- 2.52.0
>From 7f47771c48945ccb066a0200681b1a9457f8f0c8 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Sun, 15 Mar 2026 13:30:37 +0100 Subject: [PATCH 2/2] byteswap: Rely on <stdbit.h>. * lib/byteswap.in.h: Include <stdbit.h>. (_GL_BYTESWAP_HAS_BUILTIN_BSWAP16, _GL_BYTESWAP_HAS_BUILTIN_BSWAP32, _GL_BYTESWAP_HAS_BUILTIN_BSWAP64): Remove macros. (bswap_16): Just call stdc_memreverse8u16. (bswap_32): Just call stdc_memreverse8u32. (bswap_64): Just call stdc_memreverse8u64. * modules/byteswap (Depends-on): Add stdc_memreverse8u. Remove bool. --- ChangeLog | 11 ++++++++++ lib/byteswap.in.h | 53 ++++------------------------------------------- modules/byteswap | 2 +- 3 files changed, 16 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index f246cf39a7..2c930fe802 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2026-03-15 Bruno Haible <[email protected]> + + byteswap: Rely on <stdbit.h>. + * lib/byteswap.in.h: Include <stdbit.h>. + (_GL_BYTESWAP_HAS_BUILTIN_BSWAP16, _GL_BYTESWAP_HAS_BUILTIN_BSWAP32, + _GL_BYTESWAP_HAS_BUILTIN_BSWAP64): Remove macros. + (bswap_16): Just call stdc_memreverse8u16. + (bswap_32): Just call stdc_memreverse8u32. + (bswap_64): Just call stdc_memreverse8u64. + * modules/byteswap (Depends-on): Add stdc_memreverse8u. Remove bool. + 2026-03-15 Bruno Haible <[email protected]> stdc_load8_aligned, stdc_store8_aligned: Don't use <byteswap.h>. diff --git a/lib/byteswap.in.h b/lib/byteswap.in.h index b2b26af8b0..c7a065c8b7 100644 --- a/lib/byteswap.in.h +++ b/lib/byteswap.in.h @@ -29,6 +29,7 @@ # define _GL_BYTESWAP_INLINE _GL_INLINE #endif +#include <stdbit.h> #include <stdint.h> _GL_INLINE_HEADER_BEGIN @@ -37,38 +38,12 @@ _GL_INLINE_HEADER_BEGIN extern "C" { #endif -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP16 true -#elif defined __has_builtin -# if __has_builtin (__builtin_bswap16) -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP16 true -# endif -#endif - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP32 true -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP64 true -#elif defined __has_builtin -# if __has_builtin (__builtin_bswap32) -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP32 true -# endif -# if __has_builtin (__builtin_bswap64) -# define _GL_BYTESWAP_HAS_BUILTIN_BSWAP64 true -# endif -#endif - /* Given an unsigned 16-bit argument X, return the value corresponding to X with reversed byte order. */ _GL_BYTESWAP_INLINE uint_least16_t bswap_16 (uint_least16_t x) { -#ifdef _GL_BYTESWAP_HAS_BUILTIN_BSWAP16 - return __builtin_bswap16 (x); -#else - uint_fast16_t mask = 0xff; - return ( (x & mask << 8 * 1) >> 8 * 1 - | (x & mask << 8 * 0) << 8 * 1); -#endif + return stdc_memreverse8u16 (x); } /* Given an unsigned 32-bit argument X, return the value corresponding to @@ -76,15 +51,7 @@ bswap_16 (uint_least16_t x) _GL_BYTESWAP_INLINE uint_least32_t bswap_32 (uint_least32_t x) { -#ifdef _GL_BYTESWAP_HAS_BUILTIN_BSWAP32 - return __builtin_bswap32 (x); -#else - uint_fast32_t mask = 0xff; - return ( (x & mask << 8 * 3) >> 8 * 3 - | (x & mask << 8 * 2) >> 8 * 1 - | (x & mask << 8 * 1) << 8 * 1 - | (x & mask << 8 * 0) << 8 * 3); -#endif + return stdc_memreverse8u32 (x); } #ifdef UINT_LEAST64_MAX @@ -93,19 +60,7 @@ bswap_32 (uint_least32_t x) _GL_BYTESWAP_INLINE uint_least64_t bswap_64 (uint_least64_t x) { -# ifdef _GL_BYTESWAP_HAS_BUILTIN_BSWAP64 - return __builtin_bswap64 (x); -# else - uint_fast64_t mask = 0xff; - return ( (x & mask << 8 * 7) >> 8 * 7 - | (x & mask << 8 * 6) >> 8 * 5 - | (x & mask << 8 * 5) >> 8 * 3 - | (x & mask << 8 * 4) >> 8 * 1 - | (x & mask << 8 * 3) << 8 * 1 - | (x & mask << 8 * 2) << 8 * 3 - | (x & mask << 8 * 1) << 8 * 5 - | (x & mask << 8 * 0) << 8 * 7); -# endif + return stdc_memreverse8u64 (x); } #endif diff --git a/modules/byteswap b/modules/byteswap index 586fb2edd3..1ce430f983 100644 --- a/modules/byteswap +++ b/modules/byteswap @@ -9,8 +9,8 @@ m4/byteswap.m4 Depends-on: gen-header extern-inline [$GL_GENERATE_BYTESWAP_H] -bool [$GL_GENERATE_BYTESWAP_H] stdint-h [$GL_GENERATE_BYTESWAP_H] +stdc_memreverse8u [$GL_GENERATE_BYTESWAP_H] configure.ac: gl_BYTESWAP -- 2.52.0
