Skip to content

Commit dc41cf3

Browse files
committed
[Misc #21690] Sync parser_bits.h from internal/bits.h
1 parent c5b51bd commit dc41cf3

File tree

1 file changed

+95
-12
lines changed

1 file changed

+95
-12
lines changed

parser_bits.h

Lines changed: 95 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include <stdint.h> /* for uintptr_t */
3131
#include "internal/compilers.h" /* for MSC_VERSION_SINCE */
3232

33-
#if defined(_MSC_VER)
33+
#ifdef _MSC_VER
3434
# include <stdlib.h> /* for _byteswap_uint64 */
3535
#endif
3636

@@ -57,9 +57,6 @@
5757
# pragma intrinsic(_rotl64)
5858
# pragma intrinsic(_rotr64)
5959
# endif
60-
#endif
61-
62-
#if defined(_MSC_VER)
6360
# pragma intrinsic(_BitScanForward)
6461
# pragma intrinsic(_BitScanReverse)
6562
# ifdef _WIN64
@@ -90,6 +87,7 @@
9087

9188
#define UNSIGNED_INTEGER_MAX(T) ((T)~(T)0)
9289

90+
#ifndef MUL_OVERFLOW_SIGNED_INTEGER_P
9391
#if __has_builtin(__builtin_mul_overflow_p)
9492
# define MUL_OVERFLOW_P(a, b) \
9593
__builtin_mul_overflow_p((a), (b), (__typeof__(a * b))0)
@@ -118,15 +116,100 @@
118116
MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
119117
#endif
120118

121-
#ifdef MUL_OVERFLOW_P
119+
#if defined(MUL_OVERFLOW_P) && defined(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG)
122120
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
121+
#else
122+
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
123+
#endif
124+
125+
#ifdef MUL_OVERFLOW_P
123126
# define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_P(a, b)
124127
# define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_P(a, b)
125128
#else
126-
# define MUL_OVERFLOW_LONG_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
127129
# define MUL_OVERFLOW_LONG_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
128130
# define MUL_OVERFLOW_INT_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
129131
#endif
132+
#endif
133+
134+
#ifndef ADD_OVERFLOW_SIGNED_INTEGER_P
135+
#if __has_builtin(__builtin_add_overflow_p)
136+
# define ADD_OVERFLOW_P(a, b) \
137+
__builtin_add_overflow_p((a), (b), (__typeof__(a * b))0)
138+
#elif __has_builtin(__builtin_add_overflow)
139+
# define ADD_OVERFLOW_P(a, b) \
140+
__extension__ ({ __typeof__(a) c; __builtin_add_overflow((a), (b), &c); })
141+
#endif
142+
143+
#define ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
144+
(a) > 0 ? (b) > (max) - (a) : (b) < (min) - (a))
145+
146+
#if __has_builtin(__builtin_add_overflow_p)
147+
/* __builtin_add_overflow_p can take bitfield */
148+
/* and GCC permits bitfields for integers other than int */
149+
# define ADD_OVERFLOW_FIXNUM_P(a, b) \
150+
__extension__ ({ \
151+
struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
152+
__builtin_add_overflow_p((a), (b), c.fixnum); \
153+
})
154+
#else
155+
# define ADD_OVERFLOW_FIXNUM_P(a, b) \
156+
ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
157+
#endif
158+
159+
#if defined(ADD_OVERFLOW_P) && defined(USE___BUILTIN_ADD_OVERFLOW_LONG_LONG)
160+
# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_P(a, b)
161+
#else
162+
# define ADD_OVERFLOW_LONG_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
163+
#endif
164+
165+
#ifdef ADD_OVERFLOW_P
166+
# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_P(a, b)
167+
# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_P(a, b)
168+
#else
169+
# define ADD_OVERFLOW_LONG_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
170+
# define ADD_OVERFLOW_INT_P(a, b) ADD_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
171+
#endif
172+
#endif
173+
174+
#ifndef SUB_OVERFLOW_SIGNED_INTEGER_P
175+
#if __has_builtin(__builtin_sub_overflow_p)
176+
# define SUB_OVERFLOW_P(a, b) \
177+
__builtin_sub_overflow_p((a), (b), (__typeof__(a * b))0)
178+
#elif __has_builtin(__builtin_sub_overflow)
179+
# define SUB_OVERFLOW_P(a, b) \
180+
__extension__ ({ __typeof__(a) c; __builtin_sub_overflow((a), (b), &c); })
181+
#endif
182+
183+
#define SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) ( \
184+
(b) > 0 ? (a) < (min) + (b) : (a) > (max) + (b))
185+
186+
#if __has_builtin(__builtin_sub_overflow_p)
187+
/* __builtin_sub_overflow_p can take bitfield */
188+
/* and GCC permits bitfields for integers other than int */
189+
# define SUB_OVERFLOW_FIXNUM_P(a, b) \
190+
__extension__ ({ \
191+
struct { long fixnum : sizeof(long) * CHAR_BIT - 1; } c = { 0 }; \
192+
__builtin_sub_overflow_p((a), (b), c.fixnum); \
193+
})
194+
#else
195+
# define SUB_OVERFLOW_FIXNUM_P(a, b) \
196+
SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, FIXNUM_MIN, FIXNUM_MAX)
197+
#endif
198+
199+
#if defined(SUB_OVERFLOW_P) && defined(USE___BUILTIN_SUB_OVERFLOW_LONG_LONG)
200+
# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_P(a, b)
201+
#else
202+
# define SUB_OVERFLOW_LONG_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LLONG_MIN, LLONG_MAX)
203+
#endif
204+
205+
#ifdef SUB_OVERFLOW_P
206+
# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_P(a, b)
207+
# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_P(a, b)
208+
#else
209+
# define SUB_OVERFLOW_LONG_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, LONG_MIN, LONG_MAX)
210+
# define SUB_OVERFLOW_INT_P(a, b) SUB_OVERFLOW_SIGNED_INTEGER_P(a, b, INT_MIN, INT_MAX)
211+
#endif
212+
#endif
130213

131214
#ifdef HAVE_UINT128_T
132215
# define bit_length(x) \
@@ -394,9 +477,9 @@ rb_popcount32(uint32_t x)
394477
#else
395478
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
396479
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
397-
x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
398-
x = (x & 0x001f001f) + (x >> 8 & 0x001f001f);
399-
x = (x & 0x0000003f) + (x >>16 & 0x0000003f);
480+
x = (x & 0x07070707) + (x >> 4 & 0x07070707);
481+
x = (x & 0x000f000f) + (x >> 8 & 0x000f000f);
482+
x = (x & 0x0000001f) + (x >>16 & 0x0000001f);
400483
return (unsigned int)x;
401484

402485
#endif
@@ -424,9 +507,9 @@ rb_popcount64(uint64_t x)
424507
x = (x & 0x5555555555555555) + (x >> 1 & 0x5555555555555555);
425508
x = (x & 0x3333333333333333) + (x >> 2 & 0x3333333333333333);
426509
x = (x & 0x0707070707070707) + (x >> 4 & 0x0707070707070707);
427-
x = (x & 0x001f001f001f001f) + (x >> 8 & 0x001f001f001f001f);
428-
x = (x & 0x0000003f0000003f) + (x >>16 & 0x0000003f0000003f);
429-
x = (x & 0x000000000000007f) + (x >>32 & 0x000000000000007f);
510+
x = (x & 0x000f000f000f000f) + (x >> 8 & 0x000f000f000f000f);
511+
x = (x & 0x0000001f0000001f) + (x >>16 & 0x0000001f0000001f);
512+
x = (x & 0x000000000000003f) + (x >>32 & 0x000000000000003f);
430513
return (unsigned int)x;
431514

432515
#endif

0 commit comments

Comments
 (0)