diff options
author | Matias Elo <matias.elo@nokia.com> | 2021-10-05 08:32:21 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2021-10-12 14:37:27 +0300 |
commit | 224ea5008b5ee398a8a05d08b539fa31ad2eabdc (patch) | |
tree | 447c9affe8fa882a31afc08e97aaccbfc3bed8a7 /platform/linux-generic/arch/aarch64 | |
parent | 95c4e73efaa09a332bedc8b793a70af212896cf8 (diff) |
linux-gen: atomic: explicitly use staddl for 32-bit add/sub release ops
GCC generates LDADDL instructions when using __atomic_fetch_add() on
aarch64. Explicitly use STADDL to implement odp_atomic_add_rel_u32() and
odp_atomic_sub_rel_u32() functions for better performance.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Govindarajan Mohandoss <govindarajan.mohandoss@arm.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Diffstat (limited to 'platform/linux-generic/arch/aarch64')
-rw-r--r-- | platform/linux-generic/arch/aarch64/odp/api/abi/atomic_inlines.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/platform/linux-generic/arch/aarch64/odp/api/abi/atomic_inlines.h b/platform/linux-generic/arch/aarch64/odp/api/abi/atomic_inlines.h index f029b3f3d..1f834a7d7 100644 --- a/platform/linux-generic/arch/aarch64/odp/api/abi/atomic_inlines.h +++ b/platform/linux-generic/arch/aarch64/odp/api/abi/atomic_inlines.h @@ -205,6 +205,24 @@ static inline void _odp_atomic_dec_u64(odp_atomic_u64_t *atom) _odp_atomic_sub_u64(atom, 1); } +static inline void _odp_atomic_add_rel_u32(odp_atomic_u32_t *atom, uint32_t val) +{ + __asm__ volatile("staddl %w[val], %[atom]" + : [atom] "+Q" (atom->v) + : [val] "r" (val) + : "memory"); +} + +static inline void _odp_atomic_sub_rel_u32(odp_atomic_u32_t *atom, uint32_t val) +{ + int32_t neg_val = -val; + + __asm__ volatile("staddl %w[neg_val], %[atom]" + : [atom] "+Q" (atom->v) + : [neg_val] "r" (neg_val) + : "memory"); +} + #else /* !_ODP_LOCK_FREE_128BIT_ATOMICS */ /* Use generic implementation */ |