Use yield, not wfe, for asm_volatile_pause on ARM and ARM64
authorScott Wolchok <swolchok@fb.com>
Sat, 27 Feb 2016 20:39:23 +0000 (12:39 -0800)
committerFacebook Github Bot 0 <facebook-github-bot-0-bot@fb.com>
Sat, 27 Feb 2016 20:50:31 +0000 (12:50 -0800)
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

folly/Portability.h

index a6241feaab0a641b0e1b067e68238d90e124f61d..98caa82c0769e02bc08490353667ba3e4614c846 100644 (file)
@@ -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