diff options
| author | 2023-06-28 01:19:41 -0400 | |
|---|---|---|
| committer | 2023-06-28 01:39:06 -0400 | |
| commit | 2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67 (patch) | |
| tree | f2e3ba00eb7cd7757d1f027f2e5f0cf5d9a73625 /src | |
| parent | x64: cpu_wait: Make use of MWAITX in MicroSleep (diff) | |
| download | yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.gz yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.tar.xz yuzu-2b68a3cbbf144b97aa524eb1dd17aad34cdf1a67.zip | |
x64: cpu_wait: Remove magic values
Diffstat (limited to 'src')
| -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; | |||
| 26 | 26 | ||
| 27 | #ifdef _MSC_VER | 27 | #ifdef _MSC_VER |
| 28 | __forceinline static void TPAUSE() { | 28 | __forceinline static void TPAUSE() { |
| 29 | _tpause(0, FencedRDTSC() + PauseCycles); | 29 | static constexpr auto RequestC02State = 0U; |
| 30 | _tpause(RequestC02State, FencedRDTSC() + PauseCycles); | ||
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | __forceinline static void MWAITX() { | 33 | __forceinline static void MWAITX() { |
| 34 | static constexpr auto EnableWaitTimeFlag = 1U << 1; | ||
| 35 | static constexpr auto RequestC1State = 0U; | ||
| 36 | |||
| 33 | // monitor_var should be aligned to a cache line. | 37 | // monitor_var should be aligned to a cache line. |
| 34 | alignas(64) u64 monitor_var{}; | 38 | alignas(64) u64 monitor_var{}; |
| 35 | _mm_monitorx(&monitor_var, 0, 0); | 39 | _mm_monitorx(&monitor_var, 0, 0); |
| 36 | _mm_mwaitx(/* extensions*/ 2, /* hints */ 0, /* cycles */ PauseCycles); | 40 | _mm_mwaitx(EnableWaitTimeFlag, RequestC1State, PauseCycles); |
| 37 | } | 41 | } |
| 38 | #else | 42 | #else |
| 39 | static void TPAUSE() { | 43 | static void TPAUSE() { |
| 44 | static constexpr auto RequestC02State = 0U; | ||
| 40 | const auto tsc = FencedRDTSC() + PauseCycles; | 45 | const auto tsc = FencedRDTSC() + PauseCycles; |
| 41 | const auto eax = static_cast<u32>(tsc & 0xFFFFFFFF); | 46 | const auto eax = static_cast<u32>(tsc & 0xFFFFFFFF); |
| 42 | const auto edx = static_cast<u32>(tsc >> 32); | 47 | const auto edx = static_cast<u32>(tsc >> 32); |
| 43 | asm volatile("tpause %0" : : "r"(0), "d"(edx), "a"(eax)); | 48 | asm volatile("tpause %0" : : "r"(RequestC02State), "d"(edx), "a"(eax)); |
| 44 | } | 49 | } |
| 45 | #endif | 50 | #endif |
| 46 | 51 | ||