Check for TARGET_* defines in addition to compiler specific arch defines.
[mono.git] / mono / utils / mono-membar.h
index 381ee743f8ba9a66aa8a15d74e7b028a8cb9d2dd..80dfd2f5995d60fcb017755c97b397c169b9309e 100644 (file)
 #ifndef _MONO_UTILS_MONO_MEMBAR_H_
 #define _MONO_UTILS_MONO_MEMBAR_H_
 
-#ifdef __x86_64__
+#include <config.h>
+
+#include <glib.h>
+
+#if defined(__x86_64__) || defined(TARGET_AMD64)
+#ifndef _MSC_VER
 static inline void mono_memory_barrier (void)
 {
        __asm__ __volatile__ ("mfence" : : : "memory");
@@ -25,7 +30,26 @@ static inline void mono_memory_write_barrier (void)
 {
        __asm__ __volatile__ ("sfence" : : : "memory");
 }
-#elif defined(__i386__)
+#else
+#include <intrin.h>
+
+static inline void mono_memory_barrier (void)
+{
+       _ReadWriteBarrier ();
+}
+
+static inline void mono_memory_read_barrier (void)
+{
+       _ReadBarrier ();
+}
+
+static inline void mono_memory_write_barrier (void)
+{
+       _WriteBarrier ();
+}
+#endif
+#elif defined(__i386__) || defined(TARGET_X86)
+#ifndef _MSC_VER
 static inline void mono_memory_barrier (void)
 {
        __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
@@ -40,6 +64,24 @@ static inline void mono_memory_write_barrier (void)
 {
        mono_memory_barrier ();
 }
+#else
+#include <intrin.h>
+
+static inline void mono_memory_barrier (void)
+{
+       _ReadWriteBarrier ();
+}
+
+static inline void mono_memory_read_barrier (void)
+{
+       _ReadBarrier ();
+}
+
+static inline void mono_memory_write_barrier (void)
+{
+       _WriteBarrier ();
+}
+#endif
 #elif defined(sparc) || defined(__sparc__)
 static inline void mono_memory_barrier (void)
 {
@@ -70,7 +112,7 @@ static inline void mono_memory_write_barrier (void)
 {
        mono_memory_barrier ();
 }
-#elif defined(__ppc__) || defined(__powerpc__)
+#elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)
 static inline void mono_memory_barrier (void)
 {
        __asm__ __volatile__ ("sync" : : : "memory");
@@ -89,8 +131,9 @@ static inline void mono_memory_write_barrier (void)
 #elif defined(__arm__)
 static inline void mono_memory_barrier (void)
 {
-       __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5"
-                             : : "r" (0) : "memory");
+#ifdef HAVE_ARMV6
+       __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory");
+#endif
 }
 
 static inline void mono_memory_read_barrier (void)
@@ -117,6 +160,48 @@ static inline void mono_memory_write_barrier (void)
 {
        mono_memory_barrier ();
 }
+#elif defined(__alpha__)
+static inline void mono_memory_barrier (void)
+{
+        __asm__ __volatile__ ("mb" : : : "memory");
+}
+
+static inline void mono_memory_read_barrier (void)
+{
+        mono_memory_barrier ();
+}
+
+static inline void mono_memory_write_barrier (void)
+{
+        mono_memory_barrier ();
+}
+#elif defined(__mips__)
+static inline void mono_memory_barrier (void)
+{
+        __asm__ __volatile__ ("" : : : "memory");
+}
+
+static inline void mono_memory_read_barrier (void)
+{
+        mono_memory_barrier ();
+}
+
+static inline void mono_memory_write_barrier (void)
+{
+        mono_memory_barrier ();
+}
+#elif defined(MONO_CROSS_COMPILE)
+static inline void mono_memory_barrier (void)
+{
+}
+
+static inline void mono_memory_read_barrier (void)
+{
+}
+
+static inline void mono_memory_write_barrier (void)
+{
+}
 #endif
 
 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */