68 extern "C" {
69 jint _Atomic_add(jint add_value, volatile jint* dest IS_MP_DECL());
70 jint _Atomic_xchg(jint exchange_value, volatile jint* dest);
71 jbyte _Atomic_cmpxchg_byte(jbyte exchange_value, volatile jbyte* dest,
72 jbyte compare_value IS_MP_DECL());
73 jint _Atomic_cmpxchg(jint exchange_value, volatile jint* dest,
74 jint compare_value IS_MP_DECL());
75 jlong _Atomic_cmpxchg_long(jlong exchange_value, volatile jlong* dest,
76 jlong compare_value IS_MP_DECL());
77 }
78
79 inline jint Atomic::add (jint add_value, volatile jint* dest) {
80 return _Atomic_add(add_value, dest IS_MP_ARG());
81 }
82
83 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
84 return _Atomic_xchg(exchange_value, dest);
85 }
86
87 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
88 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
89 return _Atomic_cmpxchg_byte(exchange_value, dest, compare_value IS_MP_ARG());
90 }
91
92 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
93 return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG());
94 }
95
96 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
97 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value IS_MP_ARG());
98 }
99
100
101 #ifdef AMD64
102 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
103 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
104 extern "C" jlong _Atomic_add_long(jlong add_value, volatile jlong* dest);
105 extern "C" jlong _Atomic_xchg_long(jlong exchange_value, volatile jlong* dest);
106
107 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
108 return (intptr_t)_Atomic_add_long((jlong)add_value, (volatile jlong*)dest);
109 }
110
111 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
112 return (void*)_Atomic_add_long((jlong)add_value, (volatile jlong*)dest);
113 }
114
115 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
116 return (intptr_t)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest);
117 }
118
119 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
120 return (void*)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest);
121 }
122
123 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
124 return (intptr_t)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
125 }
126
127 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
128 return (void*)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
129 }
130
131 inline jlong Atomic::load(volatile jlong* src) { return *src; }
132
133 #else // !AMD64
134
135 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
136 return (intptr_t)add((jint)add_value, (volatile jint*)dest);
137 }
138
139 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
140 return (void*)add((jint)add_value, (volatile jint*)dest);
141 }
142
143 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
144 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
145 }
146
147 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
148 return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
149 }
150
151 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
152 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
153 }
154
155 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
156 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
157 }
158
159 extern "C" void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
160
161 inline jlong Atomic::load(volatile jlong* src) {
162 volatile jlong dest;
163 _Atomic_move_long(src, &dest);
164 return dest;
165 }
166
167 inline void Atomic::store(jlong store_value, jlong* dest) {
168 _Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
169 }
170
171 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
172 _Atomic_move_long((volatile jlong*)&store_value, dest);
173 }
174
175 #endif // AMD64
176
|
68 extern "C" {
69 jint _Atomic_add(jint add_value, volatile jint* dest IS_MP_DECL());
70 jint _Atomic_xchg(jint exchange_value, volatile jint* dest);
71 jbyte _Atomic_cmpxchg_byte(jbyte exchange_value, volatile jbyte* dest,
72 jbyte compare_value IS_MP_DECL());
73 jint _Atomic_cmpxchg(jint exchange_value, volatile jint* dest,
74 jint compare_value IS_MP_DECL());
75 jlong _Atomic_cmpxchg_long(jlong exchange_value, volatile jlong* dest,
76 jlong compare_value IS_MP_DECL());
77 }
78
79 inline jint Atomic::add (jint add_value, volatile jint* dest) {
80 return _Atomic_add(add_value, dest IS_MP_ARG());
81 }
82
83 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
84 return _Atomic_xchg(exchange_value, dest);
85 }
86
87 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
88 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, cmpxchg_memory_order order) {
89 return _Atomic_cmpxchg_byte(exchange_value, dest, compare_value IS_MP_ARG());
90 }
91
92 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) {
93 return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG());
94 }
95
96 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
97 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value IS_MP_ARG());
98 }
99
100
101 #ifdef AMD64
102 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
103 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
104 extern "C" jlong _Atomic_add_long(jlong add_value, volatile jlong* dest);
105 extern "C" jlong _Atomic_xchg_long(jlong exchange_value, volatile jlong* dest);
106
107 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
108 return (intptr_t)_Atomic_add_long((jlong)add_value, (volatile jlong*)dest);
109 }
110
111 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
112 return (void*)_Atomic_add_long((jlong)add_value, (volatile jlong*)dest);
113 }
114
115 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
116 return (intptr_t)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest);
117 }
118
119 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
120 return (void*)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest);
121 }
122
123 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
124 return (intptr_t)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
125 }
126
127 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
128 return (void*)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
129 }
130
131 inline jlong Atomic::load(volatile jlong* src) { return *src; }
132
133 #else // !AMD64
134
135 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
136 return (intptr_t)add((jint)add_value, (volatile jint*)dest);
137 }
138
139 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
140 return (void*)add((jint)add_value, (volatile jint*)dest);
141 }
142
143 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
144 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
145 }
146
147 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
148 return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
149 }
150
151 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
152 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
153 }
154
155 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
156 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
157 }
158
159 extern "C" void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
160
161 inline jlong Atomic::load(volatile jlong* src) {
162 volatile jlong dest;
163 _Atomic_move_long(src, &dest);
164 return dest;
165 }
166
167 inline void Atomic::store(jlong store_value, jlong* dest) {
168 _Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
169 }
170
171 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
172 _Atomic_move_long((volatile jlong*)&store_value, dest);
173 }
174
175 #endif // AMD64
176
|