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_
18 #ifndef WIN32_LEAN_AND_MEAN
19 #define WIN32_LEAN_AND_MEAN
24 static inline void mono_memory_barrier (void)
26 /* NOTE: _ReadWriteBarrier and friends only prevent the
27 compiler from reordering loads and stores. To prevent
28 the CPU from doing the same, we have to use the
29 MemoryBarrier macro which expands to e.g. a serializing
30 XCHG instruction on x86. Also note that the MemoryBarrier
31 macro does *not* imply _ReadWriteBarrier, so that call
32 cannot be eliminated. */
37 static inline void mono_memory_read_barrier (void)
43 static inline void mono_memory_write_barrier (void)
48 #elif defined(__WIN32__) || defined(_WIN32)
51 /* Since we only support GCC 3.x in Cygwin for
52 some arcane reason, we have to use inline
53 assembly to get fences (__sync_synchronize
56 static inline void mono_memory_barrier (void)
58 __asm__ __volatile__ (
60 "addl\t$0,0(%%esp)\n\t"
67 static inline void mono_memory_read_barrier (void)
69 mono_memory_barrier ();
72 static inline void mono_memory_write_barrier (void)
74 mono_memory_barrier ();
76 #elif defined(USE_GCC_ATOMIC_OPS)
77 static inline void mono_memory_barrier (void)
79 __sync_synchronize ();
82 static inline void mono_memory_read_barrier (void)
84 mono_memory_barrier ();
87 static inline void mono_memory_write_barrier (void)
89 mono_memory_barrier ();
91 #elif defined(sparc) || defined(__sparc__)
92 static inline void mono_memory_barrier (void)
94 __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
97 static inline void mono_memory_read_barrier (void)
99 __asm__ __volatile__ ("membar #LoadLoad" : : : "memory");
102 static inline void mono_memory_write_barrier (void)
104 __asm__ __volatile__ ("membar #StoreStore" : : : "memory");
106 #elif defined(__s390__)
107 static inline void mono_memory_barrier (void)
109 __asm__ __volatile__ ("bcr 15,0" : : : "memory");
112 static inline void mono_memory_read_barrier (void)
114 mono_memory_barrier ();
117 static inline void mono_memory_write_barrier (void)
119 mono_memory_barrier ();
121 #elif defined(__ia64__)
122 static inline void mono_memory_barrier (void)
124 __asm__ __volatile__ ("mf" : : : "memory");
127 static inline void mono_memory_read_barrier (void)
129 mono_memory_barrier ();
132 static inline void mono_memory_write_barrier (void)
134 mono_memory_barrier ();
136 #elif defined(MONO_CROSS_COMPILE)
137 static inline void mono_memory_barrier (void)
141 static inline void mono_memory_read_barrier (void)
145 static inline void mono_memory_write_barrier (void)
149 #error "Don't know how to do memory barriers!"
152 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */