381ee743f8ba9a66aa8a15d74e7b028a8cb9d2dd
[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 #ifdef __x86_64__
14 static inline void mono_memory_barrier (void)
15 {
16         __asm__ __volatile__ ("mfence" : : : "memory");
17 }
18
19 static inline void mono_memory_read_barrier (void)
20 {
21         __asm__ __volatile__ ("lfence" : : : "memory");
22 }
23
24 static inline void mono_memory_write_barrier (void)
25 {
26         __asm__ __volatile__ ("sfence" : : : "memory");
27 }
28 #elif defined(__i386__)
29 static inline void mono_memory_barrier (void)
30 {
31         __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory");
32 }
33
34 static inline void mono_memory_read_barrier (void)
35 {
36         mono_memory_barrier ();
37 }
38
39 static inline void mono_memory_write_barrier (void)
40 {
41         mono_memory_barrier ();
42 }
43 #elif defined(sparc) || defined(__sparc__)
44 static inline void mono_memory_barrier (void)
45 {
46         __asm__ __volatile__ ("membar   #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
47 }
48
49 static inline void mono_memory_read_barrier (void)
50 {
51         __asm__ __volatile__ ("membar   #LoadLoad" : : : "memory");
52 }
53
54 static inline void mono_memory_write_barrier (void)
55 {
56         __asm__ __volatile__ ("membar   #StoreStore" : : : "memory");
57 }
58 #elif defined(__s390__)
59 static inline void mono_memory_barrier (void)
60 {
61         __asm__ __volatile__ ("bcr 15,0" : : : "memory");
62 }
63
64 static inline void mono_memory_read_barrier (void)
65 {
66         mono_memory_barrier ();
67 }
68
69 static inline void mono_memory_write_barrier (void)
70 {
71         mono_memory_barrier ();
72 }
73 #elif defined(__ppc__) || defined(__powerpc__)
74 static inline void mono_memory_barrier (void)
75 {
76         __asm__ __volatile__ ("sync" : : : "memory");
77 }
78
79 static inline void mono_memory_read_barrier (void)
80 {
81         mono_memory_barrier ();
82 }
83
84 static inline void mono_memory_write_barrier (void)
85 {
86         __asm__ __volatile__ ("eieio" : : : "memory");
87 }
88
89 #elif defined(__arm__)
90 static inline void mono_memory_barrier (void)
91 {
92         __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5"
93                               : : "r" (0) : "memory");
94 }
95
96 static inline void mono_memory_read_barrier (void)
97 {
98         mono_memory_barrier ();
99 }
100
101 static inline void mono_memory_write_barrier (void)
102 {
103         mono_memory_barrier ();
104 }
105 #elif defined(__ia64__)
106 static inline void mono_memory_barrier (void)
107 {
108         __asm__ __volatile__ ("mf" : : : "memory");
109 }
110
111 static inline void mono_memory_read_barrier (void)
112 {
113         mono_memory_barrier ();
114 }
115
116 static inline void mono_memory_write_barrier (void)
117 {
118         mono_memory_barrier ();
119 }
120 #endif
121
122 #endif  /* _MONO_UTILS_MONO_MEMBAR_H_ */