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