diff --git a/cpu/cortexm_common/Makefile.dep b/cpu/cortexm_common/Makefile.dep index d2f428394b7d..3b3c0bc9fe59 100644 --- a/cpu/cortexm_common/Makefile.dep +++ b/cpu/cortexm_common/Makefile.dep @@ -12,3 +12,9 @@ USEMODULE += newlib_nano # Export the peripheral drivers to be linked into the final binary: USEMODULE += periph + +# Use Hardware FPU by default if present +FEATURES_OPTIONAL += cortexm_fpu +ifneq (,$(filter cortexm_fpu,$(FEATURES_USED))) + DEFAULT_MODULE += cortexm_fpu +endif diff --git a/cpu/cortexm_common/Makefile.features b/cpu/cortexm_common/Makefile.features index 74b9888ac11e..1ddbe4e8969a 100644 --- a/cpu/cortexm_common/Makefile.features +++ b/cpu/cortexm_common/Makefile.features @@ -5,3 +5,8 @@ FEATURES_PROVIDED += periph_pm FEATURES_PROVIDED += cpp FEATURES_PROVIDED += cpu_check_address FEATURES_PROVIDED += ssp + +# cortex-m4f and cortex-m7 provide FPU support +ifneq (,$(filter $(CPU_ARCH),cortex-m4f cortex-m7)) + FEATURES_PROVIDED += cortexm_fpu +endif diff --git a/makefiles/arch/cortexm.inc.mk b/makefiles/arch/cortexm.inc.mk index e158e83fee27..2305ed4cc551 100644 --- a/makefiles/arch/cortexm.inc.mk +++ b/makefiles/arch/cortexm.inc.mk @@ -60,24 +60,18 @@ endif # BUILD_IN_DOCKER CFLAGS += -DCPU_MODEL_$(call uppercase_and_underscore,$(CPU_MODEL)) CFLAGS += -DCPU_ARCH_$(call uppercase_and_underscore,$(CPU_ARCH)) -# set the compiler specific CPU and FPU options -ifneq (,$(filter $(CPU_ARCH),cortex-m4f cortex-m7)) - ifneq (,$(filter cortexm_fpu,$(DISABLE_MODULE))) - CFLAGS_FPU ?= -mfloat-abi=soft +# Add corresponding FPU CFLAGS +# clang assumes there is an FPU, no CFLAGS necessary +ifneq (llvm, $(TOOLCHAIN)) + ifeq ($(CPU_ARCH),cortex-m7) + _CORTEX_HW_FPU_CFLAGS = -mfloat-abi=hard -mfpu=fpv5-sp-d16 else - USEMODULE += cortexm_fpu - # clang assumes there is an FPU - ifneq (llvm,$(TOOLCHAIN)) - ifeq ($(CPU_ARCH),cortex-m7) - CFLAGS_FPU ?= -mfloat-abi=hard -mfpu=fpv5-sp-d16 - else - CFLAGS_FPU ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 - endif - endif + _CORTEX_HW_FPU_CFLAGS = -mfloat-abi=hard -mfpu=fpv4-sp-d16 endif -else - CFLAGS_FPU ?= -mfloat-abi=soft endif +# Add soft or hard FPU CFLAGS depending on the module +# NOTE: This can be turned into normal conditional syntax once #9913 is fixed +CFLAGS_FPU ?= $(if $(filter cortexm_fpu,$(USEMODULE)),$(_CORTEX_HW_FPU_CFLAGS),-mfloat-abi=soft) ifeq ($(CPU_ARCH),cortex-m4f) MCPU = cortex-m4