Skip to content

Commit 6d4bce8

Browse files
committed
cmake: gcc: target_arm: Support advanced floating-point options
This commit updates the Zephyr build system to support specifying advanced floating-point compilation options derived from the newly introduced unified floating-point configurations. The following changes are introduced by this commit: 1. Specify architecture floating-point option to the `-mcpu` flag. 2. Specify floating-point unit (FPU) type using the `-mfpu` flag. Note that the `-march` flag is not specified separately because the `-mcpu` flag provides more detailed architecture options and this makes the `-march` flag redundant. Signed-off-by: Stephanos Ioannidis <[email protected]>
1 parent 5181c61 commit 6d4bce8

File tree

5 files changed

+71
-33
lines changed

5 files changed

+71
-33
lines changed

cmake/compiler/armclang/target.cmake

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ find_program(CMAKE_ASM_COMPILER ${CROSS_COMPILE}armclang PATHS ${TOOLCHAIN_HOME}
1010
# the final executable.
1111
#
1212
include(${ZEPHYR_BASE}/cmake/gcc-m-cpu.cmake)
13+
include(${ZEPHYR_BASE}/cmake/gcc-m-fpu.cmake)
1314
set(CMAKE_SYSTEM_PROCESSOR ${GCC_M_CPU})
1415

1516
list(APPEND TOOLCHAIN_C_FLAGS
@@ -30,20 +31,8 @@ else()
3031

3132
list(APPEND TOOLCHAIN_C_FLAGS -mabi=aapcs)
3233

33-
# Defines a mapping from GCC_M_CPU to FPU
34-
35-
if(CONFIG_CPU_HAS_FPU_DOUBLE_PRECISION)
36-
set(PRECISION_TOKEN)
37-
else()
38-
set(PRECISION_TOKEN sp-)
39-
endif()
40-
41-
set(FPU_FOR_cortex-m4 fpv4-${PRECISION_TOKEN}d16)
42-
set(FPU_FOR_cortex-m7 fpv5-${PRECISION_TOKEN}d16)
43-
set(FPU_FOR_cortex-m33 fpv5-${PRECISION_TOKEN}d16)
44-
4534
if(CONFIG_FPU)
46-
list(APPEND TOOLCHAIN_C_FLAGS -mfpu=${FPU_FOR_${GCC_M_CPU}})
35+
list(APPEND TOOLCHAIN_C_FLAGS -mfpu=${GCC_M_FPU})
4736
if (CONFIG_FP_SOFTABI)
4837
list(APPEND TOOLCHAIN_C_FLAGS -mfloat-abi=softfp)
4938
elseif(CONFIG_FP_HARDABI)

cmake/compiler/gcc/target.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ foreach(file_name include/stddef.h include-fixed/limits.h)
5151
endforeach()
5252

5353
include(${ZEPHYR_BASE}/cmake/gcc-m-cpu.cmake)
54+
include(${ZEPHYR_BASE}/cmake/gcc-m-fpu.cmake)
5455

5556
if("${ARCH}" STREQUAL "arm")
5657
include(${ZEPHYR_BASE}/cmake/compiler/gcc/target_arm.cmake)

cmake/compiler/gcc/target_arm.cmake

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,10 @@ endif()
1010
list(APPEND TOOLCHAIN_C_FLAGS -mabi=aapcs)
1111
list(APPEND TOOLCHAIN_LD_FLAGS -mabi=aapcs)
1212

13-
# Defines a mapping from GCC_M_CPU to FPU
14-
15-
if(CONFIG_CPU_HAS_FPU_DOUBLE_PRECISION)
16-
set(PRECISION_TOKEN)
17-
else()
18-
set(PRECISION_TOKEN sp-)
19-
endif()
20-
21-
set(FPU_FOR_cortex-m4 fpv4-${PRECISION_TOKEN}d16)
22-
set(FPU_FOR_cortex-m7 fpv5-${PRECISION_TOKEN}d16)
23-
set(FPU_FOR_cortex-m33 fpv5-${PRECISION_TOKEN}d16)
24-
set(FPU_FOR_cortex-m33+nodsp fpv5-${PRECISION_TOKEN}d16)
25-
set(FPU_FOR_cortex-m55 auto)
26-
set(FPU_FOR_cortex-m55+nomve.fp auto)
27-
set(FPU_FOR_cortex-m55+nomve auto)
28-
set(FPU_FOR_cortex-m55+nodsp auto)
29-
3013
if(CONFIG_FPU)
31-
list(APPEND TOOLCHAIN_C_FLAGS -mfpu=${FPU_FOR_${GCC_M_CPU}})
32-
list(APPEND TOOLCHAIN_LD_FLAGS -mfpu=${FPU_FOR_${GCC_M_CPU}})
14+
list(APPEND TOOLCHAIN_C_FLAGS -mfpu=${GCC_M_FPU})
15+
list(APPEND TOOLCHAIN_LD_FLAGS -mfpu=${GCC_M_FPU})
16+
3317
if (CONFIG_FP_SOFTABI)
3418
list(APPEND TOOLCHAIN_C_FLAGS -mfloat-abi=softfp)
3519
list(APPEND TOOLCHAIN_LD_FLAGS -mfloat-abi=softfp)

cmake/gcc-m-cpu.cmake

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,36 @@ if("${ARCH}" STREQUAL "arm")
3535
set(GCC_M_CPU cortex-m55+nodsp)
3636
endif()
3737
elseif(CONFIG_CPU_CORTEX_R4)
38-
set(GCC_M_CPU cortex-r4)
38+
if(CONFIG_FPU AND CONFIG_CPU_HAS_VFP)
39+
set(GCC_M_CPU cortex-r4f)
40+
else()
41+
set(GCC_M_CPU cortex-r4)
42+
endif()
3943
elseif(CONFIG_CPU_CORTEX_R5)
4044
set(GCC_M_CPU cortex-r5)
45+
if(CONFIG_FPU AND CONFIG_CPU_HAS_VFP)
46+
if(NOT CONFIG_VFP_FEATURE_DOUBLE_PRECISION)
47+
set(GCC_M_CPU ${GCC_M_CPU}+nofp.dp)
48+
endif()
49+
else()
50+
set(GCC_M_CPU ${GCC_M_CPU}+nofp)
51+
endif()
4152
elseif(CONFIG_CPU_CORTEX_R7)
4253
set(GCC_M_CPU cortex-r7)
54+
if(CONFIG_FPU AND CONFIG_CPU_HAS_VFP)
55+
if(NOT CONFIG_VFP_FEATURE_DOUBLE_PRECISION)
56+
set(GCC_M_CPU ${GCC_M_CPU}+nofp.dp)
57+
endif()
58+
else()
59+
set(GCC_M_CPU ${GCC_M_CPU}+nofp)
60+
endif()
4361
elseif(CONFIG_CPU_CORTEX_R52)
4462
set(GCC_M_CPU cortex-r52)
63+
if(CONFIG_FPU AND CONFIG_CPU_HAS_VFP)
64+
if(NOT CONFIG_VFP_FEATURE_DOUBLE_PRECISION)
65+
set(GCC_M_CPU ${GCC_M_CPU}+nofp.dp)
66+
endif()
67+
endif()
4568
elseif(CONFIG_CPU_CORTEX_A9)
4669
set(GCC_M_CPU cortex-a9)
4770
else()

cmake/gcc-m-fpu.cmake

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
# Determines what argument to give to -mfpu= based on the
4+
# KConfig'uration and sets this to GCC_M_FPU
5+
6+
if(CONFIG_FPU)
7+
8+
if("${ARCH}" STREQUAL "arm")
9+
if(CONFIG_CPU_AARCH32_CORTEX_R)
10+
if(CONFIG_CPU_CORTEX_R4 OR CONFIG_CPU_CORTEX_R5) # VFPv3
11+
if(CONFIG_VFP_FEATURE_DOUBLE_PRECISION)
12+
set(GCC_M_FPU vfpv3-d16)
13+
elseif(CONFIG_VFP_FEATURE_SINGLE_PRECISION)
14+
set(GCC_M_FPU vfpv3xd)
15+
endif()
16+
if(CONFIG_VFP_FEATURE_HALF_PRECISION)
17+
set(GCC_M_FPU ${GCC_M_FPU}-fp16)
18+
endif()
19+
endif()
20+
elseif(CONFIG_CPU_CORTEX_M)
21+
# Defines a mapping from GCC_M_CPU to FPU
22+
if(CONFIG_CPU_HAS_FPU_DOUBLE_PRECISION)
23+
set(PRECISION_TOKEN)
24+
else()
25+
set(PRECISION_TOKEN sp-)
26+
endif()
27+
28+
set(FPU_FOR_cortex-m4 fpv4-${PRECISION_TOKEN}d16)
29+
set(FPU_FOR_cortex-m7 fpv5-${PRECISION_TOKEN}d16)
30+
set(FPU_FOR_cortex-m33 fpv5-${PRECISION_TOKEN}d16)
31+
set(FPU_FOR_cortex-m33+nodsp fpv5-${PRECISION_TOKEN}d16)
32+
set(FPU_FOR_cortex-m55 auto)
33+
set(FPU_FOR_cortex-m55+nomve.fp auto)
34+
set(FPU_FOR_cortex-m55+nomve auto)
35+
set(FPU_FOR_cortex-m55+nodsp auto)
36+
37+
set(GCC_M_FPU ${FPU_FOR_${GCC_M_CPU}})
38+
endif()
39+
endif()
40+
41+
endif() #CONFIG_FPU

0 commit comments

Comments
 (0)