From: Rémi Bernon rbernon@codeweavers.com
--- include/msvcrt/intrin.h | 4 ++++ include/winnt.h | 14 ++++++++++++++ 2 files changed, 18 insertions(+)
diff --git a/include/msvcrt/intrin.h b/include/msvcrt/intrin.h index ba825b7b09e..03d856c5933 100644 --- a/include/msvcrt/intrin.h +++ b/include/msvcrt/intrin.h @@ -90,6 +90,10 @@ unsigned __int64 __getReg(int);
#endif
+#if defined(_MSC_VER) && defined(__x86_64__) +unsigned __int64 _umul128(unsigned __int64,unsigned __int64,unsigned __int64*); +#endif + #ifdef __cplusplus } #endif diff --git a/include/winnt.h b/include/winnt.h index c810830b2b3..794970a35f5 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -7397,6 +7397,20 @@ static FORCEINLINE void YieldProcessor(void) #endif }
+#if defined(_MSC_VER) && !defined(__arm64ec__) && (!defined(__clang__) || __has_builtin(_umul128)) +#define UnsignedMultiply128 _umul128 +DWORD64 _umul128(DWORD64,DWORD64,DWORD64*); +#pragma intrinsic(_umul128) +#elif !defined(__i386__) +static FORCEINLINE DWORD64 UnsignedMultiply128( DWORD64 a, DWORD64 b, DWORD64 *hi ) +{ + unsigned __int128 v = (unsigned __int128)a * b; + *hi = v >> 64; + return (DWORD64)v; +} +#define _umul128 UnsignedMultiply128 +#endif + #ifdef __cplusplus } #endif