equal
deleted
inserted
replaced
33 template<typename D, typename I> |
33 template<typename D, typename I> |
34 inline D operator()(D volatile* dest, I add_value, atomic_memory_order order) const { |
34 inline D operator()(D volatile* dest, I add_value, atomic_memory_order order) const { |
35 D old_value = *dest; |
35 D old_value = *dest; |
36 while (true) { |
36 while (true) { |
37 D new_value = old_value + add_value; |
37 D new_value = old_value + add_value; |
38 D result = cmpxchg(new_value, dest, old_value); |
38 D result = cmpxchg(dest, old_value, new_value); |
39 if (result == old_value) break; |
39 if (result == old_value) break; |
40 old_value = result; |
40 old_value = result; |
41 } |
41 } |
42 return old_value + add_value; |
42 return old_value + add_value; |
43 } |
43 } |
62 T exchange_value, |
62 T exchange_value, |
63 atomic_memory_order order) const { |
63 atomic_memory_order order) const { |
64 STATIC_ASSERT(8 == sizeof(T)); |
64 STATIC_ASSERT(8 == sizeof(T)); |
65 T old_value = *dest; |
65 T old_value = *dest; |
66 while (true) { |
66 while (true) { |
67 T result = cmpxchg(exchange_value, dest, old_value); |
67 T result = cmpxchg(dest, old_value, exchange_value); |
68 if (result == old_value) break; |
68 if (result == old_value) break; |
69 old_value = result; |
69 old_value = result; |
70 } |
70 } |
71 return old_value; |
71 return old_value; |
72 } |
72 } |
75 template<> |
75 template<> |
76 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; |
76 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; |
77 |
77 |
78 template<> |
78 template<> |
79 template<typename T> |
79 template<typename T> |
80 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value, |
80 inline T Atomic::PlatformCmpxchg<4>::operator()(T volatile* dest, |
81 T volatile* dest, |
|
82 T compare_value, |
81 T compare_value, |
|
82 T exchange_value, |
83 atomic_memory_order order) const { |
83 atomic_memory_order order) const { |
84 STATIC_ASSERT(4 == sizeof(T)); |
84 STATIC_ASSERT(4 == sizeof(T)); |
85 T rv; |
85 T rv; |
86 __asm__ volatile( |
86 __asm__ volatile( |
87 " cas [%2], %3, %0" |
87 " cas [%2], %3, %0" |
91 return rv; |
91 return rv; |
92 } |
92 } |
93 |
93 |
94 template<> |
94 template<> |
95 template<typename T> |
95 template<typename T> |
96 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value, |
96 inline T Atomic::PlatformCmpxchg<8>::operator()(T volatile* dest, |
97 T volatile* dest, |
|
98 T compare_value, |
97 T compare_value, |
|
98 T exchange_value, |
99 atomic_memory_order order) const { |
99 atomic_memory_order order) const { |
100 STATIC_ASSERT(8 == sizeof(T)); |
100 STATIC_ASSERT(8 == sizeof(T)); |
101 T rv; |
101 T rv; |
102 __asm__ volatile( |
102 __asm__ volatile( |
103 " casx [%2], %3, %0" |
103 " casx [%2], %3, %0" |