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_
17 static inline void mono_memory_barrier (void)
19 __asm__
__volatile__ ("mfence" : : : "memory");
22 static inline void mono_memory_read_barrier (void)
24 __asm__
__volatile__ ("lfence" : : : "memory");
27 static inline void mono_memory_write_barrier (void)
29 __asm__
__volatile__ ("sfence" : : : "memory");
34 static inline void mono_memory_barrier (void)
39 static inline void mono_memory_read_barrier (void)
44 static inline void mono_memory_write_barrier (void)
49 #elif defined(__i386__)
51 static inline void mono_memory_barrier (void)
53 __asm__
__volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
56 static inline void mono_memory_read_barrier (void)
58 mono_memory_barrier ();
61 static inline void mono_memory_write_barrier (void)
63 mono_memory_barrier ();
68 static inline void mono_memory_barrier (void)
73 static inline void mono_memory_read_barrier (void)
78 static inline void mono_memory_write_barrier (void)
83 #elif defined(sparc) || defined(__sparc__)
84 static inline void mono_memory_barrier (void)
86 __asm__
__volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
89 static inline void mono_memory_read_barrier (void)
91 __asm__
__volatile__ ("membar #LoadLoad" : : : "memory");
94 static inline void mono_memory_write_barrier (void)
96 __asm__
__volatile__ ("membar #StoreStore" : : : "memory");
98 #elif defined(__s390__)
99 static inline void mono_memory_barrier (void)
101 __asm__
__volatile__ ("bcr 15,0" : : : "memory");
104 static inline void mono_memory_read_barrier (void)
106 mono_memory_barrier ();
109 static inline void mono_memory_write_barrier (void)
111 mono_memory_barrier ();
113 #elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)
114 static inline void mono_memory_barrier (void)
116 __asm__
__volatile__ ("sync" : : : "memory");
119 static inline void mono_memory_read_barrier (void)
121 mono_memory_barrier ();
124 static inline void mono_memory_write_barrier (void)
126 __asm__
__volatile__ ("eieio" : : : "memory");
129 #elif defined(__arm__)
130 static inline void mono_memory_barrier (void)
132 __asm__
__volatile__ ("" : : : "memory");
135 static inline void mono_memory_read_barrier (void)
137 mono_memory_barrier ();
140 static inline void mono_memory_write_barrier (void)
142 mono_memory_barrier ();
144 #elif defined(__ia64__)
145 static inline void mono_memory_barrier (void)
147 __asm__
__volatile__ ("mf" : : : "memory");
150 static inline void mono_memory_read_barrier (void)
152 mono_memory_barrier ();
155 static inline void mono_memory_write_barrier (void)
157 mono_memory_barrier ();
159 #elif defined(__alpha__)
160 static inline void mono_memory_barrier (void)
162 __asm__
__volatile__ ("mb" : : : "memory");
165 static inline void mono_memory_read_barrier (void)
167 mono_memory_barrier ();
170 static inline void mono_memory_write_barrier (void)
172 mono_memory_barrier ();
174 #elif defined(__mips__)
175 static inline void mono_memory_barrier (void)
177 __asm__
__volatile__ ("" : : : "memory");
180 static inline void mono_memory_read_barrier (void)
182 mono_memory_barrier ();
185 static inline void mono_memory_write_barrier (void)
187 mono_memory_barrier ();
189 #elif defined(MONO_CROSS_COMPILE)
190 static inline void mono_memory_barrier (void)
194 static inline void mono_memory_read_barrier (void)
198 static inline void mono_memory_write_barrier (void)
203 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */