From 3b863cf88f17e280562a8f787ea0e943aaf6d73d Mon Sep 17 00:00:00 2001 From: XMRig Date: Sun, 15 Jun 2025 04:58:03 +0700 Subject: [PATCH] Fixed __umul128 for MSVC ARM64. --- src/base/tools/cryptonote/umul128.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/base/tools/cryptonote/umul128.h b/src/base/tools/cryptonote/umul128.h index a6e77da6..b9916648 100644 --- a/src/base/tools/cryptonote/umul128.h +++ b/src/base/tools/cryptonote/umul128.h @@ -23,15 +23,22 @@ #pragma once - #include -#ifdef XMRIG_64_BIT -# ifdef _MSC_VER +#if defined(XMRIG_64_BIT) +# if defined(_MSC_VER) # include -# pragma intrinsic(_umul128) -# define __umul128 _umul128 -# elif defined __GNUC__ +# if defined(XMRIG_ARM) + #pragma intrinsic(__umulh) + static inline uint64_t __umul128(uint64_t a, uint64_t b, uint64_t *high) { + *high = __umulh(a, b); + return a * b; + } +# else +# pragma intrinsic(_umul128) +# define __umul128 _umul128 +# endif +# elif defined(__GNUC__) static inline uint64_t _umul128(uint64_t a, uint64_t b, uint64_t* hi) { unsigned __int128 r = (unsigned __int128) a * (unsigned __int128) b;