# define FOLLY_X64 0
#endif
+#if defined(__aarch64__)
+# define FOLLY_A64 1
+#else
+# define FOLLY_A64 0
+#endif
+
// packing is very ugly in msvc
#ifdef _MSC_VER
# define FOLLY_PACK_ATTR /**/
# if defined(__clang__) || __GNUC_PREREQ(4, 7)
# define FOLLY_FINAL final
# define FOLLY_OVERRIDE override
+# elif defined(_MSC_VER) && _MSC_VER >= 1600
+# define FOLLY_FINAL final
+# define FOLLY_OVERRIDE override
# else
# define FOLLY_FINAL /**/
# define FOLLY_OVERRIDE /**/
#endif
// RTTI may not be enabled for this compilation unit.
-#if defined(__GXX_RTTI) || defined(__cpp_rtti)
+#if defined(__GXX_RTTI) || defined(__cpp_rtti) || \
+ (defined(_MSC_VER) && defined(_CPPRTTI))
# define FOLLY_HAS_RTTI 1
#endif
+#ifdef _MSC_VER
+# include <intrin.h>
+#endif
+
+namespace folly {
+
+inline void asm_volatile_pause() {
+#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
+ ::_mm_pause();
+#elif defined(__i386__) || FOLLY_X64
+ asm volatile ("pause");
+#elif FOLLY_A64
+ asm volatile ("wfe");
+#endif
+}
+inline void asm_pause() {
+#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
+ ::_mm_pause();
+#elif defined(__i386__) || FOLLY_X64
+ asm ("pause");
+#elif FOLLY_A64
+ asm ("wfe");
+#endif
+}
+
+}
+
#endif // FOLLY_PORTABILITY_H_