mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-11-29 12:34:17 +01:00
Cleanup udiv128 (#206)
This commit is contained in:
parent
4eaa600b57
commit
6cdb6eed17
@ -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;
|
||||||
|
@ -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__)
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user