237 template<> |
237 template<> |
238 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; |
238 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; |
239 |
239 |
240 template<> |
240 template<> |
241 template<typename T> |
241 template<typename T> |
242 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value, |
242 inline T Atomic::PlatformCmpxchg<4>::operator()(T volatile* dest, |
243 T volatile* dest, |
|
244 T compare_value, |
243 T compare_value, |
|
244 T exchange_value, |
245 atomic_memory_order order) const { |
245 atomic_memory_order order) const { |
246 STATIC_ASSERT(4 == sizeof(T)); |
246 STATIC_ASSERT(4 == sizeof(T)); |
247 #ifdef ARM |
247 #ifdef ARM |
248 return cmpxchg_using_helper<int>(arm_compare_and_swap, exchange_value, dest, compare_value); |
248 return cmpxchg_using_helper<int>(arm_compare_and_swap, dest, compare_value, exchange_value); |
249 #else |
249 #else |
250 #ifdef M68K |
250 #ifdef M68K |
251 return cmpxchg_using_helper<int>(m68k_compare_and_swap, exchange_value, dest, compare_value); |
251 return cmpxchg_using_helper<int>(m68k_compare_and_swap, dest, compare_value, exchange_value); |
252 #else |
252 #else |
253 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); |
253 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); |
254 #endif // M68K |
254 #endif // M68K |
255 #endif // ARM |
255 #endif // ARM |
256 } |
256 } |
257 |
257 |
258 template<> |
258 template<> |
259 template<typename T> |
259 template<typename T> |
260 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value, |
260 inline T Atomic::PlatformCmpxchg<8>::operator()(T volatile* dest, |
261 T volatile* dest, |
|
262 T compare_value, |
261 T compare_value, |
|
262 T exchange_value, |
263 atomic_memory_order order) const { |
263 atomic_memory_order order) const { |
264 STATIC_ASSERT(8 == sizeof(T)); |
264 STATIC_ASSERT(8 == sizeof(T)); |
265 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); |
265 return __sync_val_compare_and_swap(dest, compare_value, exchange_value); |
266 } |
266 } |
267 |
267 |