134 template<>
135 template<typename I, typename D>
136 inline D Atomic::PlatformAdd<8>::add_and_fetch(I add_value, D volatile* dest) const {
137 STATIC_ASSERT(8 == sizeof(I));
138 STATIC_ASSERT(8 == sizeof(D));
139 D val;
140 int tmp;
141 __asm__ volatile(
142 "1:\n\t"
143 " ldaxr %[val], [%[dest]]\n\t"
144 " add %[val], %[val], %[add_val]\n\t"
145 " stlxr %w[tmp], %[val], [%[dest]]\n\t"
146 " cbnz %w[tmp], 1b\n\t"
147 : [val] "=&r" (val), [tmp] "=&r" (tmp)
148 : [add_val] "r" (add_value), [dest] "r" (dest)
149 : "memory");
150 return val;
151 }
152 #endif // AARCH64
153
154 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
155 Atomic::add_ptr(1, dest);
156 }
157
158 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
159 Atomic::add_ptr(-1, dest);
160 }
161
162 inline void Atomic::inc_ptr(volatile void* dest) {
163 inc_ptr((volatile intptr_t*)dest);
164 }
165
166 inline void Atomic::dec_ptr(volatile void* dest) {
167 dec_ptr((volatile intptr_t*)dest);
168 }
169
170
171 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
172 #ifdef AARCH64
173 jint old_val;
|
134 template<>
135 template<typename I, typename D>
136 inline D Atomic::PlatformAdd<8>::add_and_fetch(I add_value, D volatile* dest) const {
137 STATIC_ASSERT(8 == sizeof(I));
138 STATIC_ASSERT(8 == sizeof(D));
139 D val;
140 int tmp;
141 __asm__ volatile(
142 "1:\n\t"
143 " ldaxr %[val], [%[dest]]\n\t"
144 " add %[val], %[val], %[add_val]\n\t"
145 " stlxr %w[tmp], %[val], [%[dest]]\n\t"
146 " cbnz %w[tmp], 1b\n\t"
147 : [val] "=&r" (val), [tmp] "=&r" (tmp)
148 : [add_val] "r" (add_value), [dest] "r" (dest)
149 : "memory");
150 return val;
151 }
152 #endif // AARCH64
153
154 template<>
155 struct Atomic::PlatformAdd<2>: Atomic::AddShortUsingInt {};
156
157 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
158 Atomic::add_ptr(1, dest);
159 }
160
161 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
162 Atomic::add_ptr(-1, dest);
163 }
164
165 inline void Atomic::inc_ptr(volatile void* dest) {
166 inc_ptr((volatile intptr_t*)dest);
167 }
168
169 inline void Atomic::dec_ptr(volatile void* dest) {
170 dec_ptr((volatile intptr_t*)dest);
171 }
172
173
174 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
175 #ifdef AARCH64
176 jint old_val;
|