From: Jacek Caban jacek@codeweavers.com
Based on patch by Rémi Bernon. --- include/msvcrt/intrin.h | 1 + include/winnt.h | 9 +++++++++ 2 files changed, 10 insertions(+)
diff --git a/include/msvcrt/intrin.h b/include/msvcrt/intrin.h index 35762483313..b20fb1b56d0 100644 --- a/include/msvcrt/intrin.h +++ b/include/msvcrt/intrin.h @@ -99,6 +99,7 @@ unsigned char _BitScanForward64(unsigned long*,unsigned __int64); #endif
#if defined(_MSC_VER) && defined(__x86_64__) +unsigned __int64 __shiftright128(unsigned __int64, unsigned __int64, unsigned char); unsigned __int64 _umul128(unsigned __int64, unsigned __int64, unsigned __int64*); #endif
diff --git a/include/winnt.h b/include/winnt.h index 223db81576f..722d2c3a542 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -7438,17 +7438,26 @@ static FORCEINLINE void YieldProcessor(void)
#if defined(__x86_64__) # if defined(__arm64ec__) +# define __shiftright128 ShiftRight128 # define _umul128 UnsignedMultiply128 # else +# define ShiftRight128 __shiftright128 # define UnsignedMultiply128 _umul128 # if defined(_MSC_VER) +DWORD64 __shiftright128(DWORD64,DWORD64,BYTE); DWORD64 _umul128(DWORD64,DWORD64,DWORD64*); +# pragma intrinsic(__shiftright128) # pragma intrinsic(_umul128) # endif # endif #endif
#if (defined(__x86_64__) && !defined(_MSC_VER)) || defined(__aarch64__) || defined(__arm64ec__) +static FORCEINLINE DWORD64 ShiftRight128( DWORD64 lo, DWORD64 hi, BYTE shift ) +{ + return ((unsigned __int128)hi << 64 | lo) >> shift; +} + static FORCEINLINE DWORD64 UnsignedMultiply128( DWORD64 a, DWORD64 b, DWORD64 *hi ) { unsigned __int128 v = (unsigned __int128)a * b;