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_
14 static inline void mono_memory_barrier (void)
16 __asm__ __volatile__ ("mfence" : : : "memory");
19 static inline void mono_memory_read_barrier (void)
21 __asm__ __volatile__ ("lfence" : : : "memory");
24 static inline void mono_memory_write_barrier (void)
26 __asm__ __volatile__ ("sfence" : : : "memory");
28 #elif defined(__i386__)
29 static inline void mono_memory_barrier (void)
31 __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
34 static inline void mono_memory_read_barrier (void)
36 mono_memory_barrier ();
39 static inline void mono_memory_write_barrier (void)
41 mono_memory_barrier ();
43 #elif defined(sparc) || defined(__sparc__)
44 static inline void mono_memory_barrier (void)
46 __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
49 static inline void mono_memory_read_barrier (void)
51 __asm__ __volatile__ ("membar #LoadLoad" : : : "memory");
54 static inline void mono_memory_write_barrier (void)
56 __asm__ __volatile__ ("membar #StoreStore" : : : "memory");
58 #elif defined(__s390__)
59 static inline void mono_memory_barrier (void)
61 __asm__ __volatile__ ("bcr 15,0" : : : "memory");
64 static inline void mono_memory_read_barrier (void)
66 mono_memory_barrier ();
69 static inline void mono_memory_write_barrier (void)
71 mono_memory_barrier ();
73 #elif defined(__ppc__) || defined(__powerpc__)
74 static inline void mono_memory_barrier (void)
76 __asm__ __volatile__ ("sync" : : : "memory");
79 static inline void mono_memory_read_barrier (void)
81 mono_memory_barrier ();
84 static inline void mono_memory_write_barrier (void)
86 __asm__ __volatile__ ("eieio" : : : "memory");
89 #elif defined(__arm__)
90 static inline void mono_memory_barrier (void)
92 __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5"
93 : : "r" (0) : "memory");
96 static inline void mono_memory_read_barrier (void)
98 mono_memory_barrier ();
101 static inline void mono_memory_write_barrier (void)
103 mono_memory_barrier ();
105 #elif defined(__ia64__)
106 static inline void mono_memory_barrier (void)
108 __asm__ __volatile__ ("mf" : : : "memory");
111 static inline void mono_memory_read_barrier (void)
113 mono_memory_barrier ();
116 static inline void mono_memory_write_barrier (void)
118 mono_memory_barrier ();
122 #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */