>       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

Reply via email to