253 #ifdef ARM
254 return arm_lock_test_and_set(dest, exchange_value);
255 #else
256 #ifdef M68K
257 return m68k_lock_test_and_set(dest, exchange_value);
258 #else
259 intptr_t result = __sync_lock_test_and_set (dest, exchange_value);
260 __sync_synchronize();
261 return result;
262 #endif // M68K
263 #endif // ARM
264 }
265
266 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
267 return (void *) xchg_ptr((intptr_t) exchange_value,
268 (volatile intptr_t*) dest);
269 }
270
271 inline jint Atomic::cmpxchg(jint exchange_value,
272 volatile jint* dest,
273 jint compare_value) {
274 #ifdef ARM
275 return arm_compare_and_swap(dest, compare_value, exchange_value);
276 #else
277 #ifdef M68K
278 return m68k_compare_and_swap(dest, compare_value, exchange_value);
279 #else
280 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
281 #endif // M68K
282 #endif // ARM
283 }
284
285 inline jlong Atomic::cmpxchg(jlong exchange_value,
286 volatile jlong* dest,
287 jlong compare_value) {
288
289 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
290 }
291
292 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
293 volatile intptr_t* dest,
294 intptr_t compare_value) {
295 #ifdef ARM
296 return arm_compare_and_swap(dest, compare_value, exchange_value);
297 #else
298 #ifdef M68K
299 return m68k_compare_and_swap(dest, compare_value, exchange_value);
300 #else
301 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
302 #endif // M68K
303 #endif // ARM
304 }
305
306 inline void* Atomic::cmpxchg_ptr(void* exchange_value,
307 volatile void* dest,
308 void* compare_value) {
309
310 return (void *) cmpxchg_ptr((intptr_t) exchange_value,
311 (volatile intptr_t*) dest,
312 (intptr_t) compare_value);
313 }
314
315 inline jlong Atomic::load(volatile jlong* src) {
316 volatile jlong dest;
317 os::atomic_copy64(src, &dest);
318 return dest;
319 }
320
321 inline void Atomic::store(jlong store_value, jlong* dest) {
322 os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
323 }
324
325 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
326 os::atomic_copy64((volatile jlong*)&store_value, dest);
327 }
328
|
253 #ifdef ARM
254 return arm_lock_test_and_set(dest, exchange_value);
255 #else
256 #ifdef M68K
257 return m68k_lock_test_and_set(dest, exchange_value);
258 #else
259 intptr_t result = __sync_lock_test_and_set (dest, exchange_value);
260 __sync_synchronize();
261 return result;
262 #endif // M68K
263 #endif // ARM
264 }
265
266 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
267 return (void *) xchg_ptr((intptr_t) exchange_value,
268 (volatile intptr_t*) dest);
269 }
270
271 inline jint Atomic::cmpxchg(jint exchange_value,
272 volatile jint* dest,
273 jint compare_value, memory_order order) {
274 #ifdef ARM
275 return arm_compare_and_swap(dest, compare_value, exchange_value);
276 #else
277 #ifdef M68K
278 return m68k_compare_and_swap(dest, compare_value, exchange_value);
279 #else
280 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
281 #endif // M68K
282 #endif // ARM
283 }
284
285 inline jlong Atomic::cmpxchg(jlong exchange_value,
286 volatile jlong* dest,
287 jlong compare_value, memory_order order) {
288
289 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
290 }
291
292 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
293 volatile intptr_t* dest,
294 intptr_t compare_value, memory_order order) {
295 #ifdef ARM
296 return arm_compare_and_swap(dest, compare_value, exchange_value);
297 #else
298 #ifdef M68K
299 return m68k_compare_and_swap(dest, compare_value, exchange_value);
300 #else
301 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
302 #endif // M68K
303 #endif // ARM
304 }
305
306 inline void* Atomic::cmpxchg_ptr(void* exchange_value,
307 volatile void* dest,
308 void* compare_value, memory_order order) {
309
310 return (void *) cmpxchg_ptr((intptr_t) exchange_value,
311 (volatile intptr_t*) dest,
312 (intptr_t) compare_value);
313 }
314
315 inline jlong Atomic::load(volatile jlong* src) {
316 volatile jlong dest;
317 os::atomic_copy64(src, &dest);
318 return dest;
319 }
320
321 inline void Atomic::store(jlong store_value, jlong* dest) {
322 os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
323 }
324
325 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
326 os::atomic_copy64((volatile jlong*)&store_value, dest);
327 }
328
|