![]() |
|
Message-Id: <20250918164720.337994-2-pincheng.plct@isrc.iscas.ac.cn> Date: Fri, 19 Sep 2025 00:47:20 +0800 From: Pincheng Wang <pincheng.plct@...c.iscas.ac.cn> To: musl@...ts.openwall.com Cc: pincheng.plct@...c.iscas.ac.cn Subject: [PATCH 1/1] riscv: add Zacas extension support for atomic CAS Add compile-time detection for RISC-V Zacas extension and use amocas.w.aqrl/amocas.d.aqrl instructions when available. When __riscv_zacas is defined, a_cas() and a_cas_p() use single amocas instructions instead of lr/sc loops. Falls back to existing lr/sc implementation when Zacas is not available. Signed-off-by: Pincheng Wang <pincheng.plct@...c.iscas.ac.cn> --- arch/riscv32/atomic_arch.h | 17 +++++++++++++++++ arch/riscv64/atomic_arch.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/arch/riscv32/atomic_arch.h b/arch/riscv32/atomic_arch.h index 4d418f63..64ef05b7 100644 --- a/arch/riscv32/atomic_arch.h +++ b/arch/riscv32/atomic_arch.h @@ -3,6 +3,21 @@ static inline void a_barrier() { __asm__ __volatile__ ("fence rw,rw" : : : "memory"); } +#ifdef __riscv_zacas + +#define a_cas a_cas +static inline int a_cas(volatile int *p, int t, int s) +{ + int old = t; + __asm__ __volatile__ ( + "amocas.w.aqrl %0, %2, %1" + : "+r"(old), "+A"(*(volatile int *)p) + : "r"(s) + : "memory"); + return old; +} + +#else /* Fallback to lr/sc when Zacas is not available */ #define a_cas a_cas static inline int a_cas(volatile int *p, int t, int s) @@ -19,3 +34,5 @@ static inline int a_cas(volatile int *p, int t, int s) : "memory"); return old; } + +#endif /* __riscv_zacas */ \ No newline at end of file diff --git a/arch/riscv64/atomic_arch.h b/arch/riscv64/atomic_arch.h index 0c382588..9681505e 100644 --- a/arch/riscv64/atomic_arch.h +++ b/arch/riscv64/atomic_arch.h @@ -4,6 +4,34 @@ static inline void a_barrier() __asm__ __volatile__ ("fence rw,rw" : : : "memory"); } +#ifdef __riscv_zacas + +#define a_cas a_cas +static inline int a_cas(volatile int *p, int t, int s) +{ + int old = t; + __asm__ __volatile__ ( + "amocas.w.aqrl %0, %2, %1" + : "+r"(old), "+A"(*(volatile int *)p) + : "r"(s) + : "memory"); + return old; +} + +#define a_cas_p a_cas_p +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ + void *old = t; + __asm__ __volatile__ ( + "amocas.d.aqrl %0, %2, %1" + : "+r"(old), "+A"(*(void *volatile *)p) + : "r"(s) + : "memory"); + return old; +} + +#else /* Fallback to lr/sc when Zacas is not available */ + #define a_cas a_cas static inline int a_cas(volatile int *p, int t, int s) { @@ -36,3 +64,5 @@ static inline void *a_cas_p(volatile void *p, void *t, void *s) : "memory"); return old; } + +#endif /* __riscv_zacas */ -- 2.39.5
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.