summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2018-12-26 17:41:13 +0100
committerStanislaw Halik <sthalik@misaki.pl>2018-12-26 17:45:02 +0100
commit6d1859ca8f747059042fef5434f4a365d289437c (patch)
tree3aeefb010129e8346109eb6a594727eb6a45c271 /compat
parent165ed6f945613e180fdbecc99328bd7ecbdc08ae (diff)
compat/arch: simplify microarchitecture detection
Diffstat (limited to 'compat')
-rw-r--r--compat/arch.hpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/compat/arch.hpp b/compat/arch.hpp
new file mode 100644
index 00000000..d5405f47
--- /dev/null
+++ b/compat/arch.hpp
@@ -0,0 +1,53 @@
+#pragma once
+
+// fix MSVC arch check macros
+
+// this file is too simple to fall under copyright, and
+// can be copied, modified, and redistributed freely with
+// no conditions. there's no warranty. -sh 20181226
+
+#ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wreserved-id-macro"
+# pragma clang diagnostic ignored "-Wunused-macros"
+#endif
+
+#if defined _MSC_VER
+# if defined _M_AMD64
+# undef __x86_64__
+# define __x86_64__ 1
+# elif defined _M_IX86
+# undef __i386__
+# define __i386__ 1
+# endif
+
+# if defined __AVX__ || defined __x86_64__ || \
+ defined _M_IX86 && _M_IX86_FP >= 2
+# undef __SSE__
+# undef __SSE2__
+# undef __SSE3__
+# define __SSE__ 1
+# define __SSE2__ 1
+# define __SSE3__ 1 // assume SSE3 in the _M_IX86_FP >= 2 case
+# endif
+#endif
+
+#ifdef __clang__
+# pragma clang diagnostic pop
+#endif
+
+#if defined __SSE3__
+# define OTR_ARCH_DENORM_DAZ
+# include <pmmintrin.h>
+#elif defined __SSE2__
+# define OTR_ARCH_DENORM_FTZ
+# include <emmintrin.h>
+#endif
+
+#if defined __SSE2__
+# define OTR_ARCH_FPU_MASK
+# include <xmmintrin.h>
+#endif
+
+#include <cfloat>
+#include <cfenv>