2010-06-21 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / utils / mono-membar.h
blob13ed6e72823d9b2cb9f516ec68989ed840c7a777
1 /*
2 * mono-membar.h: Memory barrier inline functions
4 * Author:
5 * Mark Probst (mark.probst@gmail.com)
7 * (C) 2007 Novell, Inc
8 */
10 #ifndef _MONO_UTILS_MONO_MEMBAR_H_
11 #define _MONO_UTILS_MONO_MEMBAR_H_
13 #include <glib.h>
15 #ifdef __x86_64__
16 #ifndef _MSC_VER
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");
31 #else
32 #include <intrin.h>
34 static inline void mono_memory_barrier (void)
36 _ReadWriteBarrier ();
39 static inline void mono_memory_read_barrier (void)
41 _ReadBarrier ();
44 static inline void mono_memory_write_barrier (void)
46 _WriteBarrier ();
48 #endif
49 #elif defined(__i386__)
50 #ifndef _MSC_VER
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 ();
65 #else
66 #include <intrin.h>
68 static inline void mono_memory_barrier (void)
70 _ReadWriteBarrier ();
73 static inline void mono_memory_read_barrier (void)
75 _ReadBarrier ();
78 static inline void mono_memory_write_barrier (void)
80 _WriteBarrier ();
82 #endif
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)
201 #endif
203 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */