[PATCH] Cygwin: implement spinlock pause for AArch64
Brian Inglis
Brian.Inglis@SystematicSW.ab.ca
Thu Jun 12 20:31:57 GMT 2025
Rust apparently uses yield on arm32, and isb (instruction sync barrier) on
aarch64, as yield is effectively a NOP (although it could be implemented to free
up pipeline slots, SMT switch, or signal), while isb (with optional sy operand)
is more like pause on x86_64:
https://stackoverflow.com/a/70811680
https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/yield
https://developer.arm.com/documentation/ddi0596/2021-06/Base-Instructions/ISB--Instruction-Synchronization-Barrier-
https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/intrinsics/intrinsics-for-sse2/miscellaneous-functions-and-intrinsics/pause-intrinsic.html
On 2025-06-12 07:17, Radek Barton via Cygwin-patches wrote:
> This patch implements pause for spin locks at two places in the codebase: winsup/cygwin/local_includes/cygtls.h and winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc.
> ---
> From 0f82052a8c60811f784bbc76f6df1e0d9a971947 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Radek=20Barto=C5=88?= <radek.barton@microsoft.com>
> Date: Thu, 5 Jun 2025 12:41:37 +0200
> Subject: [PATCH] Cygwin: implement spinlock pause for AArch64
>
> ---
> winsup/cygwin/local_includes/cygtls.h | 4 +++-
> winsup/cygwin/thread.cc | 4 ++++
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/winsup/cygwin/local_includes/cygtls.h b/winsup/cygwin/local_includes/cygtls.h
> index 4698352ae..74ff92971 100644
> --- a/winsup/cygwin/local_includes/cygtls.h
> +++ b/winsup/cygwin/local_includes/cygtls.h
> @@ -242,8 +242,10 @@ public: /* Do NOT remove this public: line, it's a marker for gentls_offsets. */
> {
> while (InterlockedExchange (&stacklock, 1))
> {
> -#ifdef __x86_64__
> +#if defined(__x86_64__)
> __asm__ ("pause");
> +#elif defined(__aarch64__)
> + __asm__ ("yield");
> #else
> #error unimplemented for this target
> #endif
> diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
> index fea6079b8..a504e13b5 100644
> --- a/winsup/cygwin/thread.cc
> +++ b/winsup/cygwin/thread.cc
> @@ -1968,7 +1968,11 @@ pthread_spinlock::lock ()
> else if (spins < FAST_SPINS_LIMIT)
> {
> ++spins;
> +#if defined(__x86_64__)
> __asm__ volatile ("pause":::);
> +#elif defined(__aarch64__)
> + __asm__ volatile ("yield":::);
> +#endif
> }
> else
> {
--
Take care. Thanks, Brian Inglis Calgary, Alberta, Canada
La perfection est atteinte Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter not when there is no more to add
mais lorsqu'il n'y a plus rien à retrancher but when there is no more to cut
-- Antoine de Saint-Exupéry
More information about the Cygwin-patches
mailing list