From ba3c333611c4a825ae30ea97484b937e88b88778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Pawe=C5=82czyk?= Date: Tue, 5 Sep 2023 13:58:47 +0200 Subject: [PATCH] make : improve cpuinfo handling on x86 hosts (#1238) * make : simplify and correct x86 ISA extensions detection on the host It got broken in commit c5f9acf4b797 for Haiku and Mac OS (Intel), which report CPU features in upper case. Now we're finding the names in case-insensitive manner and as words. SSE3 detection has been corrected for Linux, which uses PNI for that (Prescott New Instructions). * make : use dmesg.boot in FreeBSD/DragonFlyBSD to detect x86 ISA extensions on the host * make : enable x86 ISA extensions on the host both in CFLAGS and CXXFLAGS * make : correct AVX x86 ISA extension detection on macOS (Intel) host It got broken in commit c5f9acf4b797. macOS calls it AVX1.0. --- Makefile | 60 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index a2631011..d775b74b 100644 --- a/Makefile +++ b/Makefile @@ -65,57 +65,57 @@ endif # Architecture specific # TODO: probably these flags need to be tweaked on some architectures # feel free to update the Makefile for your architecture and send a pull request or issue -ifeq ($(UNAME_M),$(filter $(UNAME_M),x86_64 i686)) +ifeq ($(UNAME_M),$(filter $(UNAME_M),x86_64 i686 amd64)) ifeq ($(UNAME_S),Darwin) CPUINFO_CMD := sysctl machdep.cpu.features else ifeq ($(UNAME_S),Linux) CPUINFO_CMD := cat /proc/cpuinfo else ifneq (,$(filter MINGW32_NT% MINGW64_NT%,$(UNAME_S))) CPUINFO_CMD := cat /proc/cpuinfo + else ifneq (,$(filter DragonFly FreeBSD,$(UNAME_S))) + CPUINFO_CMD := grep Features /var/run/dmesg.boot else ifeq ($(UNAME_S),Haiku) CPUINFO_CMD := sysinfo -cpu endif - ifdef CPUINFO_CMD - AVX_M := $(shell $(CPUINFO_CMD) | grep -m 1 "avx ") - ifneq (,$(findstring avx,$(AVX_M))) - CFLAGS += -mavx - endif - - AVX2_M := $(shell $(CPUINFO_CMD) | grep -m 1 "avx2 ") - ifneq (,$(findstring avx2,$(AVX2_M))) - CFLAGS += -mavx2 + ifdef CPUINFO_CMD + AVX_M := $(shell $(CPUINFO_CMD) | grep -iwE 'AVX|AVX1.0') + ifneq (,$(AVX_M)) + CFLAGS += -mavx + CXXFLAGS += -mavx endif - FMA_M := $(shell $(CPUINFO_CMD) | grep -m 1 "fma ") - ifneq (,$(findstring fma,$(FMA_M))) - CFLAGS += -mfma + AVX2_M := $(shell $(CPUINFO_CMD) | grep -iw 'AVX2') + ifneq (,$(AVX2_M)) + CFLAGS += -mavx2 + CXXFLAGS += -mavx2 endif - F16C_M := $(shell $(CPUINFO_CMD) | grep -m 1 "f16c ") - ifneq (,$(findstring f16c,$(F16C_M))) - CFLAGS += -mf16c - - AVX1_M := $(shell $(CPUINFO_CMD) | grep -m 1 "avx ") - ifneq (,$(findstring avx,$(AVX1_M))) - CFLAGS += -mavx - endif + FMA_M := $(shell $(CPUINFO_CMD) | grep -iw 'FMA') + ifneq (,$(FMA_M)) + CFLAGS += -mfma + CXXFLAGS += -mfma endif - SSE3_M := $(shell $(CPUINFO_CMD) | grep -m 1 "sse3 ") - ifneq (,$(findstring sse3,$(SSE3_M))) - CFLAGS += -msse3 + F16C_M := $(shell $(CPUINFO_CMD) | grep -iw 'F16C') + ifneq (,$(F16C_M)) + CFLAGS += -mf16c + CXXFLAGS += -mf16c endif - SSSE3_M := $(shell $(CPUINFO_CMD) | grep -m 1 "ssse3 ") - ifneq (,$(findstring ssse3,$(SSSE3_M))) - CFLAGS += -mssse3 + SSE3_M := $(shell $(CPUINFO_CMD) | grep -iwE 'PNI|SSE3') + ifneq (,$(SSE3_M)) + CFLAGS += -msse3 + CXXFLAGS += -msse3 + endif + + SSSE3_M := $(shell $(CPUINFO_CMD) | grep -iw 'SSSE3') + ifneq (,$(SSSE3_M)) + CFLAGS += -mssse3 + CXXFLAGS += -mssse3 endif endif endif -ifeq ($(UNAME_M),amd64) - CFLAGS += -mavx -mavx2 -mfma -mf16c -endif ifneq ($(filter ppc64%,$(UNAME_M)),) POWER9_M := $(shell grep "POWER9" /proc/cpuinfo)