summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/arch.hpp45
-rw-r--r--compat/fpu.hpp40
-rw-r--r--compat/prelude.hpp6
3 files changed, 91 insertions, 0 deletions
diff --git a/compat/arch.hpp b/compat/arch.hpp
new file mode 100644
index 00000000..0b58b65a
--- /dev/null
+++ b/compat/arch.hpp
@@ -0,0 +1,45 @@
+#pragma once
+
+#if defined _MSC_VER
+# ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wreserved-id-macro"
+# pragma clang diagnostic ignored "-Wunused-macros"
+# endif
+
+# 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
+# endif
+
+# ifdef __clang__
+# pragma clang diagnostic pop
+# endif
+#endif
+
+#if defined __SSE3__
+# define FLOORMAT_ARCH_DENORM_DAZ
+# include <pmmintrin.h>
+#elif defined __SSE2__
+# define FLOORMAT_ARCH_DENORM_FTZ
+# include <emmintrin.h>
+#endif
+
+#if defined __SSE2__
+# define FLOORMAT_ARCH_FPU_MASK
+# include <xmmintrin.h>
+#endif
+
diff --git a/compat/fpu.hpp b/compat/fpu.hpp
new file mode 100644
index 00000000..1b3776f9
--- /dev/null
+++ b/compat/fpu.hpp
@@ -0,0 +1,40 @@
+#pragma once
+#include "arch.hpp"
+
+#ifdef __MINGW32__
+extern "C" __declspec(dllimport) unsigned __cdecl _controlfp(unsigned, unsigned);
+#endif
+
+static inline void set_fp_mask()
+{
+#if defined FLOORMAT_ARCH_DENORM_DAZ
+ _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
+#elif defined FLOORMAT_ARCH_DENORM_FTZ
+ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
+#endif
+
+#ifdef FLOORMAT_ARCH_FPU_MASK
+ _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK);
+#endif
+
+#ifdef __APPLE__
+ fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
+#endif
+
+#ifdef _WIN32
+# ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wreserved-id-macro"
+# endif
+# ifndef _DN_FLUSH
+# define _DN_FLUSH 0x01000000
+# endif
+# ifndef _MCW_DN
+# define _MCW_DN 0x03000000
+# endif
+# ifdef __clang__
+# pragma clang diagnostic pop
+# endif
+ _controlfp(_DN_FLUSH, _MCW_DN);
+#endif
+}
diff --git a/compat/prelude.hpp b/compat/prelude.hpp
new file mode 100644
index 00000000..8b0387c5
--- /dev/null
+++ b/compat/prelude.hpp
@@ -0,0 +1,6 @@
+#pragma once
+
+namespace Magnum {}
+namespace GAME_PROJECT_NAME {
+ using namespace ::Magnum;
+} // namespace GAME_PROJECT_NAME