From: Scott Wolchok Date: Sat, 27 Feb 2016 20:39:23 +0000 (-0800) Subject: Use yield, not wfe, for asm_volatile_pause on ARM and ARM64 X-Git-Tag: deprecate-dynamic-initializer~33 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=add5a7aeacacb050c4b0bad84aac1475fa2658c9;p=folly.git Use yield, not wfe, for asm_volatile_pause on ARM and ARM64 Summary:Found this hunting down LockFreeRingBuffer iOS perf problems. `wfe` and `yield` are similar, but `yield` is the instruction meant for "hey, I'm doing a spinlock", whereas `wfe` tries to wait for certain processor events. See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjafcggi.html Conveniently, it's the same instruction on 32-bit and 64-bit ARM. Reviewed By: yfeldblum Differential Revision: D2986160 fb-gh-sync-id: 34671256112e605bf857f9db54a56cf6bb6f1ee2 shipit-source-id: 34671256112e605bf857f9db54a56cf6bb6f1ee2 --- diff --git a/folly/Portability.h b/folly/Portability.h index a6241fea..98caa82c 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -430,8 +430,8 @@ inline void asm_volatile_pause() { ::_mm_pause(); #elif defined(__i386__) || FOLLY_X64 asm volatile ("pause"); -#elif FOLLY_A64 - asm volatile ("wfe"); +#elif FOLLY_A64 || defined(__arm__) + asm volatile ("yield"); #elif FOLLY_PPC64 asm volatile("or 27,27,27"); #endif @@ -441,8 +441,8 @@ inline void asm_pause() { ::_mm_pause(); #elif defined(__i386__) || FOLLY_X64 asm ("pause"); -#elif FOLLY_A64 - asm ("wfe"); +#elif FOLLY_A64 || defined(__arm__) + asm ("yield"); #elif FOLLY_PPC64 asm ("or 31,31,31"); #endif