From 07cff27fa214733dab66d77fe925f498a4cf7ffb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sat, 25 Oct 2025 17:04:23 -0700 Subject: [PATCH] SpinWaitLock: Adds one-shot WFE helper --- FEXCore/Source/Utils/SpinWaitLock.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/FEXCore/Source/Utils/SpinWaitLock.h b/FEXCore/Source/Utils/SpinWaitLock.h index 41ab7b49e..9560b4118 100644 --- a/FEXCore/Source/Utils/SpinWaitLock.h +++ b/FEXCore/Source/Utils/SpinWaitLock.h @@ -186,6 +186,26 @@ template bool Wait(uint16_t*, uint16_t, const std::chrono::nanoseconds template bool Wait(uint32_t*, uint32_t, const std::chrono::nanoseconds&); template bool Wait(uint64_t*, uint64_t, const std::chrono::nanoseconds&); +template +static inline T OneShotWFEBitComparison(T* Futex, T Mask, T Comp) { + auto AtomicFutex = std::atomic_ref(*Futex); + T Result = AtomicFutex.load(); + + // Early exit if possible. + if ((Result & Mask) == Comp) { + return Result; + } + + Result = LoadExclusive(Futex); + if ((Result & Mask) == Comp) { + return Result; + } + + // Waits for write and returns result. + Result = WFELoadAtomic(Futex); + return Result; +} + #else template static inline void Wait(T* Futex, TT ExpectedValue) {