Deprecate the bitrotate module; it is superseded by C2y’s
stdc_rotate_left and stdc_rotate_right.  In several places, prefer
the C2y functions to doing things by hand.
* lib/arctwo.c (arctwo_encrypt, arctwo_decyrpt):
* lib/hash.c (raw_hasher):
* lib/hashcode-mem.c (hash_pjw_bare):
* lib/hashcode-string1.c (hash_string):
* lib/hashcode-string2.c (hash_pjw):
* lib/hashkey-string.c (hashkey_string_hash):
* lib/mem-hash-map.c (compute_hashval):
* lib/struniq.h (hash):
* tests/test-array_map.c (string_hash):
* tests/test-avltreehash_list.c (string_hash):
* tests/test-hash_map.c (string_hash):
* tests/test-linkedhash_list.c (string_hash):
* tests/test-linkedhash_map.c (string_hash):
* tests/test-rbtreehash_list.c (string_hash):
Use stdbit.h functions, instead of bitrotate.h functions or doing
things by hand.  Include stdbit.h to get them.  Don’t include
bitrotate.h, if it was being included.
* lib/getlocalename_l-unsafe.c, lib/getlocalename_l.c:
* lib/localename.c:
Include stdbit.h, since struniq.h now needs this.
* lib/hashcode-mem.c, lib/hashcode-string2.c, lib/hashkey-string.c:
* lib/struniq.h, tests/test-array_map.c, tests/test-avltreehash_list.c:
* tests/test-hash_map.c, tests/test-linkedhash_list.c:
* tests/test-linkedhash_map.c, tests/test-rbtreehash_list.c:
(SIZE_BITS): Remove; no longer needed.
* modules/array-map-tests, modules/avltreehash-list-tests:
* modules/crypto/arctwo, modules/getlocalename_l-simple:
* modules/getlocalename_l-unsafe, modules/hash:
* modules/hash-map-tests, modules/hashcode-mem:
* modules/hashcode-string1, modules/hashcode-string2:
* modules/hashkey-string, modules/linkedhash-list-tests:
* modules/linkedhash-map-tests, modules/localename:
* modules/mem-hash-map, modules/rbtree-list-tests:
Depend on stdc_rotate_left.
Don’t depend on bitrotate, if we were depending on it.
* modules/bitrotate: Deprecate.
* modules/crypto/arctwo: Depend on stdc_rotate_right.
---
 ChangeLog                      | 44 ++++++++++++++++++++++++++++++++++
 NEWS                           |  3 +++
 lib/arctwo.c                   | 18 +++++++-------
 lib/getlocalename_l-unsafe.c   |  1 +
 lib/getlocalename_l.c          |  1 +
 lib/hash.c                     |  4 ++--
 lib/hashcode-mem.c             |  5 ++--
 lib/hashcode-string1.c         |  4 ++--
 lib/hashcode-string2.c         |  5 ++--
 lib/hashkey-string.c           |  5 ++--
 lib/localename.c               |  1 +
 lib/mem-hash-map.c             |  3 ++-
 lib/struniq.h                  |  6 ++---
 modules/array-map-tests        |  1 +
 modules/avltreehash-list-tests |  2 +-
 modules/bitrotate              |  6 +++++
 modules/crypto/arctwo          |  3 ++-
 modules/getlocalename_l-simple |  1 +
 modules/getlocalename_l-unsafe |  1 +
 modules/hash                   |  2 +-
 modules/hash-map-tests         |  1 +
 modules/hashcode-mem           |  1 +
 modules/hashcode-string1       |  2 +-
 modules/hashcode-string2       |  1 +
 modules/hashkey-string         |  1 +
 modules/linkedhash-list-tests  |  1 +
 modules/linkedhash-map-tests   |  1 +
 modules/localename             |  1 +
 modules/mem-hash-map           |  1 +
 modules/rbtree-list-tests      |  1 +
 tests/test-array_map.c         |  5 ++--
 tests/test-avltreehash_list.c  |  5 ++--
 tests/test-hash_map.c          |  5 ++--
 tests/test-linkedhash_list.c   |  5 ++--
 tests/test-linkedhash_map.c    |  5 ++--
 tests/test-rbtreehash_list.c   |  5 ++--
 36 files changed, 109 insertions(+), 48 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d8969b59d1..a5282f0450 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+2026-06-26  Paul Eggert  <[email protected]>
+
+       bitrotate: prefer C2y to bitrotate or by-hand
+       Deprecate the bitrotate module; it is superseded by C2y’s
+       stdc_rotate_left and stdc_rotate_right.  In several places, prefer
+       the C2y functions to doing things by hand.
+       * lib/arctwo.c (arctwo_encrypt, arctwo_decyrpt):
+       * lib/hash.c (raw_hasher):
+       * lib/hashcode-mem.c (hash_pjw_bare):
+       * lib/hashcode-string1.c (hash_string):
+       * lib/hashcode-string2.c (hash_pjw):
+       * lib/hashkey-string.c (hashkey_string_hash):
+       * lib/mem-hash-map.c (compute_hashval):
+       * lib/struniq.h (hash):
+       * tests/test-array_map.c (string_hash):
+       * tests/test-avltreehash_list.c (string_hash):
+       * tests/test-hash_map.c (string_hash):
+       * tests/test-linkedhash_list.c (string_hash):
+       * tests/test-linkedhash_map.c (string_hash):
+       * tests/test-rbtreehash_list.c (string_hash):
+       Use stdbit.h functions, instead of bitrotate.h functions or doing
+       things by hand.  Include stdbit.h to get them.  Don’t include
+       bitrotate.h, if it was being included.
+       * lib/getlocalename_l-unsafe.c, lib/getlocalename_l.c:
+       * lib/localename.c:
+       Include stdbit.h, since struniq.h now needs this.
+       * lib/hashcode-mem.c, lib/hashcode-string2.c, lib/hashkey-string.c:
+       * lib/struniq.h, tests/test-array_map.c, tests/test-avltreehash_list.c:
+       * tests/test-hash_map.c, tests/test-linkedhash_list.c:
+       * tests/test-linkedhash_map.c, tests/test-rbtreehash_list.c:
+       (SIZE_BITS): Remove; no longer needed.
+       * modules/array-map-tests, modules/avltreehash-list-tests:
+       * modules/crypto/arctwo, modules/getlocalename_l-simple:
+       * modules/getlocalename_l-unsafe, modules/hash:
+       * modules/hash-map-tests, modules/hashcode-mem:
+       * modules/hashcode-string1, modules/hashcode-string2:
+       * modules/hashkey-string, modules/linkedhash-list-tests:
+       * modules/linkedhash-map-tests, modules/localename:
+       * modules/mem-hash-map, modules/rbtree-list-tests:
+       Depend on stdc_rotate_left.
+       Don’t depend on bitrotate, if we were depending on it.
+       * modules/bitrotate: Deprecate.
+       * modules/crypto/arctwo: Depend on stdc_rotate_right.
+
 2026-06-26  Bruno Haible  <[email protected]>
 
        mkdtemp: Provide declaration in <stdlib.h>.
diff --git a/NEWS b/NEWS
index 6eef535dfa..db7776ee78 100644
--- a/NEWS
+++ b/NEWS
@@ -78,6 +78,9 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2026-06-26  bitrotate       This module is deprecated.  Use stdc_rotate_left
+                            or stdc_rotate_right instead.
+
 2026-06-22  crypto/af_alg   This module has been deprecated following the
                             deprecation of the AF_ALG API in Linux 7.2.  If 
your
                             package requires optimized hash algorithms, place
diff --git a/lib/arctwo.c b/lib/arctwo.c
index 3b3d075eb7..7c73b68afc 100644
--- a/lib/arctwo.c
+++ b/lib/arctwo.c
@@ -29,7 +29,7 @@
 
 #include "arctwo.h"
 
-#include "bitrotate.h"
+#include <stdbit.h>
 
 static const uint8_t arctwo_sbox[] = {
   217, 120, 249, 196, 25, 221, 181, 237,
@@ -96,16 +96,16 @@ arctwo_encrypt (arctwo_context *restrict context, char 
const *restrict inbuf,
           size_t j = i * 4;
           /* For some reason I cannot combine those steps. */
           word0 += (word1 & ~word3) + (word2 & word3) + context->S[j];
-          word0 = rotl16 (word0, 1);
+          word0 = stdc_rotate_left (word0, 1);
 
           word1 += (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
-          word1 = rotl16 (word1, 2);
+          word1 = stdc_rotate_left (word1, 2);
 
           word2 += (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
-          word2 = rotl16 (word2, 3);
+          word2 = stdc_rotate_left (word2, 3);
 
           word3 += (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
-          word3 = rotl16 (word3, 5);
+          word3 = stdc_rotate_left (word3, 5);
 
           if (i == 4 || i == 10)
             {
@@ -149,16 +149,16 @@ arctwo_decrypt (arctwo_context *restrict context, char 
const *restrict inbuf,
         {
           size_t j = (i - 1) * 4;
 
-          word3 = rotr16 (word3, 5);
+          word3 = stdc_rotate_right (word3, 5);
           word3 -= (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
 
-          word2 = rotr16 (word2, 3);
+          word2 = stdc_rotate_right (word2, 3);
           word2 -= (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
 
-          word1 = rotr16 (word1, 2);
+          word1 = stdc_rotate_right (word1, 2);
           word1 -= (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
 
-          word0 = rotr16 (word0, 1);
+          word0 = stdc_rotate_right (word0, 1);
           word0 -= (word1 & ~word3) + (word2 & word3) + context->S[j];
 
           if (i == 6 || i == 12)
diff --git a/lib/getlocalename_l-unsafe.c b/lib/getlocalename_l-unsafe.c
index cac2f35b62..bd24a8de7a 100644
--- a/lib/getlocalename_l-unsafe.c
+++ b/lib/getlocalename_l-unsafe.c
@@ -26,6 +26,7 @@
 #include <locale.h>
 #include <limits.h>
 #include <stddef.h>
+#include <stdbit.h>
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/lib/getlocalename_l.c b/lib/getlocalename_l.c
index 768e93e32d..fea5ae2269 100644
--- a/lib/getlocalename_l.c
+++ b/lib/getlocalename_l.c
@@ -20,6 +20,7 @@
 #include <locale.h>
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdlib.h>
 #include <string.h>
 
diff --git a/lib/hash.c b/lib/hash.c
index d1012f0afc..95696e0916 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -26,11 +26,11 @@
 
 #include "hash.h"
 
-#include "bitrotate.h"
 #include "next-prime.h"
 #include "xalloc-oversized.h"
 
 #include <errno.h>
+#include <stdbit.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -360,7 +360,7 @@ raw_hasher (const void *data, size_t n)
      bits are 0.  As this tends to give poorer performance with small
      tables, we rotate the pointer value before performing division,
      in an attempt to improve hash quality.  */
-  size_t val = rotr_sz ((size_t) data, 3);
+  size_t val = stdc_rotate_right ((size_t) data, 3);
   return val % n;
 }
 
diff --git a/lib/hashcode-mem.c b/lib/hashcode-mem.c
index 148558be18..a4963afb68 100644
--- a/lib/hashcode-mem.c
+++ b/lib/hashcode-mem.c
@@ -21,8 +21,7 @@
 #include "hashcode-mem.h"
 
 #include <limits.h>
-
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+#include <stdbit.h>
 
 /* Return a hash of the N bytes of X using the method described by
    Bruno Haible in https://www.haible.de/bruno/hashfunc.html.
@@ -36,7 +35,7 @@ hash_pjw_bare (const void *x, size_t n)
   size_t h = 0;
 
   for (unsigned int i = 0; i < n; i++)
-    h = s[i] + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = s[i] + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/lib/hashcode-string1.c b/lib/hashcode-string1.c
index 1dc15a8724..0eef513aef 100644
--- a/lib/hashcode-string1.c
+++ b/lib/hashcode-string1.c
@@ -22,7 +22,7 @@
 
 #if USE_DIFF_HASH
 
-# include "bitrotate.h"
+# include <stdbit.h>
 
 /* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
    B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
@@ -37,7 +37,7 @@ hash_string (const char *string, size_t tablesize)
   unsigned char ch;
 
   for (; (ch = *string); string++)
-    value = ch + rotl_sz (value, 7);
+    value = ch + stdc_rotate_left (value, 7);
   return value % tablesize;
 }
 
diff --git a/lib/hashcode-string2.c b/lib/hashcode-string2.c
index 1b365dde60..3009d1489c 100644
--- a/lib/hashcode-string2.c
+++ b/lib/hashcode-string2.c
@@ -21,8 +21,7 @@
 #include "hashcode-string2.h"
 
 #include <limits.h>
-
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+#include <stdbit.h>
 
 /* A hash function for NUL-terminated char* strings using
    the method described by Bruno Haible.
@@ -34,7 +33,7 @@ hash_pjw (const void *x, size_t tablesize)
   size_t h = 0;
 
   for (const char *s = x; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h % tablesize;
 }
diff --git a/lib/hashkey-string.c b/lib/hashkey-string.c
index 08200686c5..abd1956eba 100644
--- a/lib/hashkey-string.c
+++ b/lib/hashkey-string.c
@@ -20,6 +20,7 @@
 #include "hashkey-string.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <string.h>
 
 bool
@@ -30,8 +31,6 @@ hashkey_string_equals (const void *x1, const void *x2)
   return streq (s1, s2);
 }
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 /* A hash function for NUL-terminated 'const char *' strings using
    the method described by Bruno Haible.
    See https://www.haible.de/bruno/hashfunc.html.  */
@@ -42,7 +41,7 @@ hashkey_string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/lib/localename.c b/lib/localename.c
index 8fd3fe725b..3cf4be26d1 100644
--- a/lib/localename.c
+++ b/lib/localename.c
@@ -26,6 +26,7 @@
 #include "localename.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdlib.h>
 #include <locale.h>
 #include <string.h>
diff --git a/lib/mem-hash-map.c b/lib/mem-hash-map.c
index 96fba6ee1a..c8620ee22d 100644
--- a/lib/mem-hash-map.c
+++ b/lib/mem-hash-map.c
@@ -20,6 +20,7 @@
 /* Specification.  */
 #include "mem-hash-map.h"
 
+#include <stdbit.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
@@ -95,7 +96,7 @@ compute_hashval (const void *key, size_t keylen)
   size_t hval = keylen;
   while (cnt < keylen)
     {
-      hval = (hval << 9) | (hval >> (sizeof (size_t) * CHAR_BIT - 9));
+      hval = stdc_rotate_left (hval, 9);
       hval += (size_t) *(((const char *) key) + cnt++);
     }
   return hval != 0 ? hval : ~((size_t) 0);
diff --git a/lib/struniq.h b/lib/struniq.h
index a9686f1ab3..afa616c864 100644
--- a/lib/struniq.h
+++ b/lib/struniq.h
@@ -20,6 +20,7 @@
 /* This file needs the following includes:
 
      #include <limits.h>
+     #include <stdbit.h>
      #include <stdlib.h>
      #include <string.h>
      #include "flexmember.h"
@@ -31,6 +32,7 @@
      flexmember
      lock
      bool
+     stdc_rotate_left
      thread-optim
  */
 
@@ -38,8 +40,6 @@
 /* Simple hash set of strings.  We don't want to drag in lots of hash table
    code here.  */
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 /* A hash function for NUL-terminated char* strings using
    the method described by Bruno Haible.
    See https://www.haible.de/bruno/hashfunc.html.  */
@@ -50,7 +50,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/modules/array-map-tests b/modules/array-map-tests
index 37dc407b7f..c1646ea8c4 100644
--- a/modules/array-map-tests
+++ b/modules/array-map-tests
@@ -7,6 +7,7 @@ xlist
 array-list
 xalloc
 stdcountof-h
+stdc_rotate_left
 streq
 
 configure.ac:
diff --git a/modules/avltreehash-list-tests b/modules/avltreehash-list-tests
index cc0bc64d46..86ec20e5d7 100644
--- a/modules/avltreehash-list-tests
+++ b/modules/avltreehash-list-tests
@@ -5,6 +5,7 @@ tests/macros.h
 Depends-on:
 array-list
 stdcountof-h
+stdc_rotate_left
 streq
 
 configure.ac:
@@ -12,4 +13,3 @@ configure.ac:
 Makefile.am:
 TESTS += test-avltreehash_list
 check_PROGRAMS += test-avltreehash_list
-
diff --git a/modules/bitrotate b/modules/bitrotate
index 64193d1853..7f81401164 100644
--- a/modules/bitrotate
+++ b/modules/bitrotate
@@ -1,6 +1,12 @@
 Description:
 Rotate bits in unsigned 8, 16, and 32 bit integers.
 
+Status:
+deprecated
+
+Notice:
+This module is deprecated. Use stdc_rotate_left and std_rotate_right instead.
+
 Files:
 lib/bitrotate.h
 lib/bitrotate.c
diff --git a/modules/crypto/arctwo b/modules/crypto/arctwo
index b50d27d034..db36170a2b 100644
--- a/modules/crypto/arctwo
+++ b/modules/crypto/arctwo
@@ -8,7 +8,8 @@ m4/arctwo.m4
 
 Depends-on:
 stdint-h
-bitrotate
+stdc_rotate_left
+stdc_rotate_right
 
 configure.ac:
 AC_REQUIRE([AC_C_RESTRICT])
diff --git a/modules/getlocalename_l-simple b/modules/getlocalename_l-simple
index 39ddc8fd52..4678701be1 100644
--- a/modules/getlocalename_l-simple
+++ b/modules/getlocalename_l-simple
@@ -13,6 +13,7 @@ getlocalename_l-unsafe [test $HAVE_GETLOCALENAME_L = 0 || 
test $REPLACE_GETLOCAL
 flexmember             [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
 lock                   [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
 streq                  [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
+stdc_rotate_left       [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
 bool                   [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
 thread-optim           [test $HAVE_GETLOCALENAME_L = 0 || test 
$REPLACE_GETLOCALENAME_L = 1]
 
diff --git a/modules/getlocalename_l-unsafe b/modules/getlocalename_l-unsafe
index e7c9153047..c2b9afbfdc 100644
--- a/modules/getlocalename_l-unsafe
+++ b/modules/getlocalename_l-unsafe
@@ -15,6 +15,7 @@ locale-h
 getlocalename_l-unsafe-limited
 flexmember
 lock
+stdc_rotate_left
 streq
 bool
 thread-optim
diff --git a/modules/hash b/modules/hash
index 60ec6b4b56..caff594d32 100644
--- a/modules/hash
+++ b/modules/hash
@@ -6,13 +6,13 @@ lib/hash.c
 lib/hash.h
 
 Depends-on:
-bitrotate
 calloc-posix
 free-posix
 malloc-posix
 next-prime
 bool
 stdint-h
+stdc_rotate_right
 xalloc-oversized
 hashcode-string1
 
diff --git a/modules/hash-map-tests b/modules/hash-map-tests
index 999b5ee524..53da30c663 100644
--- a/modules/hash-map-tests
+++ b/modules/hash-map-tests
@@ -6,6 +6,7 @@ Depends-on:
 array-map
 xalloc
 stdcountof-h
+stdc_rotate_left
 streq
 
 configure.ac:
diff --git a/modules/hashcode-mem b/modules/hashcode-mem
index 1c6431a531..9e0a2a6466 100644
--- a/modules/hashcode-mem
+++ b/modules/hashcode-mem
@@ -7,6 +7,7 @@ lib/hashcode-mem.c
 lib/hash-pjw-bare.h
 
 Depends-on:
+stdc_rotate_left
 
 configure.ac:
 
diff --git a/modules/hashcode-string1 b/modules/hashcode-string1
index 49cf3f3fbe..93ffc01704 100644
--- a/modules/hashcode-string1
+++ b/modules/hashcode-string1
@@ -6,7 +6,7 @@ lib/hashcode-string1.h
 lib/hashcode-string1.c
 
 Depends-on:
-bitrotate
+stdc_rotate_left
 
 configure.ac:
 gl_MODULE_INDICATOR([hashcode-string1])
diff --git a/modules/hashcode-string2 b/modules/hashcode-string2
index 7a26702471..88c377360b 100644
--- a/modules/hashcode-string2
+++ b/modules/hashcode-string2
@@ -7,6 +7,7 @@ lib/hashcode-string2.c
 lib/hash-pjw.h
 
 Depends-on:
+stdc_rotate_left
 
 configure.ac:
 
diff --git a/modules/hashkey-string b/modules/hashkey-string
index 10d8341cb8..2b2b407bbb 100644
--- a/modules/hashkey-string
+++ b/modules/hashkey-string
@@ -7,6 +7,7 @@ lib/hashkey-string.c
 
 Depends-on:
 bool
+stdc_rotate_left
 streq
 
 configure.ac:
diff --git a/modules/linkedhash-list-tests b/modules/linkedhash-list-tests
index 0e36eaac65..7f5e410bfa 100644
--- a/modules/linkedhash-list-tests
+++ b/modules/linkedhash-list-tests
@@ -5,6 +5,7 @@ tests/macros.h
 Depends-on:
 array-list
 stdcountof-h
+stdc_rotate_left
 streq
 
 configure.ac:
diff --git a/modules/linkedhash-map-tests b/modules/linkedhash-map-tests
index b0ef90cb8e..8c3757b97c 100644
--- a/modules/linkedhash-map-tests
+++ b/modules/linkedhash-map-tests
@@ -6,6 +6,7 @@ Depends-on:
 array-map
 xalloc
 stdcountof-h
+stdc_rotate_left
 streq
 
 configure.ac:
diff --git a/modules/localename b/modules/localename
index e01af85e33..4bf7c88a19 100644
--- a/modules/localename
+++ b/modules/localename
@@ -11,6 +11,7 @@ locale-h
 localename-unsafe
 flexmember
 lock
+stdc_rotate_left
 streq
 bool
 thread-optim
diff --git a/modules/mem-hash-map b/modules/mem-hash-map
index cdb750c424..5c611bc5fa 100644
--- a/modules/mem-hash-map
+++ b/modules/mem-hash-map
@@ -9,6 +9,7 @@ Depends-on:
 next-prime
 obstack
 memeq
+stdc_rotate_left
 xalloc
 
 configure.ac:
diff --git a/modules/rbtree-list-tests b/modules/rbtree-list-tests
index f428e58ae9..f4bca8ecfd 100644
--- a/modules/rbtree-list-tests
+++ b/modules/rbtree-list-tests
@@ -5,6 +5,7 @@ tests/macros.h
 Depends-on:
 array-list
 stdcountof-h
+stdc_rotate_left
 
 configure.ac:
 
diff --git a/tests/test-array_map.c b/tests/test-array_map.c
index 5b3ec3bcf6..9d84d45a1c 100644
--- a/tests/test-array_map.c
+++ b/tests/test-array_map.c
@@ -20,6 +20,7 @@
 #include "gl_array_map.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,8 +35,6 @@ static const char *objects[30] =
     "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -54,7 +53,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/tests/test-avltreehash_list.c b/tests/test-avltreehash_list.c
index b0348a9e70..d31cd1f718 100644
--- a/tests/test-avltreehash_list.c
+++ b/tests/test-avltreehash_list.c
@@ -20,6 +20,7 @@
 #include "gl_avltreehash_list.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,8 +35,6 @@ static const char *objects[15] =
     "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -54,7 +53,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/tests/test-hash_map.c b/tests/test-hash_map.c
index 2a806b75ba..b9d02f3568 100644
--- a/tests/test-hash_map.c
+++ b/tests/test-hash_map.c
@@ -20,6 +20,7 @@
 #include "gl_hash_map.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,8 +35,6 @@ static const char *objects[30] =
     "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -54,7 +53,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/tests/test-linkedhash_list.c b/tests/test-linkedhash_list.c
index a0de9b08e5..f8281f7bef 100644
--- a/tests/test-linkedhash_list.c
+++ b/tests/test-linkedhash_list.c
@@ -20,6 +20,7 @@
 #include "gl_linkedhash_list.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -32,8 +33,6 @@ static const char *objects[15] =
     "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -52,7 +51,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/tests/test-linkedhash_map.c b/tests/test-linkedhash_map.c
index 1c6e5d9b59..22011e18af 100644
--- a/tests/test-linkedhash_map.c
+++ b/tests/test-linkedhash_map.c
@@ -20,6 +20,7 @@
 #include "gl_linkedhash_map.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,8 +35,6 @@ static const char *objects[30] =
     "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "<", ">", "[", "]"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -54,7 +53,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
diff --git a/tests/test-rbtreehash_list.c b/tests/test-rbtreehash_list.c
index 45cd3611a2..7709bf96e9 100644
--- a/tests/test-rbtreehash_list.c
+++ b/tests/test-rbtreehash_list.c
@@ -20,6 +20,7 @@
 #include "gl_rbtreehash_list.h"
 
 #include <limits.h>
+#include <stdbit.h>
 #include <stdcountof.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,8 +35,6 @@ static const char *objects[15] =
     "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"
   };
 
-#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
-
 static bool
 string_equals (const void *x1, const void *x2)
 {
@@ -54,7 +53,7 @@ string_hash (const void *x)
   size_t h = 0;
 
   for (; *s; s++)
-    h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+    h = *s + stdc_rotate_left (h, 9);
 
   return h;
 }
-- 
2.54.0


Reply via email to