Normalize SSE support detection
[folly.git] / folly / Portability.h
index dd2df1be4110133109e882208995b2d7bb05e02b..7f7a8a1fe6e4defe03fce87bff918f146840c2c9 100644 (file)
@@ -79,6 +79,13 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
   __attribute__((__format__(__printf__, format_param, dots_param)))
 #endif
 
+// deprecated
+#if defined(__clang__) || defined(__GNUC__)
+# define FOLLY_DEPRECATED(msg) __attribute__((__deprecated__(msg)))
+#else
+# define FOLLY_DEPRECATED
+#endif
+
 // noreturn
 #if defined(_MSC_VER)
 # define FOLLY_NORETURN __declspec(noreturn)
@@ -113,6 +120,12 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
 # 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 /**/
@@ -147,6 +160,9 @@ struct MaxAlign { char c; } __attribute__((__aligned__));
 # 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 /**/
@@ -245,6 +261,32 @@ typedef SSIZE_T ssize_t;
 // compiler specific to compiler specific
 // nolint
 # define __PRETTY_FUNCTION__ __FUNCSIG__
+
+// Hide a GCC specific thing that breaks MSVC if left alone.
+# define __extension__
+
+#ifdef _M_IX86_FP
+# define FOLLY_SSE _M_IX86_FP
+#endif
+
+#endif
+
+#ifndef FOLLY_SSE
+# if defined(__SSE4_2__)
+#  define FOLLY_SSE 4.2
+# elif defined(__SSE4_1__)
+#  define FOLLY_SSE 4.1
+# elif defined(__SSE4__)
+#  define FOLLY_SSE 4
+# elif defined(__SSE3__)
+#  define FOLLY_SSE 3
+# elif defined(__SSE2__)
+#  define FOLLY_SSE 2
+# elif defined(__SSE__)
+#  define FOLLY_SSE 1
+# else
+#  define FOLLY_SSE 0
+# endif
 #endif
 
 #if FOLLY_UNUSUAL_GFLAGS_NAMESPACE
@@ -266,4 +308,37 @@ inline size_t malloc_usable_size(void* ptr) {
 }
 #endif
 
+// RTTI may not be enabled for this compilation unit.
+#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_