6#ifndef ZEPHYR_INCLUDE_ATOMIC_XTENSA_H_
7#define ZEPHYR_INCLUDE_ATOMIC_XTENSA_H_
11#include <xtensa/config/core-isa.h>
30 __asm__
volatile(
"l32ai %0, %1, 0"
31 :
"=r"(ret) :
"r"(target) :
"memory");
48#if XCHAL_HAVE_EXCLUSIVE || defined(__DOXYGEN__)
62 __asm__
volatile(
"l32ex %0, %1" :
"=r"(mem_val) :
"r"(addr));
64 if (mem_val == oldval) {
67 __asm__
volatile(
"s32ex %1, %2; getex %0" :
"=r"(result) :
"r"(newval),
"r"(addr));
73 return (result == 1U) ? oldval : ~oldval;
84#elif XCHAL_HAVE_S32C1I
97 __asm__
volatile(
"wsr %1, SCOMPARE1; s32c1i %0, %2, 0"
98 :
"+r"(newval),
"+r"(oldval) :
"r"(addr) :
"memory");
104#error "No available hardware support for atomic operations"
111 return oldval ==
xtensa_cas(target, oldval, newval);
128#define Z__GEN_ATOMXCHG(expr) ({ \
129 atomic_val_t res, cur; \
132 res = xtensa_cas(target, cur, (expr)); \
133 } while (res != cur); \
140 return Z__GEN_ATOMXCHG(value);
147 return Z__GEN_ATOMXCHG(cur + value);
154 return Z__GEN_ATOMXCHG(cur - value);
161 return Z__GEN_ATOMXCHG(cur + 1);
168 return Z__GEN_ATOMXCHG(cur - 1);
175 return Z__GEN_ATOMXCHG(cur | value);
182 return Z__GEN_ATOMXCHG(cur ^ value);
189 return Z__GEN_ATOMXCHG(cur & value);
196 return Z__GEN_ATOMXCHG(~(cur & value));
long atomic_t
Definition atomic_types.h:15
atomic_t atomic_val_t
Definition atomic_types.h:16
void * atomic_ptr_t
Definition atomic_types.h:17
static ALWAYS_INLINE void * atomic_ptr_set(atomic_ptr_t *target, void *value)
Implementation of atomic_ptr_set.
Definition atomic_xtensa.h:206
static ALWAYS_INLINE atomic_val_t atomic_inc(atomic_t *target)
Implementation of atomic_inc.
Definition atomic_xtensa.h:159
static ALWAYS_INLINE atomic_val_t atomic_and(atomic_t *target, atomic_val_t value)
Implementation of atomic_and.
Definition atomic_xtensa.h:186
static ALWAYS_INLINE atomic_val_t xtensa_cas(atomic_t *addr, atomic_val_t oldval, atomic_val_t newval)
Xtensa specific atomic compare-and-set (CAS).
Definition atomic_xtensa.h:56
static ALWAYS_INLINE atomic_val_t atomic_sub(atomic_t *target, atomic_val_t value)
Implementation of atomic_sub.
Definition atomic_xtensa.h:152
static ALWAYS_INLINE atomic_val_t atomic_set(atomic_t *target, atomic_val_t value)
Implementation of atomic_set.
Definition atomic_xtensa.h:138
static ALWAYS_INLINE void * atomic_ptr_get(const atomic_ptr_t *target)
Implementation of atomic_ptr_get.
Definition atomic_xtensa.h:200
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:109
static ALWAYS_INLINE atomic_val_t atomic_get(const atomic_t *target)
Implementation of atomic_get.
Definition atomic_xtensa.h:20
static ALWAYS_INLINE atomic_val_t atomic_add(atomic_t *target, atomic_val_t value)
Implementation of atomic_add.
Definition atomic_xtensa.h:145
static ALWAYS_INLINE atomic_val_t atomic_clear(atomic_t *target)
Implementation of atomic_clear.
Definition atomic_xtensa.h:212
static ALWAYS_INLINE atomic_val_t atomic_xor(atomic_t *target, atomic_val_t value)
Implementation of atomic_xor.
Definition atomic_xtensa.h:179
static ALWAYS_INLINE atomic_val_t atomic_nand(atomic_t *target, atomic_val_t value)
Implementation of atomic_nand.
Definition atomic_xtensa.h:193
static ALWAYS_INLINE bool atomic_ptr_cas(atomic_ptr_t *target, void *oldval, void *newval)
Implementation of atomic_ptr_cas.
Definition atomic_xtensa.h:116
static ALWAYS_INLINE atomic_val_t atomic_or(atomic_t *target, atomic_val_t value)
Implementation of atomic_or.
Definition atomic_xtensa.h:172
static ALWAYS_INLINE atomic_val_t atomic_dec(atomic_t *target)
Implementation of atomic_dec.
Definition atomic_xtensa.h:166
static ALWAYS_INLINE void * atomic_ptr_clear(atomic_ptr_t *target)
Implementation of atomic_ptr_clear.
Definition atomic_xtensa.h:218
__UINT32_TYPE__ uint32_t
Definition stdint.h:90