< prev index next >
src/os_cpu/linux_arm/vm/atomic_linux_arm.hpp
Print this page
rev 13443 : imported patch linux_arm
rev 13452 : [mq]: coleen_review1
rev 13458 : imported patch cmpxchg_using_helper
*** 198,210 ****
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
}
// The memory_order parameter is ignored - we always provide the strongest/most-conservative ordering
! inline jint Atomic::cmpxchg(jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) {
#ifdef AARCH64
! jint rv;
int tmp;
__asm__ volatile(
"1:\n\t"
" ldaxr %w[rv], [%[dest]]\n\t"
" cmp %w[rv], %w[cv]\n\t"
--- 198,239 ----
return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
}
// The memory_order parameter is ignored - we always provide the strongest/most-conservative ordering
! // No direct support for cmpxchg of bytes; emulate using int.
! template<>
! struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
!
! #ifndef AARCH64
!
! inline jint reorder_cmpxchg_func(jint exchange_value,
! jint volatile* dest,
! jint compare_value) {
! // Warning: Arguments are swapped to avoid moving them for kernel call
! return (*os::atomic_cmpxchg_func)(compare_value, exchange_value, dest);
! }
!
! inline jlong reorder_cmpxchg_long_func(jlong exchange_value,
! jlong volatile* dest,
! jlong compare_value) {
! assert(VM_Version::supports_cx8(), "Atomic compare and exchange jlong not supported on this architecture!");
! // Warning: Arguments are swapped to avoid moving them for kernel call
! return (*os::atomic_cmpxchg_long_func)(compare_value, exchange_value, dest);
! }
!
! #endif // !AARCH64
!
! template<>
! template<typename T>
! inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
! T volatile* dest,
! T compare_value,
! cmpxchg_memory_order order) const {
! STATIC_ASSERT(4 == sizeof(T));
#ifdef AARCH64
! T rv;
int tmp;
__asm__ volatile(
"1:\n\t"
" ldaxr %w[rv], [%[dest]]\n\t"
" cmp %w[rv], %w[cv]\n\t"
*** 218,235 ****
: [rv] "=&r" (rv), [tmp] "=&r" (tmp)
: [ev] "r" (exchange_value), [dest] "r" (dest), [cv] "r" (compare_value)
: "memory");
return rv;
#else
! // Warning: Arguments are swapped to avoid moving them for kernel call
! return (*os::atomic_cmpxchg_func)(compare_value, exchange_value, dest);
#endif
}
! inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
#ifdef AARCH64
! jlong rv;
int tmp;
__asm__ volatile(
"1:\n\t"
" ldaxr %[rv], [%[dest]]\n\t"
" cmp %[rv], %[cv]\n\t"
--- 247,269 ----
: [rv] "=&r" (rv), [tmp] "=&r" (tmp)
: [ev] "r" (exchange_value), [dest] "r" (dest), [cv] "r" (compare_value)
: "memory");
return rv;
#else
! return cmpxchg_using_helper<jint>(reorder_cmpxchg_func, exchange_value, dest, compare_value);
#endif
}
! template<>
! template<typename T>
! inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value,
! T volatile* dest,
! T compare_value,
! cmpxchg_memory_order order) const {
! STATIC_ASSERT(8 == sizeof(T));
#ifdef AARCH64
! T rv;
int tmp;
__asm__ volatile(
"1:\n\t"
" ldaxr %[rv], [%[dest]]\n\t"
" cmp %[rv], %[cv]\n\t"
*** 243,265 ****
: [rv] "=&r" (rv), [tmp] "=&r" (tmp)
: [ev] "r" (exchange_value), [dest] "r" (dest), [cv] "r" (compare_value)
: "memory");
return rv;
#else
! assert(VM_Version::supports_cx8(), "Atomic compare and exchange jlong not supported on this architecture!");
! return (*os::atomic_cmpxchg_long_func)(compare_value, exchange_value, dest);
! #endif
! }
!
! inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
! #ifdef AARCH64
! return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
! #else
! return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
#endif
}
- inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
- return (void*)cmpxchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest, (intptr_t)compare_value, order);
- }
-
#endif // OS_CPU_LINUX_ARM_VM_ATOMIC_LINUX_ARM_HPP
--- 277,286 ----
: [rv] "=&r" (rv), [tmp] "=&r" (tmp)
: [ev] "r" (exchange_value), [dest] "r" (dest), [cv] "r" (compare_value)
: "memory");
return rv;
#else
! return cmpxchg_using_helper<jlong>(reorder_cmpxchg_long_func, exchange_value, dest, compare_value);
#endif
}
#endif // OS_CPU_LINUX_ARM_VM_ATOMIC_LINUX_ARM_HPP
< prev index next >