better mwaitx

This commit is contained in:
lizzie 2026-05-24 04:33:49 +00:00
parent 2146f2b84d
commit 94a34999a8

View file

@ -183,8 +183,7 @@ bool Event::WaitFor(const std::chrono::nanoseconds time) {
_mm_monitorx(reinterpret_cast<u64*>(std::addressof(is_set)), 0, 0); _mm_monitorx(reinterpret_cast<u64*>(std::addressof(is_set)), 0, 0);
if (!is_set.load()) { if (!is_set.load()) {
// RDTSC may be fenced here due to atomic load // RDTSC may be fenced here due to atomic load
s32 const cycles = std::min<s64>(std::numeric_limits<s32>::max(), s64(_rdtsc()) - s64(start)); u32 const cycles = std::min<u32>(std::numeric_limits<u32>::max(), s64(end) - s64(start));
if (cycles > 0) {
// See here: https://github.com/torvalds/linux/blob/948a64995aca6820abefd17f1a4258f5835c5ad9/arch/x86/lib/delay.c#L93 // See here: https://github.com/torvalds/linux/blob/948a64995aca6820abefd17f1a4258f5835c5ad9/arch/x86/lib/delay.c#L93
// MWAITX accepts a 32-bit input timer which determines the total number of cycles to wait for // MWAITX accepts a 32-bit input timer which determines the total number of cycles to wait for
// NOT THE TOTAL ABSOLUTE TSC VALUE, it's just a delta // NOT THE TOTAL ABSOLUTE TSC VALUE, it's just a delta
@ -193,9 +192,6 @@ bool Event::WaitFor(const std::chrono::nanoseconds time) {
_mm_mwaitx(1 << 1, 0u, cycles); _mm_mwaitx(1 << 1, 0u, cycles);
if (!is_set.load()) if (!is_set.load())
return false; return false;
} else {
return false;
}
} }
bool expected = true; bool expected = true;
if (is_set.compare_exchange_weak(expected, false, std::memory_order_release)) if (is_set.compare_exchange_weak(expected, false, std::memory_order_release))