From 035d5c7bcccf706ed34368ccf004a195ae6015e5 Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Sun, 30 Apr 2023 19:16:03 +1000 Subject: [PATCH] Improve x86 detection to fix compiler errors on other architectures Also some related minor makefile cleanup. Closes https://gitlab.com/xonotic/darkplaces/-/issues/382 See also: 1244b3ab0853e8738c8f5e5b617e8d8f25d4eca4 Signed-off-by: bones_was_here --- makefile | 20 +++++++++++++------- makefile.inc | 13 +++++++------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/makefile b/makefile index 064a6e7b..36f6c935 100644 --- a/makefile +++ b/makefile @@ -29,21 +29,27 @@ endif # ifndef DP_MAKE_TARGET # If we're targeting an x86 CPU we want to enable DP_SSE (CFLAGS_SSE and SSE2) ifeq ($(DP_MAKE_TARGET), mingw) DP_SSE:=1 +else ifeq ($(OS),Windows_NT) + ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) + DP_SSE:=1 + else ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) + DP_SSE:=1 + else ifeq ($(PROCESSOR_ARCHITECTURE),x86) + DP_SSE:=1 + else + DP_SSE:=0 + endif else DP_MACHINE:=$(shell uname -m) ifeq ($(DP_MACHINE),x86_64) DP_SSE:=1 - else - ifeq ($(DP_MACHINE),i686) + else ifeq ($(DP_MACHINE),i686) DP_SSE:=1 - else - ifeq ($(DP_MACHINE),i386) + else ifeq ($(DP_MACHINE),i386) DP_SSE:=1 else DP_SSE:=0 - endif # ifeq ($(DP_MACHINE),i386) - endif # ifeq ($(DP_MACHINE),i686) - endif # ifeq ($(DP_MACHINE),x86_64) + endif endif # Makefile name diff --git a/makefile.inc b/makefile.inc index e1e1621c..87b114ce 100644 --- a/makefile.inc +++ b/makefile.inc @@ -18,14 +18,15 @@ CC?=gcc # 686 (Pentium Pro/II) optimizations #CPUOPTIMIZATIONS?=-march=i686 # No specific CPU (386 compatible) -#CPUOPTIMIZATIONS?= -# Experimental -#CPUOPTIMIZATIONS?=-fno-math-errno -fno-rounding-math -fno-signaling-nans -fassociative-math -freciprocal-math -fno-signed-zeros -fno-trapping-math -# Normal -CPUOPTIMIZATIONS?=-mno-avx +CPUOPTIMIZATIONS?= +# x86 +ifeq ($(DP_SSE),1) + CPUOPTIMIZATIONS+=-mno-avx +endif +# bones_was_here: added -mno-avx because when compiling for (at least) haswell or skylake with gcc or clang, with both -O2 and -O3, AVX auto-vectorisation causes subtle bugs in Xonotic QC physics, and changes the hash generated by the CI pipeline. AVX2 seems to be OK. +# Also moved -fno-math-errno -fno-trapping-math (etc) to OPTIM_RELEASE as they're not CPU-specific. # NOTE: *never* *ever* use the -ffast-math or -funsafe-math-optimizations flag # Also, since gcc 5, -ffinite-math-only makes NaN and zero compare equal inside engine code but not inside QC, which causes error spam for seemingly valid QC code like if (x != 0) return 1 / x; -# bones_was_here: added -mno-avx because when compiling for (at least) haswell or skylake with gcc or clang, with both -O2 and -O3, AVX auto-vectorisation causes subtle bugs in Xonotic QC physics, and changes the hash generated by the CI pipeline. AVX2 seems to be OK. Also moved -fno-math-errno -fno-trapping-math to OPTIM_RELEASE as they're not CPU-specific. SDL_CONFIG?=sdl2-config SDLCONFIG_UNIXCFLAGS?=`$(SDL_CONFIG) --cflags` -- 2.39.2