6#ifndef ZEPHYR_INCLUDE_ARCH_XTENSA_ATOMIC_XTENSA_H_
7#define ZEPHYR_INCLUDE_ARCH_XTENSA_ATOMIC_XTENSA_H_
11#include <xtensa/config/core-isa.h>
31 __asm__
volatile(
"l32ai %0, %1, 0"
32 :
"=r"(ret) :
"r"(target) :
"memory");
36#if XCHAL_HAVE_EXCLUSIVE || defined(__DOXYGEN__)
56 :
"=&r"(mem_val),
"+&r"(newval),
"+&r"(result)
57 :
"r"(target),
"r"(oldval)
83 :
"=&r"(oldval),
"=&r"(result)
84 :
"r"(target),
"r"(value)
86 }
while (result == 0);
104 :
"=&r"(oldval),
"=&r"(result)
105 :
"r"(target),
"r"(value)
107 }
while (result == 0);
125 :
"=&r"(oldval),
"=&r"(result)
126 :
"r"(target),
"r"(value)
128 }
while (result == 0);
146 :
"=&r"(oldval),
"=&r"(result)
149 }
while (result == 0);
167 :
"=&r"(oldval),
"=&r"(result)
170 }
while (result == 0);
187 :
"=&r"(oldval),
"=&r"(result)
188 :
"r"(target),
"r"(value)
190 }
while (result == 0);
207 :
"=&r"(oldval),
"=&r"(result)
208 :
"r"(target),
"r"(value)
210 }
while (result == 0);
228 :
"=&r"(oldval),
"=&r"(result)
229 :
"r"(target),
"r"(value)
231 }
while (result == 0);
251 :
"=&r"(oldval),
"=&r"(result)
252 :
"r"(target),
"r"(value)
254 }
while (result == 0);
259#elif XCHAL_HAVE_S32C1I
282 __asm__
volatile(
"wsr %1, SCOMPARE1; s32c1i %0, %2, 0"
283 :
"+r"(newval),
"+r"(oldval) :
"r"(addr) :
"memory");
292 return oldval == xtensa_cas(target, oldval, newval);
309#define Z__GEN_ATOMXCHG(expr) ({ \
310 atomic_val_t res, cur; \
313 res = xtensa_cas(target, cur, (expr)); \
314 } while (res != cur); \
321 return Z__GEN_ATOMXCHG(value);
328 return Z__GEN_ATOMXCHG(cur + value);
335 return Z__GEN_ATOMXCHG(cur - value);
342 return Z__GEN_ATOMXCHG(cur + 1);
349 return Z__GEN_ATOMXCHG(cur - 1);
356 return Z__GEN_ATOMXCHG(cur | value);
363 return Z__GEN_ATOMXCHG(cur ^ value);
370 return Z__GEN_ATOMXCHG(cur & value);
377 return Z__GEN_ATOMXCHG(~(cur & value));
381#error "No available hardware support for atomic operations"
static ALWAYS_INLINE void * atomic_ptr_set(atomic_ptr_t *target, void *value)
Implementation of atomic_ptr_set.
Definition atomic_xtensa.h:391
static ALWAYS_INLINE atomic_val_t atomic_inc(atomic_t *target)
Implementation of atomic_inc.
Definition atomic_xtensa.h:135
static ALWAYS_INLINE atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
Implementation of atomic_and.
Definition atomic_xtensa.h:216
static ALWAYS_INLINE atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
Implementation of atomic_sub.
Definition atomic_xtensa.h:114
static ALWAYS_INLINE atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
Implementation of atomic_set.
Definition atomic_xtensa.h:72
static ALWAYS_INLINE void * atomic_ptr_get(const atomic_ptr_t *target)
Implementation of atomic_ptr_get.
Definition atomic_xtensa.h:385
static ALWAYS_INLINE bool atomic_cas(atomic_t *target, atomic_val_t oldval, atomic_val_t newval)
Implementation of atomic_cas.
Definition atomic_xtensa.h:40
static ALWAYS_INLINE atomic_val_t atomic_get(const atomic_t *target)
Implementation of atomic_get.
Definition atomic_xtensa.h:21
static ALWAYS_INLINE atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
Implementation of atomic_add.
Definition atomic_xtensa.h:93
static ALWAYS_INLINE atomic_val_t atomic_clear(atomic_t *target)
Implementation of atomic_clear.
Definition atomic_xtensa.h:397
static ALWAYS_INLINE atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
Implementation of atomic_xor.
Definition atomic_xtensa.h:196
static ALWAYS_INLINE atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
Implementation of atomic_nand.
Definition atomic_xtensa.h:237
static ALWAYS_INLINE bool atomic_ptr_cas(atomic_ptr_t *target, void *oldval, void *newval)
Implementation of atomic_ptr_cas.
Definition atomic_xtensa.h:65
static ALWAYS_INLINE atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
Implementation of atomic_or.
Definition atomic_xtensa.h:176
static ALWAYS_INLINE atomic_val_t atomic_dec(atomic_t *target)
Implementation of atomic_dec.
Definition atomic_xtensa.h:156
static ALWAYS_INLINE void * atomic_ptr_clear(atomic_ptr_t *target)
Implementation of atomic_ptr_clear.
Definition atomic_xtensa.h:403
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
atomic_t atomic_val_t
Value type for atomic integer variables.
Definition atomic_types.h:38
void * atomic_ptr_t
Atomic pointer variable.
Definition atomic_types.h:46
__UINT32_TYPE__ uint32_t
Definition stdint.h:90