[PATCH v3 4/4] include: Add MemoryBarrier().

Zebediah Figura z.figura12 at gmail.com
Mon Jan 18 21:55:03 CST 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 include/winnt.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/include/winnt.h b/include/winnt.h
index db3c91b3d0f..e65df6203cd 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__)
 
@@ -7058,6 +7101,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