[Misc #21690] Sync parser_bits.h from internal/bits.h

This commit is contained in:
Nobuyoshi Nakada committed 2025-12-11 18:42:07 +09:00
1 parent c5b51bdd8c
commit dc41cf3326
1 file changed
+95 -12
Notes: git 2025-12-11 10:12:47 +00:00
+95 -12
View File
@@ -30,7 +30,7 @@
#include <stdint.h> /* for uintptr_t */
#include "internal/compilers.h" /* for MSC_VERSION_SINCE */
#if defined(_MSC_VER)
#ifdef _MSC_VER
# include <stdlib.h> /* for _byteswap_uint64 */
#endif
@@ -57,9 +57,6 @@
# pragma intrinsic(_rotl64)
# pragma intrinsic(_rotr64)
# endif
#endif
#if defined(_MSC_VER)
# pragma intrinsic(_BitScanForward)
# pragma intrinsic(_BitScanReverse)
# ifdef _WIN64
@@ -90,6 +87,7 @@
#define UNSIGNED_INTEGER_MAX(T) ((T)~(T)0)
#ifndef MUL_OVERFLOW_SIGNED_INTEGER_P
#if __has_builtin(__builtin_mul_overflow_p)
# define MUL_OVERFLOW_P(a, b) \
__builtin_mul_overflow_p((a), (b), (__typeof__(a * b))0)
@@ -118,15 +116,100 @@
MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
#endif
#ifdef MUL_OVERFLOW_P
#if defined(MUL_OVERFLOW_P) && defined(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG)
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
#else
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
#endif
#ifdef MUL_OVERFLOW_P
# define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
# define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_P(a, b)
#else
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
# define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
# define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
#endif
#endif
#ifndef ADD_OVERFLOW_SIGNED_INTEGER_P
#if __has_builtin(__builtin_add_overflow_p)
# define ADD_OVERFLOW_P(a, b) \
__builtin_add_overflow_p((a), (b), (__typeof__(a * b))0)
#elif __has_builtin(__builtin_add_overflow)
# define ADD_OVERFLOW_P(a, b) \
__extension__ ({ __typeof__(a) c; __builtin_add_overflow((a), (b), &c); })
#endif
#define ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
(a) > 0 ? (b) > (max) - (a) : (b) < (min) - (a))
#if __has_builtin(__builtin_add_overflow_p)
/* __builtin_add_overflow_p can take bitfield */
/* and GCC permits bitfields for integers other than int */
# define ADD_OVERFLOW_FIXNUM_P(a, b) \
__extension__ ({ \
struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
__builtin_add_overflow_p((a), (b), c.fixnum); \
})
#else
# define ADD_OVERFLOW_FIXNUM_P(a, b) \
ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
#endif
#if defined(ADD_OVERFLOW_P) && defined(USE___BUILTIN_ADD_OVERFLOW_LONG_LONG)
# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_P(a, b)
#else
# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
#endif
#ifdef ADD_OVERFLOW_P
# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_P(a, b)
# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_P(a, b)
#else
# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
#endif
#endif
#ifndef SUB_OVERFLOW_SIGNED_INTEGER_P
#if __has_builtin(__builtin_sub_overflow_p)
# define SUB_OVERFLOW_P(a, b) \
__builtin_sub_overflow_p((a), (b), (__typeof__(a * b))0)
#elif __has_builtin(__builtin_sub_overflow)
# define SUB_OVERFLOW_P(a, b) \
__extension__ ({ __typeof__(a) c; __builtin_sub_overflow((a), (b), &c); })
#endif
#define SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
(b) > 0 ? (a) < (min) + (b) : (a) > (max) + (b))
#if __has_builtin(__builtin_sub_overflow_p)
/* __builtin_sub_overflow_p can take bitfield */
/* and GCC permits bitfields for integers other than int */
# define SUB_OVERFLOW_FIXNUM_P(a, b) \
__extension__ ({ \
struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
__builtin_sub_overflow_p((a), (b), c.fixnum); \
})
#else
# define SUB_OVERFLOW_FIXNUM_P(a, b) \
SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
#endif
#if defined(SUB_OVERFLOW_P) && defined(USE___BUILTIN_SUB_OVERFLOW_LONG_LONG)
# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_P(a, b)
#else
# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
#endif
#ifdef SUB_OVERFLOW_P
# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_P(a, b)
# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_P(a, b)
#else
# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
#endif
#endif
#ifdef HAVE_UINT128_T
# define bit_length(x) \
@@ -394,9 +477,9 @@ rb_popcount32(uint32_t x)
#else
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
x = (x & 0x001f001f) + (x >> 8 & 0x001f001f);
x = (x & 0x0000003f) + (x >>16 & 0x0000003f);
x = (x & 0x07070707) + (x >> 4 & 0x07070707);
x = (x & 0x000f000f) + (x >> 8 & 0x000f000f);
x = (x & 0x0000001f) + (x >>16 & 0x0000001f);
return (unsigned int)x;
#endif
@@ -424,9 +507,9 @@ rb_popcount64(uint64_t x)
x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
x = (x & 0x0707070707070707) + (x >> 4 & 0x0707070707070707);
x = (x & 0x001f001f001f001f) + (x >> 8 & 0x001f001f001f001f);
x = (x & 0x0000003f0000003f) + (x >>16 & 0x0000003f0000003f);
x = (x & 0x000000000000007f) + (x >>32 & 0x000000000000007f);
x = (x & 0x000f000f000f000f) + (x >> 8 & 0x000f000f000f000f);
x = (x & 0x0000001f0000001f) + (x >>16 & 0x0000001f0000001f);
x = (x & 0x000000000000003f) + (x >>32 & 0x000000000000003f);
return (unsigned int)x;
#endif