From 05dd4e57e7e997eaa69155e1bba6aeada638a656 Mon Sep 17 00:00:00 2001 From: Tom Lally Date: Wed, 7 Sep 2022 22:42:19 +0100 Subject: [PATCH] Added _udiv128 to precompiled.h --- src/Cafe/HW/Espresso/PPCTimer.cpp | 11 ----------- src/Common/precompiled.h | 10 ++++++++++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Cafe/HW/Espresso/PPCTimer.cpp b/src/Cafe/HW/Espresso/PPCTimer.cpp index 0ab6d77d..36198dac 100644 --- a/src/Cafe/HW/Espresso/PPCTimer.cpp +++ b/src/Cafe/HW/Espresso/PPCTimer.cpp @@ -108,14 +108,8 @@ uint64 PPCTimer_tscToMicroseconds(uint64 us) uint128_t r{}; r.low = _umul128(us, 1000000ULL, &r.high); - uint64 remainder; - -#if defined(_MSC_VER) && _MSC_VER >= 1923 && !defined(__clang__) const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder); -#else - const uint64 microseconds = udiv128(r.low, r.high, _rdtscFrequency, &remainder); -#endif return microseconds; } @@ -159,12 +153,7 @@ uint64 PPCTimer_getFromRDTSC() #endif uint64 remainder; -#if defined(_MSC_VER) && _MSC_VER >= 1923 && !defined(__clang__) uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder); -#else - uint64 elapsedTick = udiv128(_rdtscAcc.low, _rdtscAcc.high, _rdtscFrequency, &remainder); -#endif - _rdtscAcc.low = remainder; _rdtscAcc.high = 0; diff --git a/src/Common/precompiled.h b/src/Common/precompiled.h index 795bc351..361f4a5d 100644 --- a/src/Common/precompiled.h +++ b/src/Common/precompiled.h @@ -210,6 +210,16 @@ typedef union _LARGE_INTEGER { inline T& operator^= (T& a, T b) { return reinterpret_cast( reinterpret_cast::type&>(a) ^= static_cast::type>(b) ); } #endif +#if !defined(_MSC_VER) || defined(__clang__) // clang-cl does not support _udiv128 +inline uint64 _udiv128(uint64 highDividend, uint64 lowDividend, uint64 divisor, uint64 *remainder) +{ + unsigned __int128 dividend128 = (((unsigned __int128)highDividend) << 64) | ((unsigned __int128)lowDividend); + unsigned __int128 divisor128 = (unsigned __int128)divisor; + *remainder = (uint64)((dividend128 % divisor128) & 0xFFFFFFFFFFFFFFFF); + return (uint64)((dividend128 / divisor128) & 0xFFFFFFFFFFFFFFFF); +} +#endif + #if defined(_MSC_VER) #define UNREACHABLE __assume(false) #elif defined(__GNUC__)