Use addcarry intrinsic for size overflow

This commit is contained in:
uvlad7
2026-10-29 17:59:43 +09:00
committed by Nobuyoshi Nakada
parent a34946d692
commit d411489ce5
Notes: git 2026-10-29 09:00:15 +00:00
+7
View File
@@ -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;