forked from OSchip/llvm-project
[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 llvm-svn: 154046
This commit is contained in:
parent
7e8a601c56
commit
1f0e52e361
|
@ -606,6 +606,7 @@ def mcpu_EQ : Joined<"-mcpu=">, Group<m_Group>;
|
|||
def mdynamic_no_pic : Joined<"-mdynamic-no-pic">, Group<m_Group>, Flags<[NoArgumentUnused]>;
|
||||
def mfix_and_continue : Flag<"-mfix-and-continue">, Group<clang_ignored_m_Group>;
|
||||
def mfloat_abi_EQ : Joined<"-mfloat-abi=">, Group<m_Group>;
|
||||
def mfpmath_EQ : Joined<"-mfpmath=">, Group<m_Group>;
|
||||
def mfpu_EQ : Joined<"-mfpu=">, Group<m_Group>;
|
||||
def mglobal_merge : Flag<"-mglobal-merge">, Group<m_Group>;
|
||||
def mhard_float : Flag<"-mhard-float">, Group<m_Group>;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'
|
Loading…
Reference in New Issue