diff options
Diffstat (limited to 'src/common/x64/native_clock.cpp')
| -rw-r--r-- | src/common/x64/native_clock.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp index 488c8c905..c0d38cf6b 100644 --- a/src/common/x64/native_clock.cpp +++ b/src/common/x64/native_clock.cpp | |||
| @@ -65,10 +65,8 @@ NativeClock::NativeClock(u64 emulated_cpu_frequency_, u64 emulated_clock_frequen | |||
| 65 | u64 rtsc_frequency_) | 65 | u64 rtsc_frequency_) |
| 66 | : WallClock(emulated_cpu_frequency_, emulated_clock_frequency_, true), rtsc_frequency{ | 66 | : WallClock(emulated_cpu_frequency_, emulated_clock_frequency_, true), rtsc_frequency{ |
| 67 | rtsc_frequency_} { | 67 | rtsc_frequency_} { |
| 68 | TimePoint new_time_point{}; | 68 | time_point.inner.last_measure = FencedRDTSC(); |
| 69 | new_time_point.last_measure = FencedRDTSC(); | 69 | time_point.inner.accumulated_ticks = 0U; |
| 70 | new_time_point.accumulated_ticks = 0U; | ||
| 71 | time_point.store(new_time_point); | ||
| 72 | ns_rtsc_factor = GetFixedPoint64Factor(NS_RATIO, rtsc_frequency); | 70 | ns_rtsc_factor = GetFixedPoint64Factor(NS_RATIO, rtsc_frequency); |
| 73 | us_rtsc_factor = GetFixedPoint64Factor(US_RATIO, rtsc_frequency); | 71 | us_rtsc_factor = GetFixedPoint64Factor(US_RATIO, rtsc_frequency); |
| 74 | ms_rtsc_factor = GetFixedPoint64Factor(MS_RATIO, rtsc_frequency); | 72 | ms_rtsc_factor = GetFixedPoint64Factor(MS_RATIO, rtsc_frequency); |
| @@ -77,32 +75,35 @@ NativeClock::NativeClock(u64 emulated_cpu_frequency_, u64 emulated_clock_frequen | |||
| 77 | } | 75 | } |
| 78 | 76 | ||
| 79 | u64 NativeClock::GetRTSC() { | 77 | u64 NativeClock::GetRTSC() { |
| 78 | TimePoint current_time_point{}; | ||
| 80 | TimePoint new_time_point{}; | 79 | TimePoint new_time_point{}; |
| 81 | TimePoint current_time_point = time_point.load(std::memory_order_acquire); | 80 | |
| 81 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 82 | do { | 82 | do { |
| 83 | const u64 current_measure = FencedRDTSC(); | 83 | const u64 current_measure = FencedRDTSC(); |
| 84 | u64 diff = current_measure - current_time_point.last_measure; | 84 | u64 diff = current_measure - current_time_point.inner.last_measure; |
| 85 | diff = diff & ~static_cast<u64>(static_cast<s64>(diff) >> 63); // max(diff, 0) | 85 | diff = diff & ~static_cast<u64>(static_cast<s64>(diff) >> 63); // max(diff, 0) |
| 86 | new_time_point.last_measure = current_measure > current_time_point.last_measure | 86 | new_time_point.inner.last_measure = current_measure > current_time_point.inner.last_measure |
| 87 | ? current_measure | 87 | ? current_measure |
| 88 | : current_time_point.last_measure; | 88 | : current_time_point.inner.last_measure; |
| 89 | new_time_point.accumulated_ticks = current_time_point.accumulated_ticks + diff; | 89 | new_time_point.inner.accumulated_ticks = current_time_point.inner.accumulated_ticks + diff; |
| 90 | } while (!time_point.compare_exchange_weak( | 90 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, |
| 91 | current_time_point, new_time_point, std::memory_order_release, std::memory_order_acquire)); | 91 | current_time_point.pack, current_time_point.pack)); |
| 92 | /// The clock cannot be more precise than the guest timer, remove the lower bits | 92 | /// The clock cannot be more precise than the guest timer, remove the lower bits |
| 93 | return new_time_point.accumulated_ticks; | 93 | return new_time_point.inner.accumulated_ticks; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | void NativeClock::Pause(bool is_paused) { | 96 | void NativeClock::Pause(bool is_paused) { |
| 97 | if (!is_paused) { | 97 | if (!is_paused) { |
| 98 | TimePoint current_time_point{}; | ||
| 98 | TimePoint new_time_point{}; | 99 | TimePoint new_time_point{}; |
| 99 | TimePoint current_time_point = time_point.load(std::memory_order_acquire); | 100 | |
| 101 | current_time_point.pack = Common::AtomicLoad128(time_point.pack.data()); | ||
| 100 | do { | 102 | do { |
| 101 | new_time_point = current_time_point; | 103 | new_time_point.pack = current_time_point.pack; |
| 102 | new_time_point.last_measure = FencedRDTSC(); | 104 | new_time_point.inner.last_measure = FencedRDTSC(); |
| 103 | } while (!time_point.compare_exchange_weak(current_time_point, new_time_point, | 105 | } while (!Common::AtomicCompareAndSwap(time_point.pack.data(), new_time_point.pack, |
| 104 | std::memory_order_release, | 106 | current_time_point.pack, current_time_point.pack)); |
| 105 | std::memory_order_acquire)); | ||
| 106 | } | 107 | } |
| 107 | } | 108 | } |
| 108 | 109 | ||