From 23342eff906a99fc0a006916d350c86426fd9204 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Sun, 18 Dec 2022 18:26:32 -0600 Subject: [PATCH] windows/Makefile: Fix float exact int formatting on 32-bit mingw. When compiler optimizations are enabled on the mingw version of gcc, we are getting failing tests because of rounding issues, for example: print(float("1e24")) would print 9.999999999999999e+23 instead of 1e+24 It turns out special compiler options are needed to get GCC to use the SSE instruction set instead of the 387 coprocessor (which uses 80-bit precision internall). Signed-off-by: David Lechner --- ports/windows/Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ports/windows/Makefile b/ports/windows/Makefile index 94bd3f99f9..bb635167da 100644 --- a/ports/windows/Makefile +++ b/ports/windows/Makefile @@ -86,6 +86,15 @@ ifneq ($(FROZEN_MANIFEST),) CFLAGS += -DMPZ_DIG_SIZE=16 endif +ifeq ($(shell $(CC) -dumpmachine),i686-w64-mingw32) +# GCC disables the SSE instruction set by default on i366 targets and we have +# to specify all three of these options to enable it. +# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html (see -mfpmath=unit section) +# Enabling the SSE instruction set is necessary to get correct rounding of floating points. +# https://lemire.me/blog/2020/06/26/gcc-not-nearest +CFLAGS += -msse -mfpmath=sse -march=pentium4 +endif + CXXFLAGS += $(filter-out -std=gnu99,$(CFLAGS)) include $(TOP)/py/mkrules.mk