7 #ifndef V8_BASE_ATOMICOPS_INTERNALS_ARM_GCC_H_
8 #define V8_BASE_ATOMICOPS_INTERNALS_ARM_GCC_H_
14 __asm__ __volatile__ (
"dmb ish" :::
"memory");
31 __asm__ __volatile__ (
33 "ldxr %w[prev], %[ptr] \n\t"
34 "cmp %w[prev], %w[old_value] \n\t"
36 "stxr %w[temp], %w[new_value], %[ptr] \n\t"
37 "cbnz %w[temp], 0b \n\t"
42 : [old_value]
"IJr" (old_value),
43 [new_value]
"r" (new_value)
55 __asm__ __volatile__ (
57 "ldxr %w[result], %[ptr] \n\t"
58 "stxr %w[temp], %w[new_value], %[ptr] \n\t"
59 "cbnz %w[temp], 0b \n\t"
60 : [result]
"=&r" (result),
63 : [new_value]
"r" (new_value)
75 __asm__ __volatile__ (
77 "ldxr %w[result], %[ptr] \n\t"
78 "add %w[result], %w[result], %w[increment]\n\t"
79 "stxr %w[temp], %w[result], %[ptr] \n\t"
80 "cbnz %w[temp], 0b \n\t"
81 : [result]
"=&r" (result),
84 : [increment]
"IJr" (increment)
138 __asm__ __volatile__ (
139 "stlr %w[value], %[ptr] \n\t"
157 __asm__ __volatile__ (
158 "ldar %w[value], %[ptr] \n\t"
159 : [value]
"=r" (value)
177 Atomic64 new_value) {
181 __asm__ __volatile__ (
183 "ldxr %[prev], %[ptr] \n\t"
184 "cmp %[prev], %[old_value] \n\t"
186 "stxr %w[temp], %[new_value], %[ptr] \n\t"
187 "cbnz %w[temp], 0b \n\t"
189 : [prev]
"=&r" (prev),
192 : [old_value]
"IJr" (old_value),
193 [new_value]
"r" (new_value)
201 Atomic64 new_value) {
205 __asm__ __volatile__ (
207 "ldxr %[result], %[ptr] \n\t"
208 "stxr %w[temp], %[new_value], %[ptr] \n\t"
209 "cbnz %w[temp], 0b \n\t"
210 : [result]
"=&r" (result),
213 : [new_value]
"r" (new_value)
221 Atomic64 increment) {
225 __asm__ __volatile__ (
227 "ldxr %[result], %[ptr] \n\t"
228 "add %[result], %[result], %[increment] \n\t"
229 "stxr %w[temp], %[result], %[ptr] \n\t"
230 "cbnz %w[temp], 0b \n\t"
231 : [result]
"=&r" (result),
234 : [increment]
"IJr" (increment)
242 Atomic64 increment) {
254 Atomic64 new_value) {
265 Atomic64 new_value) {
284 __asm__ __volatile__ (
285 "stlr %x[value], %[ptr] \n\t"
299 __asm__ __volatile__ (
300 "ldar %x[value], %[ptr] \n\t"
301 : [value]
"=r" (value)
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.