2009-11-20 Gonzalo Paniagua Javier <gonzalo@novell.com>
[mono.git] / mono / utils / mono-membar.h
1 /*
2  * mono-membar.h: Memory barrier inline functions
3  *
4  * Author:
5  *      Mark Probst (mark.probst@gmail.com)
6  *
7  * (C) 2007 Novell, Inc
8  */
9
10 #ifndef _MONO_UTILS_MONO_MEMBAR_H_
11 #define _MONO_UTILS_MONO_MEMBAR_H_
12
13 #include <glib.h>
14
15 #ifdef __x86_64__
16 #ifndef _MSC_VER
17 static inline void mono_memory_barrier (void)
18 {
19         __asm__ __volatile__ ("mfence" : : : "memory");
20 }
21
22 static inline void mono_memory_read_barrier (void)
23 {
24         __asm__ __volatile__ ("lfence" : : : "memory");
25 }
26
27 static inline void mono_memory_write_barrier (void)
28 {
29         __asm__ __volatile__ ("sfence" : : : "memory");
30 }
31 #else
32 #include <intrin.h>
33
34 static inline void mono_memory_barrier (void)
35 {
36         _ReadWriteBarrier ();
37 }
38
39 static inline void mono_memory_read_barrier (void)
40 {
41         _ReadBarrier ();
42 }
43
44 static inline void mono_memory_write_barrier (void)
45 {
46         _WriteBarrier ();
47 }
48 #endif
49 #elif defined(__i386__)
50 #ifndef _MSC_VER
51 static inline void mono_memory_barrier (void)
52 {
53         __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
54 }
55
56 static inline void mono_memory_read_barrier (void)
57 {
58         mono_memory_barrier ();
59 }
60
61 static inline void mono_memory_write_barrier (void)
62 {
63         mono_memory_barrier ();
64 }
65 #else
66 #include <intrin.h>
67
68 static inline void mono_memory_barrier (void)
69 {
70         _ReadWriteBarrier ();
71 }
72
73 static inline void mono_memory_read_barrier (void)
74 {
75         _ReadBarrier ();
76 }
77
78 static inline void mono_memory_write_barrier (void)
79 {
80         _WriteBarrier ();
81 }
82 #endif
83 #elif defined(sparc) || defined(__sparc__)
84 static inline void mono_memory_barrier (void)
85 {
86         __asm__ __volatile__ ("membar   #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
87 }
88
89 static inline void mono_memory_read_barrier (void)
90 {
91         __asm__ __volatile__ ("membar   #LoadLoad" : : : "memory");
92 }
93
94 static inline void mono_memory_write_barrier (void)
95 {
96         __asm__ __volatile__ ("membar   #StoreStore" : : : "memory");
97 }
98 #elif defined(__s390__)
99 static inline void mono_memory_barrier (void)
100 {
101         __asm__ __volatile__ ("bcr 15,0" : : : "memory");
102 }
103
104 static inline void mono_memory_read_barrier (void)
105 {
106         mono_memory_barrier ();
107 }
108
109 static inline void mono_memory_write_barrier (void)
110 {
111         mono_memory_barrier ();
112 }
113 #elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)
114 static inline void mono_memory_barrier (void)
115 {
116         __asm__ __volatile__ ("sync" : : : "memory");
117 }
118
119 static inline void mono_memory_read_barrier (void)
120 {
121         mono_memory_barrier ();
122 }
123
124 static inline void mono_memory_write_barrier (void)
125 {
126         __asm__ __volatile__ ("eieio" : : : "memory");
127 }
128
129 #elif defined(__arm__)
130 static inline void mono_memory_barrier (void)
131 {
132         __asm__ __volatile__ ("" : : : "memory");
133 }
134
135 static inline void mono_memory_read_barrier (void)
136 {
137         mono_memory_barrier ();
138 }
139
140 static inline void mono_memory_write_barrier (void)
141 {
142         mono_memory_barrier ();
143 }
144 #elif defined(__ia64__)
145 static inline void mono_memory_barrier (void)
146 {
147         __asm__ __volatile__ ("mf" : : : "memory");
148 }
149
150 static inline void mono_memory_read_barrier (void)
151 {
152         mono_memory_barrier ();
153 }
154
155 static inline void mono_memory_write_barrier (void)
156 {
157         mono_memory_barrier ();
158 }
159 #elif defined(__alpha__)
160 static inline void mono_memory_barrier (void)
161 {
162         __asm__ __volatile__ ("mb" : : : "memory");
163 }
164
165 static inline void mono_memory_read_barrier (void)
166 {
167         mono_memory_barrier ();
168 }
169
170 static inline void mono_memory_write_barrier (void)
171 {
172         mono_memory_barrier ();
173 }
174 #elif defined(__mips__)
175 static inline void mono_memory_barrier (void)
176 {
177         __asm__ __volatile__ ("" : : : "memory");
178 }
179
180 static inline void mono_memory_read_barrier (void)
181 {
182         mono_memory_barrier ();
183 }
184
185 static inline void mono_memory_write_barrier (void)
186 {
187         mono_memory_barrier ();
188 }
189 #elif defined(MONO_CROSS_COMPILE)
190 static inline void mono_memory_barrier (void)
191 {
192 }
193
194 static inline void mono_memory_read_barrier (void)
195 {
196 }
197
198 static inline void mono_memory_write_barrier (void)
199 {
200 }
201 #endif
202
203 #endif  /* _MONO_UTILS_MONO_MEMBAR_H_ */