https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110096
Bug ID: 110096 Summary: Would be nice if __builtin_ia32_pause had a portable equivalent as it's applicable to ARM Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: pdimov at gmail dot com Target Milestone: --- This is more of a feature request than a bug. Currently `__builtin_ia32_pause()` only applies to Intel/AMD CPUs (hence the `ia32` in the name), but it has a straightforward and equivalent meaning for ARM (issue a YIELD instruction, which is the exact ARM equivalent to the PAUSE x86 one.) This forces us to do things like ``` #if __has_builtin(__builtin_ia32_pause) __builtin_ia32_pause(); #elif defined(__GNUC__) && ( (defined(__ARM_ARCH) && __ARM_ARCH >= 8) || defined(__ARM_ARCH_8A__) || defined(__aarch64__) ) __asm__ __volatile__( "yield" : : : "memory" ); // ... ``` (E.g. https://github.com/boostorg/core/blob/3b96d237c0e3ada30c9beca0f60062a2576dcafd/include/boost/core/detail/sp_thread_pause.hpp) This can be solved in one of two ways; one, extend `__builtin_ia32_pause` to do the right thing for ARM - unprincipled because of ia32 in the name, but will automagically "fix" all code using `#if __has_builtin(__builtin_ia32_pause)`. Or two, add a portable spelling for the intrinsic, either `__builtin_pause()` or `__builtin_yield()`. (Failing that, an ARM-specific `__builtin_arm_yield()` would still be an improvement over the above because it at least will allow us to not hardcode the ARM target detection, which we are probably getting wrong.)