9 #ifndef V8_BASE_ATOMICOPS_INTERNALS_ARM_GCC_H_
10 #define V8_BASE_ATOMICOPS_INTERNALS_ARM_GCC_H_
12 #if defined(__QNXNTO__)
13 #include <sys/cpuinline.h>
47 #if defined(__linux__) || defined(__ANDROID__)
49 typedef void (*KernelMemoryBarrierFunc)();
50 ((KernelMemoryBarrierFunc)0xffff0fa0)();
51 #elif defined(__QNXNTO__)
54 #error MemoryBarrier() is not implemented on this platform.
62 #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
63 defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || \
64 defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
65 defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \
66 defined(__ARM_ARCH_6KZ__) || defined(__ARM_ARCH_6T2__)
80 __asm__ __volatile__(
" ldrex %0, [%3]\n"
86 " strexeq %1, %5, [%3]\n"
87 :
"=&r"(prev_value),
"=&r"(reloop),
"+m"(*ptr)
88 :
"r"(ptr),
"r"(old_value),
"r"(new_value)
90 }
while (reloop != 0);
120 __asm__ __volatile__(
" ldrex %0, [%3]\n"
122 " strex %1, %0, [%3]\n"
123 :
"=&r"(value),
"=&r"(reloop),
"+m"(*ptr)
124 :
"r"(ptr),
"r"(increment)
148 __asm__ __volatile__(
" ldrex %0, [%3]\n"
149 " strex %1, %4, [%3]\n"
150 :
"=&r"(old_value),
"=&r"(reloop),
"+m"(*ptr)
151 :
"r"(ptr),
"r"(new_value)
153 }
while (reloop != 0);
158 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
159 defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
175 inline int LinuxKernelCmpxchg(
Atomic32 old_value,
179 return ((KernelCmpxchgFunc)0xffff0fc0)(old_value, new_value, ptr);
190 if (prev_value != old_value)
192 if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
202 }
while (LinuxKernelCmpxchg(old_value, new_value, ptr));
216 Atomic32 new_value = old_value + increment;
217 if (!LinuxKernelCmpxchg(old_value, new_value, ptr)) {
231 if (prev_value != old_value) {
236 if (!LinuxKernelCmpxchg(old_value, new_value, ptr))
258 # error "Your CPU's ARM architecture is not supported yet"
Atomic32 Release_Load(volatile const Atomic32 *ptr)
Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value)
void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value)
Atomic32 Acquire_Load(volatile const Atomic32 *ptr)
Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment)
void Release_Store(volatile Atomic32 *ptr, Atomic32 value)
Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment)
void NoBarrier_Store(volatile Atomic8 *ptr, Atomic8 value)
Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, Atomic32 new_value)
Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value)
Atomic8 NoBarrier_Load(volatile const Atomic8 *ptr)
Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value)
Debugger support for the V8 JavaScript engine.