2 * mono-membar.h: Memory barrier inline functions
5 * Mark Probst (mark.probst@gmail.com)
10 #ifndef _MONO_UTILS_MONO_MEMBAR_H_
11 #define _MONO_UTILS_MONO_MEMBAR_H_
21 static inline void mono_memory_barrier (void)
23 /* NOTE: _ReadWriteBarrier and friends only prevent the
24 compiler from reordering loads and stores. To prevent
25 the CPU from doing the same, we have to use the
26 MemoryBarrier macro which expands to e.g. a serializing
27 XCHG instruction on x86. Also note that the MemoryBarrier
28 macro does *not* imply _ReadWriteBarrier, so that call
29 cannot be eliminated. */
34 static inline void mono_memory_read_barrier (void)
40 static inline void mono_memory_write_barrier (void)
45 #elif defined(__WIN32__) || defined(_WIN32)
48 /* Since we only support GCC 3.x in Cygwin for
49 some arcane reason, we have to use inline
50 assembly to get fences (__sync_synchronize
53 static inline void mono_memory_barrier (void)
55 __asm__ __volatile__ (
57 "addl\t$0,0(%%esp)\n\t"
64 static inline void mono_memory_read_barrier (void)
66 mono_memory_barrier ();
69 static inline void mono_memory_write_barrier (void)
71 mono_memory_barrier ();
73 #elif defined(USE_GCC_ATOMIC_OPS)
74 static inline void mono_memory_barrier (void)
76 __sync_synchronize ();
79 static inline void mono_memory_read_barrier (void)
81 mono_memory_barrier ();
84 static inline void mono_memory_write_barrier (void)
86 mono_memory_barrier ();
88 #elif defined(sparc) || defined(__sparc__)
89 static inline void mono_memory_barrier (void)
91 __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
94 static inline void mono_memory_read_barrier (void)
96 __asm__ __volatile__ ("membar #LoadLoad" : : : "memory");
99 static inline void mono_memory_write_barrier (void)
101 __asm__ __volatile__ ("membar #StoreStore" : : : "memory");
103 #elif defined(__s390__)
104 static inline void mono_memory_barrier (void)
106 __asm__ __volatile__ ("bcr 15,0" : : : "memory");
109 static inline void mono_memory_read_barrier (void)
111 mono_memory_barrier ();
114 static inline void mono_memory_write_barrier (void)
116 mono_memory_barrier ();
118 #elif defined(__ia64__)
119 static inline void mono_memory_barrier (void)
121 __asm__ __volatile__ ("mf" : : : "memory");
124 static inline void mono_memory_read_barrier (void)
126 mono_memory_barrier ();
129 static inline void mono_memory_write_barrier (void)
131 mono_memory_barrier ();
133 #elif defined(MONO_CROSS_COMPILE)
134 static inline void mono_memory_barrier (void)
138 static inline void mono_memory_read_barrier (void)
142 static inline void mono_memory_write_barrier (void)
147 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */