diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2023-06-28 07:19:41 +0200 |
---|---|---|
committer | Morph <39850852+Morph1984@users.noreply.github.com> | 2023-06-28 07:39:06 +0200 |
commit | 2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67 (patch) | |
tree | f2e3ba00eb7cd7757d1f027f2e5f0cf5d9a73625 /src/common | |
parent | x64: cpu_wait: Make use of MWAITX in MicroSleep (diff) | |
download | yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.gz yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.bz2 yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.lz yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.xz yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.zst yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.zip |
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/x64/cpu_wait.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/common/x64/cpu_wait.cpp b/src/common/x64/cpu_wait.cpp index 11b9c4d83..ea16c8490 100644 --- a/src/common/x64/cpu_wait.cpp +++ b/src/common/x64/cpu_wait.cpp @@ -26,21 +26,26 @@ constexpr auto PauseCycles = 100'000U; #ifdef _MSC_VER __forceinline static void TPAUSE() { - _tpause(0, FencedRDTSC() + PauseCycles); + static constexpr auto RequestC02State = 0U; + _tpause(RequestC02State, FencedRDTSC() + PauseCycles); } __forceinline static void MWAITX() { + static constexpr auto EnableWaitTimeFlag = 1U << 1; + static constexpr auto RequestC1State = 0U; + // monitor_var should be aligned to a cache line. alignas(64) u64 monitor_var{}; _mm_monitorx(&monitor_var, 0, 0); - _mm_mwaitx(/* extensions*/ 2, /* hints */ 0, /* cycles */ PauseCycles); + _mm_mwaitx(EnableWaitTimeFlag, RequestC1State, PauseCycles); } #else static void TPAUSE() { + static constexpr auto RequestC02State = 0U; const auto tsc = FencedRDTSC() + PauseCycles; const auto eax = static_cast<u32>(tsc & 0xFFFFFFFF); const auto edx = static_cast<u32>(tsc >> 32); - asm volatile("tpause %0" : : "r"(0), "d"(edx), "a"(eax)); + asm volatile("tpause %0" : : "r"(RequestC02State), "d"(edx), "a"(eax)); } #endif |