A portable way to use pasue instructions.
221 {
222#if defined(_M_IX86) || defined(__I86__) || defined(i686) || \
223 defined(__i686) || defined(__i686__) || defined(i586) || \
224 defined(__i586) || defined(__i586__) || defined(i486) || \
225 defined(__i486) || defined(__i486__) || defined(i386) || \
226 defined(__i386) || defined(__i386__) || defined(_X86_) || \
227 defined(__X86__) || defined(__THW_INTEL__)
228# if defined(__SSE2__)
229 _mm_pause();
230# elif defined(_MSC_VER)
231 __asm pause;
232# else
233 __asm__ __volatile__("pause");
234# endif
235#elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || \
236 defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
237# if defined(__SSE2__)
238 _mm_pause();
239# endif
240#elif defined(__aarch64__) || defined(_M_ARM64)
241# if defined(_MSC_VER)
242 __isb(_ARM64_BARRIER_SY);
243# else
244 __asm__ __volatile__("isb\n");
245# endif
246#elif defined(__ARM_ARCH) || defined(_M_ARM) || defined(__arm__) || \
247 defined(__thumb__) || defined(__TARGET_ARCH_ARM) || defined(_ARM)
248# if defined(_MSC_VER)
249 __yield();
250# else
251 __asm__ __volatile__("yield");
252# endif
253#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || \
254 defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) || \
255 defined(__ppc)
256 __asm__ __volatile__("or 27,27,27" ::: "memory");
257#elif defined(__riscv) || defined(__riscv__)
258# if defined(__riscv_pause)
259 __builtin_riscv_pause();
260# else
261 __asm__ __volatile__("nop");
262# endif
263#elif defined(__loongarch32) || defined(__loongarch64)
264 __asm__ __volatile__("nop");
265#elif defined(__wasm__)
266 __asm__ __volatile__("nop");
267#endif
268}