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_
19 static inline void mono_memory_barrier (void)
21 __asm__ __volatile__ ("mfence" : : : "memory");
24 static inline void mono_memory_read_barrier (void)
26 __asm__ __volatile__ ("lfence" : : : "memory");
29 static inline void mono_memory_write_barrier (void)
31 __asm__ __volatile__ ("sfence" : : : "memory");
36 static inline void mono_memory_barrier (void)
41 static inline void mono_memory_read_barrier (void)
46 static inline void mono_memory_write_barrier (void)
51 #elif defined(__i386__)
53 static inline void mono_memory_barrier (void)
55 __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
58 static inline void mono_memory_read_barrier (void)
60 mono_memory_barrier ();
63 static inline void mono_memory_write_barrier (void)
65 mono_memory_barrier ();
70 static inline void mono_memory_barrier (void)
75 static inline void mono_memory_read_barrier (void)
80 static inline void mono_memory_write_barrier (void)
85 #elif defined(sparc) || defined(__sparc__)
86 static inline void mono_memory_barrier (void)
88 __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
91 static inline void mono_memory_read_barrier (void)
93 __asm__ __volatile__ ("membar #LoadLoad" : : : "memory");
96 static inline void mono_memory_write_barrier (void)
98 __asm__ __volatile__ ("membar #StoreStore" : : : "memory");
100 #elif defined(__s390__)
101 static inline void mono_memory_barrier (void)
103 __asm__ __volatile__ ("bcr 15,0" : : : "memory");
106 static inline void mono_memory_read_barrier (void)
108 mono_memory_barrier ();
111 static inline void mono_memory_write_barrier (void)
113 mono_memory_barrier ();
115 #elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)
116 static inline void mono_memory_barrier (void)
118 __asm__ __volatile__ ("sync" : : : "memory");
121 static inline void mono_memory_read_barrier (void)
123 mono_memory_barrier ();
126 static inline void mono_memory_write_barrier (void)
128 __asm__ __volatile__ ("eieio" : : : "memory");
131 #elif defined(__arm__)
132 static inline void mono_memory_barrier (void)
135 __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory");
139 static inline void mono_memory_read_barrier (void)
141 mono_memory_barrier ();
144 static inline void mono_memory_write_barrier (void)
146 mono_memory_barrier ();
148 #elif defined(__ia64__)
149 static inline void mono_memory_barrier (void)
151 __asm__ __volatile__ ("mf" : : : "memory");
154 static inline void mono_memory_read_barrier (void)
156 mono_memory_barrier ();
159 static inline void mono_memory_write_barrier (void)
161 mono_memory_barrier ();
163 #elif defined(__alpha__)
164 static inline void mono_memory_barrier (void)
166 __asm__ __volatile__ ("mb" : : : "memory");
169 static inline void mono_memory_read_barrier (void)
171 mono_memory_barrier ();
174 static inline void mono_memory_write_barrier (void)
176 mono_memory_barrier ();
178 #elif defined(__mips__)
179 static inline void mono_memory_barrier (void)
181 __asm__ __volatile__ ("" : : : "memory");
184 static inline void mono_memory_read_barrier (void)
186 mono_memory_barrier ();
189 static inline void mono_memory_write_barrier (void)
191 mono_memory_barrier ();
193 #elif defined(MONO_CROSS_COMPILE)
194 static inline void mono_memory_barrier (void)
198 static inline void mono_memory_read_barrier (void)
202 static inline void mono_memory_write_barrier (void)
207 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */