From 7a938fa66be42710b034a79106de337a275fd265 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Wed, 4 Apr 2012 20:39:32 +0000 Subject: [PATCH] [driver] Create a new -mfpmath= option, which is used to control whether clang uses Neon instructions for single-precision FP. -mfpmath=neon is analogous to passing llc -mattr=+neonfp. -mfpmath=[vfp|vfp2|vfp3|vfp4] is analogous to passing llc -mattr=-neonfp. rdar://11108618 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154046 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Options.td | 1 + lib/Basic/Targets.cpp | 3 ++- lib/Driver/Tools.cpp | 25 +++++++++++++++++++++++++ test/Driver/arm-mfpmath.c | 25 +++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 test/Driver/arm-mfpmath.c diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 24e481c8db..80f0ec193c 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -606,6 +606,7 @@ def mcpu_EQ : Joined<"-mcpu=">, Group; def mdynamic_no_pic : Joined<"-mdynamic-no-pic">, Group, Flags<[NoArgumentUnused]>; def mfix_and_continue : Flag<"-mfix-and-continue">, Group; def mfloat_abi_EQ : Joined<"-mfloat-abi=">, Group; +def mfpmath_EQ : Joined<"-mfpmath=">, Group; def mfpu_EQ : Joined<"-mfpu=">, Group; def mglobal_merge : Flag<"-mglobal-merge">, Group; def mhard_float : Flag<"-mhard-float">, Group; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 1fcef3392f..26fdca2447 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -2730,7 +2730,8 @@ public: StringRef Name, bool Enabled) const { if (Name == "soft-float" || Name == "soft-float-abi" || - Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16") { + Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" || + Name == "neonfp") { Features[Name] = Enabled; } else return false; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index e5be1e08b6..7dedcc24a5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -504,6 +504,23 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) { } } +// Handle -mfpmath=. +static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args, + ArgStringList &CmdArgs) { + StringRef FPMath = A->getValue(Args); + + // Set the target features based on the FPMath. + if (FPMath == "neon") { + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("+neonfp"); + } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" || + FPMath == "vfp4") { + CmdArgs.push_back("-target-feature"); + CmdArgs.push_back("-neonfp"); + } else + D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); +} + void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs, bool KernelOrKext) const { @@ -686,6 +703,10 @@ void Clang::AddARMTargetArgs(const ArgList &Args, D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); } + // Honor -mfpmath=. + if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) + addFPMathArgs(D, A, Args, CmdArgs); + // Setting -msoft-float effectively disables NEON because of the GCC // implementation, although the same isn't true of VFP or VFP3. if (FloatABI == "soft") { @@ -2688,6 +2709,10 @@ void ClangAs::AddARMTargetArgs(const ArgList &Args, } else D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); } + + // Honor -mfpmath=. + if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) + addFPMathArgs(D, A, Args, CmdArgs); } void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, diff --git a/test/Driver/arm-mfpmath.c b/test/Driver/arm-mfpmath.c new file mode 100644 index 0000000000..ab1809385a --- /dev/null +++ b/test/Driver/arm-mfpmath.c @@ -0,0 +1,25 @@ +// Test different values of -mfpmath. + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=vfp %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP %s +// CHECK-VFP: "-target-feature" "-neonfp" + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=vfp2 %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP2 %s +// CHECK-VFP2: "-target-feature" "-neonfp" + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=vfp3 %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP3 %s +// CHECK-VFP3: "-target-feature" "-neonfp" + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=vfp4 %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VFP4 %s +// CHECK-VFP4: "-target-feature" "-neonfp" + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=neon %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NEON %s +// CHECK-NEON: "-target-feature" "+neonfp" + +// RUN: %clang -target arm-apple-darwin10 -mfpmath=foo %s -### -c -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-ERROR %s +// CHECK-ERROR: clang compiler does not support '-mfpmath=foo' -- 2.40.0