Signed-off-by: Zebediah Figura z.figura12@gmail.com --- include/winnt.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-)
diff --git a/include/winnt.h b/include/winnt.h index 4283f354552..ba0bf15322c 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -6983,7 +6983,50 @@ static FORCEINLINE void * WINAPI InterlockedExchangePointer( void *volatile *des return (void *)_InterlockedExchange( (long volatile*)dest, (long)val ); }
-#endif +#endif /* __i386__ */ + +#ifdef __i386__ + +static FORCEINLINE void MemoryBarrier(void) +{ + LONG dummy; + InterlockedOr(&dummy, 0); +} + +#elif defined(__x86_64__) + +#pragma intrinsic(__faststorefence) + +void __faststorefence(void); + +static FORCEINLINE void MemoryBarrier(void) +{ + __faststorefence(); +} + +#elif defined(__arm__) + +#pragma intrinsic(__dmb) + +void __dmb(void); + +static FORCEINLINE void MemoryBarrier(void) +{ + __dmb(_ARM_BARRIER_SY); +} + +#elif defined(__aarch64__) + +#pragma intrinsic(__dmb) + +void __dmb(void); + +static FORCEINLINE void MemoryBarrier(void) +{ + __dmb(_ARM64_BARRIER_SY); +} + +#endif /* __i386__ */
#elif defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
@@ -7043,6 +7086,11 @@ static FORCEINLINE LONG WINAPI InterlockedOr( LONG volatile *dest, LONG val ) return __atomic_fetch_or( dest, val, __ATOMIC_SEQ_CST ); }
+static FORCEINLINE void MemoryBarrier(void) +{ + __atomic_thread_fence( __ATOMIC_SEQ_CST ); +} + #elif defined(__GNUC__)
static FORCEINLINE LONG WINAPI InterlockedCompareExchange( LONG volatile *dest, LONG xchg, LONG compare ) @@ -7112,6 +7160,11 @@ static FORCEINLINE LONG WINAPI InterlockedOr( LONG volatile *dest, LONG incr ) return __sync_fetch_and_or( dest, incr ); }
+static FORCEINLINE void MemoryBarrier(void) +{ + __sync_synchronize(); +} + #endif /* __GNUC__ */
#ifdef __cplusplus