#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");
{
__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");
{
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)
{
{
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");
#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)
{
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_ */