168 return cmpxchg_using_helper<int>(arm_compare_and_swap, exchange_value, dest, compare_value); 169 #else 170 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); 171 #endif // ARM 172 } 173 174 template<> 175 template<typename T> 176 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value, 177 T volatile* dest, 178 T compare_value, 179 cmpxchg_memory_order order) const { 180 STATIC_ASSERT(8 == sizeof(T)); 181 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); 182 } 183 184 template<> 185 template<typename T> 186 inline T Atomic::PlatformLoad<8>::operator()(T const volatile* src) const { 187 STATIC_ASSERT(8 == sizeof(T)); 188 volatile jlong dest; 189 os::atomic_copy64(reinterpret_cast<const volatile jlong*>(src), reinterpret_cast<volatile jlong*>(&dest)); 190 return PrimitiveConversions::cast<T>(dest); 191 } 192 193 template<> 194 template<typename T> 195 inline void Atomic::PlatformStore<8>::operator()(T store_value, 196 T volatile* dest) const { 197 STATIC_ASSERT(8 == sizeof(T)); 198 os::atomic_copy64(reinterpret_cast<const volatile jlong*>(&store_value), reinterpret_cast<volatile jlong*>(dest)); 199 } 200 201 #endif // OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_HPP | 168 return cmpxchg_using_helper<int>(arm_compare_and_swap, exchange_value, dest, compare_value); 169 #else 170 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); 171 #endif // ARM 172 } 173 174 template<> 175 template<typename T> 176 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value, 177 T volatile* dest, 178 T compare_value, 179 cmpxchg_memory_order order) const { 180 STATIC_ASSERT(8 == sizeof(T)); 181 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); 182 } 183 184 template<> 185 template<typename T> 186 inline T Atomic::PlatformLoad<8>::operator()(T const volatile* src) const { 187 STATIC_ASSERT(8 == sizeof(T)); 188 volatile int64_t dest; 189 os::atomic_copy64(reinterpret_cast<const volatile int64_t*>(src), reinterpret_cast<volatile int64_t*>(&dest)); 190 return PrimitiveConversions::cast<T>(dest); 191 } 192 193 template<> 194 template<typename T> 195 inline void Atomic::PlatformStore<8>::operator()(T store_value, 196 T volatile* dest) const { 197 STATIC_ASSERT(8 == sizeof(T)); 198 os::atomic_copy64(reinterpret_cast<const volatile int64_t*>(&store_value), reinterpret_cast<volatile int64_t*>(dest)); 199 } 200 201 #endif // OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_HPP |