diff options
Diffstat (limited to 'src/common/x64/cpu_wait.cpp')
| -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 | ||