This adds the correct compiler and linker flags to support software floating point operations. The flags need to be added to TOOLCHAIN_*_FLAGS for GCC to find the correct library (when calling GCC with --print-libgcc-file-name). Note that software floating point needs to be turned on for Newlib. This is due to Newlib having floating point numbers in its various printf() functions which results in floating point instructions being emitted from toolchain. These instructions are placed very early in the functions which results in them being executed even though the format string contains no floating point conversions. Without using CONFIG_FPU to enable hardware floating point support, any calls to printf() like functions will result in exceptions complaining FPU is not available. Although forcing CONFIG_FPU=y with newlib is an option, and because the OS doesn't know which threads would call these printf() functions, Zephyr has to assume all threads are using FPU and thus incurring performance penalty as every context switching now needs to save FPU registers. A compromise here is to use soft float instead. Newlib with soft float enabled does not have floating point instructions and yet can still support its printf() like functions. Signed-off-by: Daniel Leung <daniel.leung@intel.com>
24 lines
774 B
CMake
24 lines
774 B
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
if(CONFIG_X86_64)
|
|
string(PREPEND CMAKE_ASM_FLAGS "-m64 ")
|
|
string(PREPEND CMAKE_C_FLAGS "-m64 ")
|
|
string(PREPEND CMAKE_CXX_FLAGS "-m64 ")
|
|
else()
|
|
string(PREPEND CMAKE_ASM_FLAGS "-m32 ")
|
|
string(PREPEND CMAKE_C_FLAGS "-m32 ")
|
|
string(PREPEND CMAKE_CXX_FLAGS "-m32 ")
|
|
|
|
if(CONFIG_X86_FP_USE_SOFT_FLOAT)
|
|
list(APPEND TOOLCHAIN_C_FLAGS -msoft-float)
|
|
list(APPEND TOOLCHAIN_LD_FLAGS -msoft-float)
|
|
endif()
|
|
endif()
|
|
|
|
# GNU Assembler, by default on non-Linux targets, treats slashes as
|
|
# start of comments on i386.
|
|
# (https://sourceware.org/binutils/docs-2.33.1/as/i386_002dChars.html#i386_002dChars)
|
|
# In order to use division, `--divide` needs to be passed to
|
|
# the assembler.
|
|
list(APPEND TOOLCHAIN_C_FLAGS -Wa,--divide)
|