[PATCH 5/5] include: Add MemoryBarrier().
Zebediah Figura
z.figura12 at gmail.com
Thu Jan 14 10:35:06 CST 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
include/winnt.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 54 insertions(+), 1 deletion(-)
diff --git a/include/winnt.h b/include/winnt.h
index 7c03453560a..bd133263b03 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)))
@@ -7042,6 +7085,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 )
@@ -7111,6 +7159,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
--
2.29.2
More information about the wine-devel
mailing list