mirror of https://github.com/thesofproject/sof.git
Arch: Host: Update atomic functions for gcc and xt-xcc
This patch adds for host gcc build the updated atomic operations. These are intended to replace the previous __sync built-ins. For more information see https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html . The atomic functions for xcc are fake but sufficient for host arch build for static single-thread testbench. Suggested-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com> Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
This commit is contained in:
parent
e9cfb64f0d
commit
4e605c888b
|
@ -17,9 +17,44 @@ typedef struct {
|
|||
volatile int32_t value;
|
||||
} atomic_t;
|
||||
|
||||
#if defined __GNUC__ && !defined __XCC__
|
||||
|
||||
static inline int32_t arch_atomic_read(const atomic_t *a)
|
||||
{
|
||||
return (*(volatile int32_t *)&a->value);
|
||||
return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline void arch_atomic_set(atomic_t *a, int32_t value)
|
||||
{
|
||||
__atomic_store_n(&a->value, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline void arch_atomic_init(atomic_t *a, int32_t value)
|
||||
{
|
||||
__atomic_store_n(&a->value, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline int32_t arch_atomic_add(atomic_t *a, int32_t value)
|
||||
{
|
||||
return __atomic_add_fetch(&a->value, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value)
|
||||
{
|
||||
return __atomic_sub_fetch(&a->value, value, __ATOMIC_SEQ_CST);
|
||||
}
|
||||
|
||||
#elif defined __XCC__
|
||||
|
||||
/* fake locking: obviously this does nothing, and provides no real locking */
|
||||
#define lock() do {} while (0)
|
||||
#define unlock() do {} while (0)
|
||||
|
||||
/* Fake atomic functions for xt-run static single-thread testbench */
|
||||
|
||||
static inline int32_t arch_atomic_read(const atomic_t *a)
|
||||
{
|
||||
return a->value;
|
||||
}
|
||||
|
||||
static inline void arch_atomic_set(atomic_t *a, int32_t value)
|
||||
|
@ -32,17 +67,34 @@ static inline void arch_atomic_init(atomic_t *a, int32_t value)
|
|||
arch_atomic_set(a, value);
|
||||
}
|
||||
|
||||
/* use gcc atomic built-ins for host library */
|
||||
static inline int32_t arch_atomic_add(atomic_t *a, int32_t value)
|
||||
{
|
||||
return __sync_fetch_and_add(&a->value, value);
|
||||
int32_t tmp;
|
||||
|
||||
lock();
|
||||
tmp = a->value;
|
||||
a->value += value;
|
||||
unlock();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
static inline int32_t arch_atomic_sub(atomic_t *a, int32_t value)
|
||||
{
|
||||
return __sync_fetch_and_sub(&a->value, value);
|
||||
int32_t tmp;
|
||||
|
||||
lock();
|
||||
tmp = a->value;
|
||||
a->value -= value;
|
||||
unlock();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#error "Not gcc, not xt-xcc"
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __ARCH_ATOMIC_H__ */
|
||||
|
||||
#else
|
||||
|
|
Loading…
Reference in New Issue