From 0c002ccca614688d2bc666ae44ff0ac07b3add5f Mon Sep 17 00:00:00 2001 From: Sinan Kaya <41809318+franksinankaya@users.noreply.github.com> Date: Wed, 4 Dec 2019 13:20:00 -0500 Subject: [PATCH] Allow FPU flag override (#471) Command line to build for vfpv3-d16 ARM Cortex-5: ./build.sh -cross -arm -cmakeargs -DCLR_ARM_FPU_CAPABILITY=0x3 -cmakeargs -DCLR_ARM_FPU_TYPE=vfpv3-d16 Fixes https://github.com/dotnet/coreclr/issues/17043 --- eng/common/cross/toolchain.cmake | 13 +++++++++++-- src/coreclr/configurecompiler.cmake | 10 +++++++++- src/coreclr/src/pal/src/arch/arm/context2.S | 8 ++++++++ src/libraries/Native/Unix/CMakeLists.txt | 11 ++++++++++- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 0eea7d1df3e..b48ae28065f 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -71,8 +71,17 @@ endif() if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") add_compile_options(-mthumb) - add_compile_options(-mfpu=vfpv3) - if(TARGET_ARCH_NAME STREQUAL "armel") + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set(CLR_ARM_FPU_TYPE vfpv3) + endif(NOT DEFINED CLR_ARM_FPU_TYPE) + + add_compile_options(-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set(CLR_ARM_FPU_CAPABILITY 0x7) + endif(NOT DEFINED CLR_ARM_FPU_CAPABILITY) + add_definitions(-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) + + if(TARGET_ARCH_NAME STREQUAL "armel") add_compile_options(-mfloat-abi=softfp) if(DEFINED TIZEN_TOOLCHAIN) add_compile_options(-Wno-deprecated-declarations) # compile-time option diff --git a/src/coreclr/configurecompiler.cmake b/src/coreclr/configurecompiler.cmake index 522b4bf19e4..588aff28120 100644 --- a/src/coreclr/configurecompiler.cmake +++ b/src/coreclr/configurecompiler.cmake @@ -537,10 +537,18 @@ if (CLR_CMAKE_PLATFORM_UNIX) endif(CLR_CMAKE_PLATFORM_UNIX) if(CLR_CMAKE_PLATFORM_UNIX_ARM) + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set(CLR_ARM_FPU_TYPE vfpv3) + endif(NOT DEFINED CLR_ARM_FPU_TYPE) + # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang # we have to set the triple by adding a compiler argument add_compile_options(-mthumb) - add_compile_options(-mfpu=vfpv3) + add_compile_options(-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set(CLR_ARM_FPU_CAPABILITY 0x7) + endif(NOT DEFINED CLR_ARM_FPU_CAPABILITY) + add_definitions(-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) add_compile_options(-march=armv7-a) if(ARM_SOFTFP) add_definitions(-DARM_SOFTFP) diff --git a/src/coreclr/src/pal/src/arch/arm/context2.S b/src/coreclr/src/pal/src/arch/arm/context2.S index 88efc4b36f5..6ea8aba6b6f 100644 --- a/src/coreclr/src/pal/src/arch/arm/context2.S +++ b/src/coreclr/src/pal/src/arch/arm/context2.S @@ -80,7 +80,11 @@ LEAF_ENTRY CONTEXT_CaptureContext, _TEXT itttt ne addne r0, CONTEXT_D0 vstmiane r0!, {d0-d15} +#if CLR_ARM_FPU_CAPABILITY & 0x4 vstmiane r0!, {d16-d31} +#else + addne r0, r0, #128 +#endif subne r0, CONTEXT_D31 // Make sure sp is restored @@ -130,7 +134,11 @@ LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT): itttt ne addne r0, CONTEXT_D0 vldmiane r0!, {d0-d15} +#if CLR_ARM_FPU_CAPABILITY & 0x4 vldmiane r0, {d16-d31} +#else + nopne +#endif subne r0, CONTEXT_D16 itt ne diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt index 9d4db068014..c19f10c2602 100644 --- a/src/libraries/Native/Unix/CMakeLists.txt +++ b/src/libraries/Native/Unix/CMakeLists.txt @@ -59,7 +59,16 @@ elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l) add_compile_options(-mfloat-abi=softfp) endif () add_compile_options(-mthumb) - add_compile_options(-mfpu=vfpv3) + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set(CLR_ARM_FPU_TYPE vfpv3) + endif(NOT DEFINED CLR_ARM_FPU_TYPE) + + add_compile_options(-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set(CLR_ARM_FPU_CAPABILITY 0x7) + endif(NOT DEFINED CLR_ARM_FPU_CAPABILITY) + add_definitions(-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) + add_compile_options(-march=armv7-a) elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL arm) add_definitions(-DBIT32=1) -- GitLab