From 5e0c946a27d6c00c6ce9341065abbc8b01a2a6b3 Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Mon, 17 Feb 2014 13:46:06 +0100 Subject: [PATCH] mk: rework cpu flags detection For cases where the compilation microarchitecture is explicitly given, we extract the cpu-flags to use from the compiler rather than hard-coding. This means that we will only ever use instruction sets supported by the compiler, rather than having a case where the uarch and the Intel DPDK both support a given instruction-set, but the compiler does not. In the case where 'native' uarch support is requested, the same mechanism is also used to detect the instruction-sets supported Signed-off-by: Bruce Richardson Signed-off-by: David Marchand --- mk/machine/atm/rte.vars.mk | 1 - mk/machine/default/rte.vars.mk | 1 - mk/machine/ivb/rte.vars.mk | 1 - mk/machine/native/rte.vars.mk | 51 ------------ mk/machine/nhm/rte.vars.mk | 1 - mk/machine/snb/rte.vars.mk | 1 - mk/machine/wsm/rte.vars.mk | 1 - mk/rte.cpuflags.mk | 100 +++++++++++++++++++++++ mk/target/generic/rte.vars.mk | 4 + mk/toolchain/gcc/rte.toolchain-compat.mk | 8 -- mk/toolchain/icc/rte.toolchain-compat.mk | 8 -- 11 files changed, 104 insertions(+), 73 deletions(-) create mode 100644 mk/rte.cpuflags.mk diff --git a/mk/machine/atm/rte.vars.mk b/mk/machine/atm/rte.vars.mk index 8effe751c2..5cdf6c4a1f 100644 --- a/mk/machine/atm/rte.vars.mk +++ b/mk/machine/atm/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=atom -CPUFLAGS = SSE SSE2 SSE3 SSSE3 diff --git a/mk/machine/default/rte.vars.mk b/mk/machine/default/rte.vars.mk index 730e531844..f05105a5e9 100644 --- a/mk/machine/default/rte.vars.mk +++ b/mk/machine/default/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS += -march=core2 -CPUFLAGS = SSE SSE2 SSE3 diff --git a/mk/machine/ivb/rte.vars.mk b/mk/machine/ivb/rte.vars.mk index f1d6f9e597..057e93323c 100644 --- a/mk/machine/ivb/rte.vars.mk +++ b/mk/machine/ivb/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=core-avx-i -CPUFLAGS = SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AES PCLMULQDQ AVX RDRAND FSGSBASE F16C diff --git a/mk/machine/native/rte.vars.mk b/mk/machine/native/rte.vars.mk index 9be1ccd2cc..0e55b85136 100644 --- a/mk/machine/native/rte.vars.mk +++ b/mk/machine/native/rte.vars.mk @@ -56,54 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=native -AUTO_CPUFLAGS = $(shell grep -m 1 flags /proc/cpuinfo) - -# adding flags to CPUFLAGS - -ifneq ($(filter $(AUTO_CPUFLAGS),sse),) -CPUFLAGS += SSE -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),sse2),) -CPUFLAGS += SSE2 -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),sse3),) -CPUFLAGS += SSE3 -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),ssse3),) -CPUFLAGS += SSSE3 -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),sse4_1),) -CPUFLAGS += SSE4_1 -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),sse4_2),) -CPUFLAGS += SSE4_2 -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),aes),) -CPUFLAGS += AES -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),pclmulqdq),) -CPUFLAGS += PCLMULQDQ -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),avx),) -CPUFLAGS += AVX -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),rdrnd),) -CPUFLAGS += RDRAND -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),fsgsbase),) -CPUFLAGS += FSGSBASE -endif - -ifneq ($(filter $(AUTO_CPUFLAGS),f16c),) -CPUFLAGS += F16C -endif diff --git a/mk/machine/nhm/rte.vars.mk b/mk/machine/nhm/rte.vars.mk index daa006262f..9a30203bba 100644 --- a/mk/machine/nhm/rte.vars.mk +++ b/mk/machine/nhm/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=corei7 -CPUFLAGS = SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 diff --git a/mk/machine/snb/rte.vars.mk b/mk/machine/snb/rte.vars.mk index 67864a64ab..1fadd813b2 100644 --- a/mk/machine/snb/rte.vars.mk +++ b/mk/machine/snb/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=corei7-avx -CPUFLAGS = SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AES PCLMULQDQ AVX diff --git a/mk/machine/wsm/rte.vars.mk b/mk/machine/wsm/rte.vars.mk index f91be19990..7d69a78694 100644 --- a/mk/machine/wsm/rte.vars.mk +++ b/mk/machine/wsm/rte.vars.mk @@ -56,4 +56,3 @@ # CPU_ASFLAGS = MACHINE_CFLAGS = -march=corei7 -maes -mpclmul -CPUFLAGS = SSE SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AES PCLMULQDQ diff --git a/mk/rte.cpuflags.mk b/mk/rte.cpuflags.mk new file mode 100644 index 0000000000..b8248a57e9 --- /dev/null +++ b/mk/rte.cpuflags.mk @@ -0,0 +1,100 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# this makefile is called from the generic rte.vars.mk and is +# used to set the RTE_CPUFLAG_* environment variables giving details +# of what instruction sets the target cpu supports. + +AUTO_CPUFLAGS := $(shell $(CC) $(MACHINE_CFLAGS) -dM -E - < /dev/null) + +# adding flags to CPUFLAGS + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSE__),) +CPUFLAGS += SSE +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSE2__),) +CPUFLAGS += SSE2 +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSE3__),) +CPUFLAGS += SSE3 +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSSE3__),) +CPUFLAGS += SSSE3 +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSE4_1__),) +CPUFLAGS += SSE4_1 +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__SSE4_2__),) +CPUFLAGS += SSE4_2 +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__AES__),) +CPUFLAGS += AES +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__PCLMUL__),) +CPUFLAGS += PCLMULQDQ +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__AVX__),) +CPUFLAGS += AVX +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__RDRND__),) +CPUFLAGS += RDRAND +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__FSGSBASE__),) +CPUFLAGS += FSGSBASE +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__F16C__),) +CPUFLAGS += F16C +endif + +ifneq ($(filter $(AUTO_CPUFLAGS),__AVX2__),) +CPUFLAGS += AVX2 +endif + +MACHINE_CFLAGS += $(addprefix -DRTE_MACHINE_CPUFLAG_,$(CPUFLAGS)) + +# To strip whitespace +comma:= , +empty:= +space:= $(empty) $(empty) +CPUFLAGSTMP1 := $(addprefix RTE_CPUFLAG_,$(CPUFLAGS)) +CPUFLAGSTMP2 := $(subst $(space),$(comma),$(CPUFLAGSTMP1)) +MACHINE_CFLAGS += -DRTE_COMPILE_TIME_CPUFLAGS=$(CPUFLAGSTMP2) diff --git a/mk/target/generic/rte.vars.mk b/mk/target/generic/rte.vars.mk index 8b0cc25a51..796cca7da2 100644 --- a/mk/target/generic/rte.vars.mk +++ b/mk/target/generic/rte.vars.mk @@ -102,6 +102,10 @@ include $(RTE_SDK)/mk/exec-env/$(RTE_EXEC_ENV)/rte.vars.mk # provided by Kbuild framework. ifeq ($(KERNELRELEASE),) +# now that the environment is mostly set up, including the machine type we will +# be passing to the compiler, set up the specific CPU flags based on that info. +include $(RTE_SDK)/mk/rte.cpuflags.mk + # merge all CFLAGS CFLAGS := $(CPU_CFLAGS) $(EXECENV_CFLAGS) $(TOOLCHAIN_CFLAGS) $(MACHINE_CFLAGS) CFLAGS += $(TARGET_CFLAGS) diff --git a/mk/toolchain/gcc/rte.toolchain-compat.mk b/mk/toolchain/gcc/rte.toolchain-compat.mk index dfb72c5ada..730b2f6d48 100644 --- a/mk/toolchain/gcc/rte.toolchain-compat.mk +++ b/mk/toolchain/gcc/rte.toolchain-compat.mk @@ -86,12 +86,4 @@ else MACHINE_CFLAGS := $(filter-out -march% -mtune% -msse%,$(MACHINE_CFLAGS)) endif endif -MACHINE_CFLAGS += $(addprefix -DRTE_MACHINE_CPUFLAG_,$(CPUFLAGS)) -# To strip whitespace -comma:= , -empty:= -space:= $(empty) $(empty) -CPUFLAGSTMP1 := $(addprefix RTE_CPUFLAG_,$(CPUFLAGS)) -CPUFLAGSTMP2 := $(subst $(space),$(comma),$(CPUFLAGSTMP1)) -MACHINE_CFLAGS += -DRTE_COMPILE_TIME_CPUFLAGS=$(CPUFLAGSTMP2) diff --git a/mk/toolchain/icc/rte.toolchain-compat.mk b/mk/toolchain/icc/rte.toolchain-compat.mk index 6e15dd89da..888b133a4f 100644 --- a/mk/toolchain/icc/rte.toolchain-compat.mk +++ b/mk/toolchain/icc/rte.toolchain-compat.mk @@ -71,12 +71,4 @@ else MACHINE_CFLAGS := $(patsubst -march=%,-xSSE3,$(MACHINE_CFLAGS)) endif endif -MACHINE_CFLAGS += $(addprefix -DRTE_MACHINE_CPUFLAG_,$(CPUFLAGS)) -# To strip whitespace -comma:= , -empty:= -space:= $(empty) $(empty) -CPUFLAGSTMP1 := $(addprefix RTE_CPUFLAG_,$(CPUFLAGS)) -CPUFLAGSTMP2 := $(subst $(space),$(comma),$(CPUFLAGSTMP1)) -MACHINE_CFLAGS += -DRTE_COMPILE_TIME_CPUFLAGS=$(CPUFLAGSTMP2) -- 2.20.1