From 35dd732fdff0e31ef0a24d76b7106597862adfcf Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Wed, 11 Jan 2012 11:21:31 +0000 Subject: [PATCH] Fix -mfpu parsing on ARM. - Support gcc-compatible vfpv3 name in addition to vfp3. - Support vfpv3-d16. - Disable neon feature for -mfpu=vfp* (yes, we were emitting Neon instructions for those!). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147943 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 2 +- lib/Driver/Tools.cpp | 13 ++++++++++++- test/Driver/arm-mfpu.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/Driver/arm-mfpu.c diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 8ec9f1c0ab..f3d5550bb6 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -2658,7 +2658,7 @@ public: const std::string &Name, bool Enabled) const { if (Name == "soft-float" || Name == "soft-float-abi" || - Name == "vfp2" || Name == "vfp3" || Name == "neon") { + Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") { Features[Name] = Enabled; } else return false; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index a241712da9..1edc441496 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -660,12 +660,23 @@ void Clang::AddARMTargetArgs(const ArgList &Args, CmdArgs.push_back("-vfp3"); CmdArgs.push_back("-target-feature"); CmdArgs.push_back("-neon"); + } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") { + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("+vfp3"); + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("+d16"); + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("-neon"); } else if (FPU == "vfp") { CmdArgs.push_back("-target-feature"); CmdArgs.push_back("+vfp2"); - } else if (FPU == "vfp3") { + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("-neon"); + } else if (FPU == "vfp3" || FPU == "vfpv3") { CmdArgs.push_back("-target-feature"); CmdArgs.push_back("+vfp3"); + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("-neon"); } else if (FPU == "neon") { CmdArgs.push_back("-target-feature"); CmdArgs.push_back("+neon"); diff --git a/test/Driver/arm-mfpu.c b/test/Driver/arm-mfpu.c new file mode 100644 index 0000000000..41c67578df --- /dev/null +++ b/test/Driver/arm-mfpu.c @@ -0,0 +1,36 @@ +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=fpa %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPA %s +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=fpe2 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPA %s +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=fpe3 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPA %s +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=maverick %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPA %s +// CHECK-FPA: "-target-feature" "-vfp2" +// CHECK-FPA: "-target-feature" "-vfp3" +// CHECK-FPA: "-target-feature" "-neon" + +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=vfp3-d16 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP3-D16 %s +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=vfpv3-d16 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP3-D16 %s +// CHECK-VFP3-D16: "-target-feature" "+vfp3" +// CHECK-VFP3-D16: "-target-feature" "+d16" +// CHECK-VFP3-D16: "-target-feature" "-neon" + +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=vfp %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP %s +// CHECK-VFP: "-target-feature" "+vfp2" +// CHECK-VFP: "-target-feature" "-neon" + +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=vfp3 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP3 %s +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=vfpv3 %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP3 %s +// CHECK-VFP3: "-target-feature" "+vfp3" +// CHECK-VFP3: "-target-feature" "-neon" + +// RUN: %clang -ccc-host-triple arm-linux-eabi -mfpu=neon %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NEON %s +// CHECK-NEON: "-target-feature" "+neon" + -- 2.50.1