< prev index next >

src/os_cpu/linux_arm/vm/atomic_linux_arm.hpp

Print this page
rev 13452 : imported patch Atomic_cmpxchg
rev 13453 : imported patch Atomic_add
rev 13454 : [mq]: Atomic_add_v2


 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;


< prev index next >