mirror of
https://github.com/ruby/ruby.git
synced 2026-10-28 16:36:20 +08:00
[Misc #21690] Sync parser_bits.h from internal/bits.h
This commit is contained in:
1 file changed
+95
-12
Notes:
git
2025-12-11 10:12:47 +00:00
+95
-12
@@ -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
|
||||
|
||||
Reference in new issue
Block a user