aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/main/main.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index b764f552f83..97d2c512dfd 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -35,6 +35,11 @@
#include <sys/param.h>
#endif
+#if defined(_M_AMD64) && _MSC_VER == 1800
+#include <math.h>
+#include <versionhelpers.h>
+#endif
+
#include "bootstrap/bootstrap.h"
#include "postmaster/postmaster.h"
#include "tcop/tcopprot.h"
@@ -274,6 +279,22 @@ startup_hacks(const char *progname)
/* In case of general protection fault, don't show GUI popup box */
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+
+#if defined(_M_AMD64) && _MSC_VER == 1800
+ /*
+ * Avoid crashing in certain floating-point operations if
+ * we were compiled for x64 with MS Visual Studio 2013 and
+ * are running on Windows prior to 7/2008R2 SP1 on an
+ * AVX2-capable CPU.
+ *
+ * Ref: https://connect.microsoft.com/VisualStudio/feedback/details/811093/visual-studio-2013-rtm-c-x64-code-generation-bug-for-avx2-instructions
+ */
+ if (!IsWindows7SP1OrGreater())
+ {
+ _set_FMA3_enable(0);
+ }
+#endif /* defined(_M_AMD64) && _MSC_VER == 1800 */
+
}
#endif /* WIN32 */
}