From: Guo Ren <guo...@linux.alibaba.com>

To reduce assembly codes, let's merge duplicate codes into one
(xchg_acquire, xchg_release, cmpxchg_release).

Signed-off-by: Guo Ren <guo...@linux.alibaba.com>
Link: 
https://lore.kernel.org/linux-riscv/CAJF2gTT1_mP-wiK2HsCpTeU61NqZVKZX1A5ye=twqvgn4tp...@mail.gmail.com/
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Michael Clark <michaeljcl...@mac.com>
Cc: Anup Patel <a...@brainfault.org>
Cc: Arnd Bergmann <a...@arndb.de>
Cc: Palmer Dabbelt <palmerdabb...@google.com>
---
 arch/riscv/include/asm/cmpxchg.h | 92 +++++---------------------------
 1 file changed, 12 insertions(+), 80 deletions(-)

diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h
index f1383c15e16b..50513b95411d 100644
--- a/arch/riscv/include/asm/cmpxchg.h
+++ b/arch/riscv/include/asm/cmpxchg.h
@@ -11,6 +11,12 @@
 #include <asm/barrier.h>
 #include <asm/fence.h>
 
+#define __local_acquire_fence()                                                
\
+       __asm__ __volatile__(RISCV_ACQUIRE_BARRIER "" ::: "memory")
+
+#define __local_release_fence()                                                
\
+       __asm__ __volatile__(RISCV_RELEASE_BARRIER "" ::: "memory")
+
 #define __xchg_relaxed(ptr, new, size)                                 \
 ({                                                                     \
        __typeof__(ptr) __ptr = (ptr);                                  \
@@ -46,58 +52,16 @@
 
 #define __xchg_acquire(ptr, new, size)                                 \
 ({                                                                     \
-       __typeof__(ptr) __ptr = (ptr);                                  \
-       __typeof__(new) __new = (new);                                  \
        __typeof__(*(ptr)) __ret;                                       \
-       switch (size) {                                                 \
-       case 4:                                                         \
-               __asm__ __volatile__ (                                  \
-                       "       amoswap.w %0, %2, %1\n"                 \
-                       RISCV_ACQUIRE_BARRIER                           \
-                       : "=r" (__ret), "+A" (*__ptr)                   \
-                       : "r" (__new)                                   \
-                       : "memory");                                    \
-               break;                                                  \
-       case 8:                                                         \
-               __asm__ __volatile__ (                                  \
-                       "       amoswap.d %0, %2, %1\n"                 \
-                       RISCV_ACQUIRE_BARRIER                           \
-                       : "=r" (__ret), "+A" (*__ptr)                   \
-                       : "r" (__new)                                   \
-                       : "memory");                                    \
-               break;                                                  \
-       default:                                                        \
-               BUILD_BUG();                                            \
-       }                                                               \
+       __ret = __xchg_relaxed(ptr, new, size);                         \
+       __local_acquire_fence();                                        \
        __ret;                                                          \
 })
 
 #define __xchg_release(ptr, new, size)                                 \
 ({                                                                     \
-       __typeof__(ptr) __ptr = (ptr);                                  \
-       __typeof__(new) __new = (new);                                  \
-       __typeof__(*(ptr)) __ret;                                       \
-       switch (size) {                                                 \
-       case 4:                                                         \
-               __asm__ __volatile__ (                                  \
-                       RISCV_RELEASE_BARRIER                           \
-                       "       amoswap.w %0, %2, %1\n"                 \
-                       : "=r" (__ret), "+A" (*__ptr)                   \
-                       : "r" (__new)                                   \
-                       : "memory");                                    \
-               break;                                                  \
-       case 8:                                                         \
-               __asm__ __volatile__ (                                  \
-                       RISCV_RELEASE_BARRIER                           \
-                       "       amoswap.d %0, %2, %1\n"                 \
-                       : "=r" (__ret), "+A" (*__ptr)                   \
-                       : "r" (__new)                                   \
-                       : "memory");                                    \
-               break;                                                  \
-       default:                                                        \
-               BUILD_BUG();                                            \
-       }                                                               \
-       __ret;                                                          \
+       __local_release_fence();                                        \
+       __xchg_relaxed(ptr, new, size);                                 \
 })
 
 #define __xchg(ptr, new, size)                                         \
@@ -215,40 +179,8 @@
 
 #define __cmpxchg_release(ptr, old, new, size)                         \
 ({                                                                     \
-       __typeof__(ptr) __ptr = (ptr);                                  \
-       __typeof__(*(ptr)) __old = (old);                               \
-       __typeof__(*(ptr)) __new = (new);                               \
-       __typeof__(*(ptr)) __ret;                                       \
-       register unsigned int __rc;                                     \
-       switch (size) {                                                 \
-       case 4:                                                         \
-               __asm__ __volatile__ (                                  \
-                       RISCV_RELEASE_BARRIER                           \
-                       "0:     lr.w %0, %2\n"                          \
-                       "       bne  %0, %z3, 1f\n"                     \
-                       "       sc.w %1, %z4, %2\n"                     \
-                       "       bnez %1, 0b\n"                          \
-                       "1:\n"                                          \
-                       : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr)    \
-                       : "rJ" ((long)__old), "rJ" (__new)              \
-                       : "memory");                                    \
-               break;                                                  \
-       case 8:                                                         \
-               __asm__ __volatile__ (                                  \
-                       RISCV_RELEASE_BARRIER                           \
-                       "0:     lr.d %0, %2\n"                          \
-                       "       bne %0, %z3, 1f\n"                      \
-                       "       sc.d %1, %z4, %2\n"                     \
-                       "       bnez %1, 0b\n"                          \
-                       "1:\n"                                          \
-                       : "=&r" (__ret), "=&r" (__rc), "+A" (*__ptr)    \
-                       : "rJ" (__old), "rJ" (__new)                    \
-                       : "memory");                                    \
-               break;                                                  \
-       default:                                                        \
-               BUILD_BUG();                                            \
-       }                                                               \
-       __ret;                                                          \
+       __local_release_fence();                                        \
+       __cmpxchg_relaxed(ptr, old, new, size);                         \
 })
 
 #define __cmpxchg(ptr, old, new, size)                                 \
-- 
2.17.1

Reply via email to