61
62 extern "C" jint _Atomic_swap32(jint exchange_value, volatile jint* dest);
63 extern "C" intptr_t _Atomic_swap64(intptr_t exchange_value, volatile intptr_t* dest);
64
65 // Implement ADD using a CAS loop.
66 template<size_t byte_size>
67 struct Atomic::PlatformAdd VALUE_OBJ_CLASS_SPEC {
68 template<typename I, typename D>
69 inline D operator()(I add_value, D volatile* dest) const {
70 D old_value = *dest;
71 while (true) {
72 D new_value = old_value + add_value;
73 D result = cmpxchg(new_value, dest, old_value);
74 if (result == old_value) break;
75 old_value = result;
76 }
77 return old_value + add_value;
78 }
79 };
80
81 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
82 return _Atomic_swap32(exchange_value, dest);
83 }
84
85 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
86 return _Atomic_swap64(exchange_value, dest);
87 }
88
89 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
90 return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
91 }
92
93 // No direct support for cmpxchg of bytes; emulate using int.
94 template<>
95 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
96
97 template<>
98 template<typename T>
99 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
100 T volatile* dest,
|
61
62 extern "C" jint _Atomic_swap32(jint exchange_value, volatile jint* dest);
63 extern "C" intptr_t _Atomic_swap64(intptr_t exchange_value, volatile intptr_t* dest);
64
65 // Implement ADD using a CAS loop.
66 template<size_t byte_size>
67 struct Atomic::PlatformAdd VALUE_OBJ_CLASS_SPEC {
68 template<typename I, typename D>
69 inline D operator()(I add_value, D volatile* dest) const {
70 D old_value = *dest;
71 while (true) {
72 D new_value = old_value + add_value;
73 D result = cmpxchg(new_value, dest, old_value);
74 if (result == old_value) break;
75 old_value = result;
76 }
77 return old_value + add_value;
78 }
79 };
80
81 template<>
82 struct Atomic::PlatformAdd<2>: Atomic::AddShortUsingInt {};
83
84 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
85 return _Atomic_swap32(exchange_value, dest);
86 }
87
88 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
89 return _Atomic_swap64(exchange_value, dest);
90 }
91
92 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
93 return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
94 }
95
96 // No direct support for cmpxchg of bytes; emulate using int.
97 template<>
98 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
99
100 template<>
101 template<typename T>
102 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
103 T volatile* dest,
|