aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/arch/aarch64
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2021-10-05 08:32:21 +0300
committerMatias Elo <matias.elo@nokia.com>2021-10-12 14:37:27 +0300
commit224ea5008b5ee398a8a05d08b539fa31ad2eabdc (patch)
tree447c9affe8fa882a31afc08e97aaccbfc3bed8a7 /platform/linux-generic/arch/aarch64
parent95c4e73efaa09a332bedc8b793a70af212896cf8 (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.h18
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 */