summaryrefslogtreecommitdiff
path: root/src/common/x64/cpu_wait.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/x64/cpu_wait.cpp')
-rw-r--r--src/common/x64/cpu_wait.cpp11
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
39static void TPAUSE() { 43static 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