Add full-aot support for runtime invokes to array Get/Set methods.
[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 _MSC_VER
18 #include <intrin.h>
19
20 static inline void mono_memory_barrier (void)
21 {
22         _ReadWriteBarrier ();
23 }
24
25 static inline void mono_memory_read_barrier (void)
26 {
27         _ReadBarrier ();
28 }
29
30 static inline void mono_memory_write_barrier (void)
31 {
32         _WriteBarrier ();
33 }
34 #elif defined(USE_GCC_ATOMIC_OPS)
35 static inline void mono_memory_barrier (void)
36 {
37         __sync_synchronize ();
38 }
39
40 static inline void mono_memory_read_barrier (void)
41 {
42         mono_memory_barrier ();
43 }
44
45 static inline void mono_memory_write_barrier (void)
46 {
47         mono_memory_barrier ();
48 }
49 #elif defined(sparc) || defined(__sparc__)
50 static inline void mono_memory_barrier (void)
51 {
52         __asm__ __volatile__ ("membar   #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory");
53 }
54
55 static inline void mono_memory_read_barrier (void)
56 {
57         __asm__ __volatile__ ("membar   #LoadLoad" : : : "memory");
58 }
59
60 static inline void mono_memory_write_barrier (void)
61 {
62         __asm__ __volatile__ ("membar   #StoreStore" : : : "memory");
63 }
64 #elif defined(__s390__)
65 static inline void mono_memory_barrier (void)
66 {
67         __asm__ __volatile__ ("bcr 15,0" : : : "memory");
68 }
69
70 static inline void mono_memory_read_barrier (void)
71 {
72         mono_memory_barrier ();
73 }
74
75 static inline void mono_memory_write_barrier (void)
76 {
77         mono_memory_barrier ();
78 }
79 #elif defined(__ia64__)
80 static inline void mono_memory_barrier (void)
81 {
82         __asm__ __volatile__ ("mf" : : : "memory");
83 }
84
85 static inline void mono_memory_read_barrier (void)
86 {
87         mono_memory_barrier ();
88 }
89
90 static inline void mono_memory_write_barrier (void)
91 {
92         mono_memory_barrier ();
93 }
94 #elif defined(MONO_CROSS_COMPILE)
95 static inline void mono_memory_barrier (void)
96 {
97 }
98
99 static inline void mono_memory_read_barrier (void)
100 {
101 }
102
103 static inline void mono_memory_write_barrier (void)
104 {
105 }
106 #endif
107
108 #endif  /* _MONO_UTILS_MONO_MEMBAR_H_ */