[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
This revision was automatically updated to reflect the committed changes. Closed by commit rC319420: [ARM] disable FPU features when using soft floating point. (authored by kwalker). Changed prior to commit: https://reviews.llvm.org/D40256?vs=124579&id=124905#toc Repository: rC Clang https://reviews.llvm.org/D40256 Files: lib/Driver/ToolChains/Arch/ARM.cpp test/Driver/arm-cortex-cpus.c test/Driver/arm-dotprod.c test/Driver/arm-mfpu.c test/Preprocessor/arm-target-features.c Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -391,12 +391,22 @@ } else if (HDivArg) getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features); - // Setting -msoft-float effectively disables NEON because of the GCC - // implementation, although the same isn't true of VFP or VFP3. + // Setting -msoft-float/-mfloat-abi=soft effectively disables the FPU (GCC + // ignores the -mfpu options in this case). + // Note that the ABI can also be set implicitly by the target selected. if (ABI == arm::FloatABI::Soft) { -Features.push_back("-neon"); -// Also need to explicitly disable features which imply NEON. -Features.push_back("-crypto"); +llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features); + +// Disable hardware FP features which have been enabled. +// FIXME: Disabling vfp2 and neon should be enough as all the other +//features are dependant on these 2 features in LLVM. However +//there is currently no easy way to test this in clang, so for +//now just be explicit and disable all known dependent features +//as well. +for (std::string Feature : {"vfp2", "vfp3", "vfp4", "fp-armv8", "fullfp16", +"neon", "crypto", "dotprod"}) + if (std::find(std::begin(Features), std::end(Features), "+" + Feature) != std::end(Features)) +Features.push_back("-" + Feature); } // En/disable crc code generation. Index: test/Driver/arm-cortex-cpus.c === --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -284,13 +284,13 @@ // RUN: %clang -target arm -march=armebv8.2-a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V82A-THUMB %s // CHECK-BE-V82A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8.2a-{{.*}}" "-target-cpu" "generic" -// RUN: %clang -target armv8a -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s // CHECK-V82A-FP16: "-cc1"{{.*}} "-triple" "armv8.2{{.*}}" "-target-cpu" "generic" {{.*}}"-target-feature" "+fullfp16" // Once we have CPUs with optional v8.2-A FP16, we will need a way to turn it // on and off. Cortex-A53 is a placeholder for now. -// RUN: %clang -target armv8a -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s -// RUN: %clang -target armv8a -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s // CHECK-CORTEX-A53-FP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "+fullfp16" // CHECK-CORTEX-A53-NOFP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "-fullfp16" Index: test/Driver/arm-mfpu.c === --- test/Driver/arm-mfpu.c +++ test/Driver/arm-mfpu.c @@ -2,6 +2,8 @@ // RUN: %clang -target arm-linux-eabi %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-target-feature" "+soft-float" +// CHECK-DEFAULT: "-target-feature" "+soft-float-abi" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp2" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp3" // CHECK-DEFAULT-NOT: "-target-feature" "+d16" @@ -19,6 +21,10 @@ // RUN: %clang -target arm-linux-eabi -mfpu=vfp %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-VFP %s +// RUN: %clang -target arm-linux-eabi -mfpu=vfp %s -mfloat-abi=soft -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s +// CHECK-VFP-NOT: "-target-feature" "+soft-float" +// CHECK-VFP: "-target-feature" "+soft-float-abi" // CHECK-VFP: "-target-feature" "+vfp2" // CHECK-VFP: "-target-feature" "-vfp3" // CHECK-VFP: "-target-feature" "-vfp4" @@ -29,13 +35,21 @@ // RUN: | FileCheck --check-prefix=CHECK-VFP3 %s // RUN: %clang -target arm-linux-eabi -mfpu=vfpv3 %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
efriedma accepted this revision. efriedma added a comment. This revision is now accepted and ready to land. LGTM https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
keith.walker.arm updated this revision to Diff 124579. keith.walker.arm added a comment. > What are these disabled "R-UN" lines? Oops! They shouldn't have been disabled in the patch. > Do we really need to check every combination like this? I don't think the > underlying logic actually varies. I have reduced the tests in the part to do a check against each architectural variant, and then just one check with the different -msoft-float/-mfpu=none options. https://reviews.llvm.org/D40256 Files: lib/Driver/ToolChains/Arch/ARM.cpp test/Driver/arm-cortex-cpus.c test/Driver/arm-dotprod.c test/Driver/arm-mfpu.c test/Preprocessor/arm-target-features.c Index: test/Driver/arm-dotprod.c === --- test/Driver/arm-dotprod.c +++ test/Driver/arm-dotprod.c @@ -4,8 +4,21 @@ // RUN: %clang -### -target arm -march=armv8.3a %s 2>&1 | FileCheck %s --check-prefix=CHECK-NONE // CHECK-NONE-NOT: "-target-feature" "+dotprod" -// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a75 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a55 %s 2>&1 | FileCheck %s // CHECK: "+dotprod" + +// The following default to -msoft-float +// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// We rely on the backend disabling dotprod as it depends on neon, so check that +// neon is disabled after the dotprod was enabled. +// CHECK-NO-DOTPROD-NOT: "+dotprod" Index: test/Driver/arm-cortex-cpus.c === --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -284,13 +284,13 @@ // RUN: %clang -target arm -march=armebv8.2-a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V82A-THUMB %s // CHECK-BE-V82A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8.2a-{{.*}}" "-target-cpu" "generic" -// RUN: %clang -target armv8a -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s // CHECK-V82A-FP16: "-cc1"{{.*}} "-triple" "armv8.2{{.*}}" "-target-cpu" "generic" {{.*}}"-target-feature" "+fullfp16" // Once we have CPUs with optional v8.2-A FP16, we will need a way to turn it // on and off. Cortex-A53 is a placeholder for now. -// RUN: %clang -target armv8a -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s -// RUN: %clang -target armv8a -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s // CHECK-CORTEX-A53-FP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "+fullfp16" // CHECK-CORTEX-A53-NOFP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "-fullfp16" Index: test/Driver/arm-mfpu.c === --- test/Driver/arm-mfpu.c +++ test/Driver/arm-mfpu.c @@ -2,6 +2,8 @@ // RUN: %clang -target arm-linux-eabi %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-target-feature" "+soft-float" +// CHECK-DEFAULT: "-target-feature" "+soft-float-abi" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp2" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp3" // CHECK-DEFAULT-NOT: "-target-feature" "+d16" @@ -19,6 +21,10 @@ // RUN: %clang -target arm-linux-eabi -mfpu=vfp %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-VFP %s +// RUN: %clang -target arm-linux-eabi -mfpu=vfp %s -mfloat-abi=soft -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s +// CHECK-VFP-NOT: "-target-feature" "+soft-float" +// CHECK-VFP: "-target-feature" "+soft-float-abi" // CHECK-VFP: "-target-feature" "+vfp2" // CH
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
efriedma added inline comments. Comment at: test/Driver/arm-mfpu.c:301 +// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s +// R-UN: %clang -target armv4-linux-gnueabi -mfloat-abi=soft -mfpu=none %s -### -c 2>&1 \ +// R-UN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s What are these disabled "R-UN" lines? Do we really need to check every combination like this? I don't think the underlying logic actually varies. https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
keith.walker.arm updated this revision to Diff 123936. keith.walker.arm added a comment. I have updated the patch with the suggested change to use a list of features to disable. I checked that LLVM does indeed implicitly disable features if they are dependent on a feature that is explicitly disabled, so in theory we could just disable "vfp2" and "neon".However I found that this made the tests in clang more difficult to write and understand. For example if a test wants to check that "dotprod" is not enabled: - with the explicit disabling the check can be: CHECK-NO-DOTPROD-NOT: "--target-feature" "+dotprod" - with implicit disabling the check needs to be something like: CHECK-NO-DOTPROD: "--target-feature" "+dotprod" CHECK-NO-DOTPROD: "--target-feature" "-neon" I think this made the tests harder to understand as there is more implicit knowledge required to understand what is going on. For this reason I have gone for still explicitly disabling the dependent FP features, with a FIXME so that this could be improved in the future. https://reviews.llvm.org/D40256 Files: lib/Driver/ToolChains/Arch/ARM.cpp test/Driver/arm-cortex-cpus.c test/Driver/arm-dotprod.c test/Driver/arm-mfpu.c test/Preprocessor/arm-target-features.c Index: test/Driver/arm-dotprod.c === --- test/Driver/arm-dotprod.c +++ test/Driver/arm-dotprod.c @@ -4,8 +4,21 @@ // RUN: %clang -### -target arm -march=armv8.3a %s 2>&1 | FileCheck %s --check-prefix=CHECK-NONE // CHECK-NONE-NOT: "-target-feature" "+dotprod" -// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a75 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a55 %s 2>&1 | FileCheck %s // CHECK: "+dotprod" + +// The following default to -msoft-float +// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// We rely on the backend disabling dotprod as it depends on neon, so check that +// neon is disabled after the dotprod was enabled. +// CHECK-NO-DOTPROD-NOT: "+dotprod" Index: test/Driver/arm-cortex-cpus.c === --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -284,13 +284,13 @@ // RUN: %clang -target arm -march=armebv8.2-a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V82A-THUMB %s // CHECK-BE-V82A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8.2a-{{.*}}" "-target-cpu" "generic" -// RUN: %clang -target armv8a -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s // CHECK-V82A-FP16: "-cc1"{{.*}} "-triple" "armv8.2{{.*}}" "-target-cpu" "generic" {{.*}}"-target-feature" "+fullfp16" // Once we have CPUs with optional v8.2-A FP16, we will need a way to turn it // on and off. Cortex-A53 is a placeholder for now. -// RUN: %clang -target armv8a -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s -// RUN: %clang -target armv8a -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s // CHECK-CORTEX-A53-FP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "+fullfp16" // CHECK-CORTEX-A53-NOFP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "-fullfp16" Index: test/Driver/arm-mfpu.c === --- test/Driver/arm-mfpu.c +++ test/Driver/arm-mfpu.c @@ -2,6 +2,8 @@ // RUN: %clang -target arm-linux-eabi %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-target-feature" "+soft-float" +// CHECK-DEFAULT: "-target-feature" "+soft-float-
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
keith.walker.arm added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:406 +const bool HasVFPv4 = (std::find(ItBegin, ItEnd, "+vfpv4") != ItEnd); +const bool HasFParmv8 = (std::find(ItBegin, ItEnd, "+fp-armv8") != ItEnd); +const bool HasFullFP16 = (std::find(ItBegin, ItEnd, "+fullfp16") != ItEnd); efriedma wrote: > I don't like explicitly enumerating the features like this; it'll mess up if > there's ever a new feature which isn't explicitly enumerated here. Can we > just do `Features.push_back("-vfpv2")` and depend on that to implicitly > disable all the other vfp features? I'll check on whether disabling a feature on which other features depend automatically disables the other features is something that can be relied upon (It would seem sensible that one could but need to check). That would certainly mean the code could be simplified, although I would also need to check the impact on the what is checked in the testing (only test for the base feature being disabled because the dependent features are automatically disabled). Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:419 +Features.push_back("-fullfp16"); + +const bool HasNeon = (std::find(ItBegin, ItEnd, "+neon") != ItEnd); compnerd wrote: > It would be nice to not have these explicitly listed. But at the very least, > I think that having a list and looping through it would be better: > > for (const auto Feature : {"vfpv2", "vfpv3", "vfpv4", "fp-armv8", > "fullfp16"}) > if (std::find(std::begin(Features), std::end(Features), "+" + Feature) > == std::end(Features)) > continue; > else > Features.push_back("-" + Feature); This certainly looks a better way to do it if we do need to provide a list of features rather than relying on disabling a base feature on which the other features depend. https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
compnerd added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:419 +Features.push_back("-fullfp16"); + +const bool HasNeon = (std::find(ItBegin, ItEnd, "+neon") != ItEnd); It would be nice to not have these explicitly listed. But at the very least, I think that having a list and looping through it would be better: for (const auto Feature : {"vfpv2", "vfpv3", "vfpv4", "fp-armv8", "fullfp16"}) if (std::find(std::begin(Features), std::end(Features), "+" + Feature) == std::end(Features)) continue; else Features.push_back("-" + Feature); Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:429 +if (HasDotProd) +Features.push_back("-dotprod"); } Similar. https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
efriedma added a comment. Oh, I see, for some silly reason there are actually *three* -mfloat-abi options: hard, soft, and softfp. hard means float instructions and a hard-float calling convention, soft means no floating-point and a soft-float convention, and softfp means float instructions and a soft-float convention. This is probably worth clarifying with a comment. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:406 +const bool HasVFPv4 = (std::find(ItBegin, ItEnd, "+vfpv4") != ItEnd); +const bool HasFParmv8 = (std::find(ItBegin, ItEnd, "+fp-armv8") != ItEnd); +const bool HasFullFP16 = (std::find(ItBegin, ItEnd, "+fullfp16") != ItEnd); I don't like explicitly enumerating the features like this; it'll mess up if there's ever a new feature which isn't explicitly enumerated here. Can we just do `Features.push_back("-vfpv2")` and depend on that to implicitly disable all the other vfp features? https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
asb added subscribers: llvm-commits, asb. asb added a comment. It would have been much cleaner if it worked as @efriedma suggests and -mfloat-abi was only concerned with the ABI (as its name would suggest), but sadly the -mfloat-abi=soft option seems to be defined in GCC to control more than just the ABI. Adding llvm-commits to the subscriber list. https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
rengolin added a comment. Wasn't that the mess about -mfpu=softfp? https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
efriedma added a comment. -mfpu controls what floating-point/vector instructions the compiler generates. -mfloat-abi controls whether floating-point arguments to functions are passed in floating-point registers. These are completely independent, and we need to support using both of them together to generate NEON code with a soft-float ABI. (Android is built like this.) https://reviews.llvm.org/D40256 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40256: [ARM] disable FPU features when using soft floating point.
keith.walker.arm created this revision. Herald added subscribers: kristof.beyls, javed.absar, aemerson. To be compatible with GCC if soft floating point is in effect any FPU specified is effectively ignored, eg, -mfloat-abi=soft -fpu=neon If any floating point features which require FPU hardware are enabled they must be disable. There was some support for doing this for NEON, but it did not handle VFP, nor did it prevent the backend from emitting the build attribute Tag_FP_arch describing the generated code as using the floating point hardware if a FPU was specified (even though soft float does not use the FPU). Disabling the hardware floating point features for targets which are compiling for soft float has meant that some tests which were incorrectly checking for hardware support also needed to be updated. In such cases, where appropriate the tests have been updated to check compiling for soft float and a non-soft float variant (usually softfp). This was usually because the target specified in the test defaulted to soft float. https://reviews.llvm.org/D40256 Files: lib/Driver/ToolChains/Arch/ARM.cpp test/Driver/arm-cortex-cpus.c test/Driver/arm-dotprod.c test/Driver/arm-mfpu.c test/Preprocessor/arm-target-features.c Index: test/Driver/arm-dotprod.c === --- test/Driver/arm-dotprod.c +++ test/Driver/arm-dotprod.c @@ -4,8 +4,19 @@ // RUN: %clang -### -target arm -march=armv8.3a %s 2>&1 | FileCheck %s --check-prefix=CHECK-NONE // CHECK-NONE-NOT: "-target-feature" "+dotprod" -// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 | FileCheck %s -// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.2a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -march=armv8.3a+dotprod %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a75 %s 2>&1 | FileCheck %s +// RUN: %clang -### -target arm-linux-eabi -mcpu=cortex-a55 %s 2>&1 | FileCheck %s // CHECK: "+dotprod" + +// The following default to -msoft-float +// RUN: %clang -### -target arm -march=armv8.2a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -march=armv8.3a+dotprod %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a75 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// RUN: %clang -### -target arm -mcpu=cortex-a55 %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-DOTPROD +// CHECK-NO-DOTPROD: "-dotprod" Index: test/Driver/arm-cortex-cpus.c === --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -284,13 +284,13 @@ // RUN: %clang -target arm -march=armebv8.2-a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V82A-THUMB %s // CHECK-BE-V82A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8.2a-{{.*}}" "-target-cpu" "generic" -// RUN: %clang -target armv8a -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -march=armv8.2-a+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-V82A-FP16 %s // CHECK-V82A-FP16: "-cc1"{{.*}} "-triple" "armv8.2{{.*}}" "-target-cpu" "generic" {{.*}}"-target-feature" "+fullfp16" // Once we have CPUs with optional v8.2-A FP16, we will need a way to turn it // on and off. Cortex-A53 is a placeholder for now. -// RUN: %clang -target armv8a -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s -// RUN: %clang -target armv8a -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+fp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-FP16 %s +// RUN: %clang -target armv8a-linux-eabi -mcpu=cortex-a53+nofp16 -### -c %s 2>&1 | FileCheck --check-prefix CHECK-CORTEX-A53-NOFP16 %s // CHECK-CORTEX-A53-FP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "+fullfp16" // CHECK-CORTEX-A53-NOFP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "-fullfp16" Index: test/Driver/arm-mfpu.c === --- test/Driver/arm-mfpu.c +++ test/Driver/arm-mfpu.c @@ -2,6 +2,8 @@ // RUN: %clang -target arm-linux-eabi %s -### -o %t.o 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-target-feature" "+soft-float" +// CHECK-DEFAULT: "-target-feature" "+soft-float-abi" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp2" // CHECK-DEFAULT-NOT: "-target-feature" "+vfp3" // CHECK-DEFAULT-NOT: "-target-feature"