[PATCH v2 5/5] include: Add MemoryBarrier().

Zebediah Figura z.figura12 at gmail.com
Fri Jan 15 01:22: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 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
-- 
2.29.2




More information about the wine-devel mailing list