< prev index next >

src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp

Print this page
rev 11110 : 8155949: Support relaxed semantics in cmpxchg
Reviewed-by:
Contributed-by: HORII@jp.ibm.com, mdoerr


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


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