commit 5bcf255f3daa77171ee29e298119e394cab65e19
parent 7a25119aef52149ad7c6259cffe8cfb45eb65957
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Sun, 31 Aug 2025 14:28:57 +0200
mhd_ROT{L,R}{32,64}: made implementation consistent with standard versions
Relaxed requirements for the second parameter
Diffstat:
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/src/mhd2/mhd_bithelpers.h b/src/mhd2/mhd_bithelpers.h
@@ -389,7 +389,6 @@ mhd_GET_32BIT_BE(const void *addr)
/**
* Rotate right 32-bit value by number of bits.
- * bits parameter must be more than zero and must be less than 32.
*/
#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
defined(__OPTIMIZE__)))
@@ -409,9 +408,8 @@ mhd_GET_32BIT_BE(const void *addr)
MHD_static_inline_ uint32_t
mhd_ROTR32 (uint32_t value32, unsigned int bits)
{
- mhd_assert (32 > bits);
- /* Defined in form which modern compiler could optimize. */
- return (value32 >> bits) | (value32 << (32 - bits));
+ bits &= 31u;
+ return (value32 >> bits) | (value32 << ((32u - bits) & 31u));
}
@@ -420,7 +418,6 @@ mhd_ROTR32 (uint32_t value32, unsigned int bits)
/**
* Rotate left 32-bit value by number of bits.
- * bits parameter must be more than zero and must be less than 32.
*/
#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
defined(__OPTIMIZE__)))
@@ -440,9 +437,8 @@ mhd_ROTR32 (uint32_t value32, unsigned int bits)
MHD_static_inline_ uint32_t
mhd_ROTL32 (uint32_t value32, unsigned int bits)
{
- mhd_assert (32 > bits);
- /* Defined in form which modern compiler could optimize. */
- return (value32 << bits) | (value32 >> (32 - bits));
+ bits &= 31u;
+ return (value32 << bits) | (value32 >> ((32u - bits) & 31u));
}
@@ -451,7 +447,6 @@ mhd_ROTL32 (uint32_t value32, unsigned int bits)
/**
* Rotate right 64-bit value by number of bits.
- * bits parameter must be more than zero and must be less than 64.
*/
#if defined(_MSC_FULL_VER) && (! defined(__clang__) || (defined(__c2__) && \
defined(__OPTIMIZE__)))
@@ -471,9 +466,8 @@ mhd_ROTL32 (uint32_t value32, unsigned int bits)
MHD_static_inline_ uint64_t
mhd_ROTR64 (uint64_t value64, unsigned int bits)
{
- mhd_assert (64 > bits);
- /* Defined in form which modern compiler could optimise. */
- return (value64 >> bits) | (value64 << (64 - bits));
+ bits &= 63u;
+ return (value64 >> bits) | (value64 << ((64u - bits) & 63u));
}