Cleanup udiv128 (#206)

This commit is contained in:
Tom Lally 2022-09-08 01:12:53 +01:00 committed by GitHub
parent 4eaa600b57
commit 6cdb6eed17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 9 additions and 19 deletions

View File

@ -108,14 +108,8 @@ uint64 PPCTimer_tscToMicroseconds(uint64 us)
uint128_t r{}; uint128_t r{};
r.low = _umul128(us, 1000000ULL, &r.high); r.low = _umul128(us, 1000000ULL, &r.high);
uint64 remainder; uint64 remainder;
#if defined(_MSC_VER) && _MSC_VER >= 1923 && !defined(__clang__)
const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder); const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder);
#else
const uint64 microseconds = udiv128(r.low, r.high, _rdtscFrequency, &remainder);
#endif
return microseconds; return microseconds;
} }
@ -159,12 +153,7 @@ uint64 PPCTimer_getFromRDTSC()
#endif #endif
uint64 remainder; uint64 remainder;
#if defined(_MSC_VER) && _MSC_VER >= 1923 && !defined(__clang__)
uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder); uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder);
#else
uint64 elapsedTick = udiv128(_rdtscAcc.low, _rdtscAcc.high, _rdtscFrequency, &remainder);
#endif
_rdtscAcc.low = remainder; _rdtscAcc.low = remainder;
_rdtscAcc.high = 0; _rdtscAcc.high = 0;

View File

@ -210,6 +210,15 @@ typedef union _LARGE_INTEGER {
inline T& operator^= (T& a, T b) { return reinterpret_cast<T&>( reinterpret_cast<std::underlying_type<T>::type&>(a) ^= static_cast<std::underlying_type<T>::type>(b) ); } inline T& operator^= (T& a, T b) { return reinterpret_cast<T&>( reinterpret_cast<std::underlying_type<T>::type&>(a) ^= static_cast<std::underlying_type<T>::type>(b) ); }
#endif #endif
#if !defined(_MSC_VER) || defined(__clang__) // clang-cl does not have built-in _udiv128
inline uint64 _udiv128(uint64 highDividend, uint64 lowDividend, uint64 divisor, uint64 *remainder)
{
unsigned __int128 dividend = (((unsigned __int128)highDividend) << 64) | ((unsigned __int128)lowDividend);
*remainder = (uint64)((dividend % divisor) & 0xFFFFFFFFFFFFFFFF);
return (uint64)((dividend / divisor) & 0xFFFFFFFFFFFFFFFF);
}
#endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define UNREACHABLE __assume(false) #define UNREACHABLE __assume(false)
#elif defined(__GNUC__) #elif defined(__GNUC__)

View File

@ -1,5 +1,4 @@
#pragma once #pragma once
extern "C" uint64 ATTR_MS_ABI udiv128(uint64 low, uint64 hi, uint64 divisor, uint64 *remainder);
extern "C" void recompiler_fres(); extern "C" void recompiler_fres();
extern "C" void recompiler_frsqrte(); extern "C" void recompiler_frsqrte();

View File

@ -1,12 +1,5 @@
.code .code
udiv128 PROC
mov rax, rcx
div r8
mov [r9], rdx
ret
udiv128 ENDP
recompiler_fres PROC recompiler_fres PROC
; store all modified registers ; store all modified registers
push rdx push rdx