diff options
| author | 2022-04-02 21:05:49 +0100 | |
|---|---|---|
| committer | 2022-04-02 22:22:48 +0100 | |
| commit | 979e53b87b5288c582392beff618da978ca4152c (patch) | |
| tree | 791c5fdcc52e9650ebafce30ca4c51b317aa133f /src/common/x64 | |
| parent | atomic_ops: Implement AtomicCompareAndSwap with writeback (diff) | |
| download | yuzu-979e53b87b5288c582392beff618da978ca4152c.tar.gz yuzu-979e53b87b5288c582392beff618da978ca4152c.tar.xz yuzu-979e53b87b5288c582392beff618da978ca4152c.zip | |
native_clock: Use writeback from CAS to avoid double-loading
Diffstat (limited to 'src/common/x64')
| -rw-r--r-- | src/common/x64/native_clock.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp index 2a2664e5d..7a3f21dcf 100644 --- a/src/common/x64/native_clock.cpp +++ b/src/common/x64/native_clock.cpp | |||
| @@ -55,8 +55,9 @@ NativeClock::NativeClock(u64 emulated_cpu_frequency_, u64 emulated_clock_frequen | |||
| 55 | u64 NativeClock::GetRTSC() { | 55 | u64 NativeClock::GetRTSC() { |
| 56 | TimePoint new_time_point{}; | 56 | TimePoint new_time_point{}; |
| 57 | TimePoint current_time_point{}; | 57 | TimePoint current_time_point{}; |
| 58 | |||
| 59 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 58 | do { | 60 | do { |
| 59 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 60 | _mm_mfence(); | 61 | _mm_mfence(); |
| 61 | const u64 current_measure = __rdtsc(); | 62 | const u64 current_measure = __rdtsc(); |
| 62 | u64 diff = current_measure - current_time_point.inner.last_measure; | 63 | u64 diff = current_measure - current_time_point.inner.last_measure; |
| @@ -66,7 +67,7 @@ u64 NativeClock::GetRTSC() { | |||
| 66 | : current_time_point.inner.last_measure; | 67 | : current_time_point.inner.last_measure; |
| 67 | new_time_point.inner.accumulated_ticks = current_time_point.inner.accumulated_ticks + diff; | 68 | new_time_point.inner.accumulated_ticks = current_time_point.inner.accumulated_ticks + diff; |
| 68 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, | 69 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, |
| 69 | current_time_point.pack)); | 70 | current_time_point.pack, current_time_point.pack)); |
| 70 | /// The clock cannot be more precise than the guest timer, remove the lower bits | 71 | /// The clock cannot be more precise than the guest timer, remove the lower bits |
| 71 | return new_time_point.inner.accumulated_ticks & inaccuracy_mask; | 72 | return new_time_point.inner.accumulated_ticks & inaccuracy_mask; |
| 72 | } | 73 | } |
| @@ -75,13 +76,14 @@ void NativeClock::Pause(bool is_paused) { | |||
| 75 | if (!is_paused) { | 76 | if (!is_paused) { |
| 76 | TimePoint current_time_point{}; | 77 | TimePoint current_time_point{}; |
| 77 | TimePoint new_time_point{}; | 78 | TimePoint new_time_point{}; |
| 79 | |||
| 80 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 78 | do { | 81 | do { |
| 79 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 80 | new_time_point.pack = current_time_point.pack; | 82 | new_time_point.pack = current_time_point.pack; |
| 81 | _mm_mfence(); | 83 | _mm_mfence(); |
| 82 | new_time_point.inner.last_measure = __rdtsc(); | 84 | new_time_point.inner.last_measure = __rdtsc(); |
| 83 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, | 85 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, |
| 84 | current_time_point.pack)); | 86 | current_time_point.pack, current_time_point.pack)); |
| 85 | } | 87 | } |
| 86 | } | 88 | } |
| 87 | 89 | ||