[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