mirror of
https://github.com/ruby/ruby.git
synced 2026-11-09 08:42:18 +08:00
Use addcarry intrinsic for size overflow
This commit is contained in:
Notes:
git
2026-10-29 09:00:15 +00:00
@@ -42,6 +42,7 @@
|
||||
# include <intrin.h>
|
||||
# if defined(_M_AMD64)
|
||||
# pragma intrinsic(_umul128)
|
||||
# pragma intrinsic(_addcarry_u64)
|
||||
# endif
|
||||
# if defined(_M_ARM64)
|
||||
# pragma intrinsic(__umulh)
|
||||
@@ -664,6 +665,12 @@ rbimpl_size_add_overflow(size_t x, size_t y)
|
||||
ret.overflowed = dz > SIZE_MAX;
|
||||
ret.result = (size_t)dz;
|
||||
|
||||
#elif defined(_MSC_VER) && defined(_M_AMD64)
|
||||
unsigned __int64 dz = 0;
|
||||
unsigned char carry = _addcarry_u64(0, x, y, &dz);
|
||||
ret.overflowed = RBIMPL_CAST((bool)carry);
|
||||
ret.result = RBIMPL_CAST((size_t)dz);
|
||||
|
||||
#else
|
||||
ret.result = x + y;
|
||||
ret.overflowed = ret.result < y;
|
||||
|
||||
Reference in New Issue
Block a user