All of lore.kernel.org
 help / color / mirror / Atom feed
* [dpdk-dev] [RFC] eal/arm: remove CASP constraints for GCC
@ 2021-10-04 10:03 pbhagavatula
  2021-10-18  6:39 ` Ruifeng Wang
  2021-11-05  8:57 ` [dpdk-dev] [PATCH v2] " pbhagavatula
  0 siblings, 2 replies; 7+ messages in thread
From: pbhagavatula @ 2021-10-04 10:03 UTC (permalink / raw)
  To: jerinj, Ruifeng Wang; +Cc: dev, Pavan Nikhilesh

From: Pavan Nikhilesh <pbhagavatula@marvell.com>

GCC now assigns even register pairs for CASP, the fix has also been
backported to all stable releases of older GCC versions.
Removing the manual register allocation allows GCC to inline the
functions and pick optimal registers for performing CASP.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 lib/eal/arm/include/rte_atomic_64.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lib/eal/arm/include/rte_atomic_64.h b/lib/eal/arm/include/rte_atomic_64.h
index fa6f334c0d..f6f31ae777 100644
--- a/lib/eal/arm/include/rte_atomic_64.h
+++ b/lib/eal/arm/include/rte_atomic_64.h
@@ -52,6 +52,7 @@ rte_atomic_thread_fence(int memorder)
 #define __LSE_PREAMBLE	""
 #endif
 
+#if defined(__clang__)
 #define __ATOMIC128_CAS_OP(cas_op_name, op_string)                          \
 static __rte_noinline void                                                  \
 cas_op_name(rte_int128_t *dst, rte_int128_t *old, rte_int128_t updated)     \
@@ -76,6 +77,19 @@ cas_op_name(rte_int128_t *dst, rte_int128_t *old, rte_int128_t updated)     \
 	old->val[0] = x0;                                                   \
 	old->val[1] = x1;                                                   \
 }
+#else
+#define __ATOMIC128_CAS_OP(cas_op_name, op_string)                          \
+static __rte_always_inline void                                             \
+cas_op_name(rte_int128_t *dst, rte_int128_t *old, rte_int128_t updated)     \
+{                                                                           \
+	asm volatile(                                                       \
+		__LSE_PREAMBLE                                              \
+		op_string " %[old], %H[old], %[upd], %H[upd], [%[dst]]"     \
+		: [old] "+r"(old->int128)                                   \
+		: [upd] "r"(updated.int128), [dst] "r"(dst)                 \
+		: "memory");                                                \
+}
+#endif
 
 __ATOMIC128_CAS_OP(__cas_128_relaxed, "casp")
 __ATOMIC128_CAS_OP(__cas_128_acquire, "caspa")
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-02-11  7:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-04 10:03 [dpdk-dev] [RFC] eal/arm: remove CASP constraints for GCC pbhagavatula
2021-10-18  6:39 ` Ruifeng Wang
2021-11-05  8:57 ` [dpdk-dev] [PATCH v2] " pbhagavatula
2021-11-08  7:15   ` Ruifeng Wang
2021-11-16 14:56     ` David Marchand
2022-01-20 15:32       ` [EXT] " Pavan Nikhilesh Bhagavatula
2022-02-11  7:53       ` David Marchand

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.