[RFC PATCH v3 2/6] riscv/cmpxchg: Deduplicate cmpxchg() macros
From: Leonardo Bras
Date: Tue Apr 04 2023 - 12:38:49 EST
Every cmpxchg define (_relaxed, _acquire, _release, vanilla) contain it's
own define for creating tmp variables and selecting the correct asm code
for give variable size.
All those defines are mostly the same code (other than specific barriers),
so there is no need to keep the 4 copies.
Unify those under a more general define, that can reproduce the previous 4
versions.
(This did not cause any change in generated asm)
Signed-off-by: Leonardo Bras <leobras@xxxxxxxxxx>
---
arch/riscv/include/asm/cmpxchg.h | 82 ++++++--------------------------
1 file changed, 14 insertions(+), 68 deletions(-)
diff --git a/arch/riscv/include/asm/cmpxchg.h b/arch/riscv/include/asm/cmpxchg.h
index 22f2ad13cad71..f76a82274a4fd 100644
--- a/arch/riscv/include/asm/cmpxchg.h
+++ b/arch/riscv/include/asm/cmpxchg.h
@@ -164,8 +164,8 @@
* indicated by comparing RETURN with OLD.
*/
-#define ___cmpxchg(lr_sfx, sc_sfx, prepend, append, r, rc, p, co, o, n) \
-{ \
+#define ____cmpxchg(lr_sfx, sc_sfx, prepend, append, r, rc, p, co, o, n)\
+({ \
__asm__ __volatile__ ( \
prepend \
"0: lr" lr_sfx " %0, %2\n" \
@@ -177,9 +177,9 @@
: "=&r" (r), "=&r" (rc), "+A" (*(p)) \
: "rJ" (co o), "rJ" (n) \
: "memory"); \
-}
+})
-#define __cmpxchg_relaxed(ptr, old, new, size) \
+#define ___cmpxchg(ptr, old, new, size, sc_sfx, prepend, append) \
({ \
__typeof__(ptr) __ptr = (ptr); \
__typeof__(*(ptr)) __old = (old); \
@@ -188,12 +188,12 @@
register unsigned int __rc; \
switch (size) { \
case 4: \
- ___cmpxchg(".w", ".w", "", "", \
- __ret, __rc, __ptr, (long), __old, __new); \
+ ____cmpxchg(".w", ".w" sc_sfx, prepend, append, \
+ __ret, __rc, __ptr, (long), __old, __new); \
break; \
case 8: \
- ___cmpxchg(".d", ".d", "", "", \
- __ret, __rc, __ptr, /**/, __old, __new); \
+ ____cmpxchg(".d", ".d" sc_sfx, prepend, append, \
+ __ret, __rc, __ptr, /**/, __old, __new); \
break; \
default: \
BUILD_BUG(); \
@@ -201,6 +201,9 @@
__ret; \
})
+#define __cmpxchg_relaxed(ptr, old, new, size) \
+ ___cmpxchg(ptr, old, new, size, "", "", "")
+
#define arch_cmpxchg_relaxed(ptr, o, n) \
({ \
__typeof__(*(ptr)) _o_ = (o); \
@@ -210,26 +213,7 @@
})
#define __cmpxchg_acquire(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: \
- ___cmpxchg(".w", ".w", "", RISCV_ACQUIRE_BARRIER, \
- __ret, __rc, __ptr, (long), __old, __new); \
- break; \
- case 8: \
- ___cmpxchg(".d", ".d", "", RISCV_ACQUIRE_BARRIER, \
- __ret, __rc, __ptr, /**/, __old, __new); \
- break; \
- default: \
- BUILD_BUG(); \
- } \
- __ret; \
-})
+ ___cmpxchg(ptr, old, new, size, "", "", RISCV_ACQUIRE_BARRIER)
#define arch_cmpxchg_acquire(ptr, o, n) \
({ \
@@ -240,26 +224,7 @@
})
#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: \
- ___cmpxchg(".w", ".w", RISCV_RELEASE_BARRIER, "", \
- __ret, __rc, __ptr, (long), __old, __new); \
- break; \
- case 8: \
- ___cmpxchg(".d", ".d", RISCV_RELEASE_BARRIER, "", \
- __ret, __rc, __ptr, /**/, __old, __new); \
- break; \
- default: \
- BUILD_BUG(); \
- } \
- __ret; \
-})
+ ___cmpxchg(ptr, old, new, size, "", RISCV_RELEASE_BARRIER, "")
#define arch_cmpxchg_release(ptr, o, n) \
({ \
@@ -270,26 +235,7 @@
})
#define __cmpxchg(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: \
- ___cmpxchg(".w", ".w.rl", "", " fence rw, rw\n", \
- __ret, __rc, __ptr, (long), __old, __new); \
- break; \
- case 8: \
- ___cmpxchg(".d", ".d.rl", "", " fence rw, rw\n", \
- __ret, __rc, __ptr, /**/, __old, __new); \
- break; \
- default: \
- BUILD_BUG(); \
- } \
- __ret; \
-})
+ ___cmpxchg(ptr, old, new, size, ".rl", "", " fence rw, rw\n")
#define arch_cmpxchg(ptr, o, n) \
({ \
--
2.40.0