summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Basic/Targets/ARM.cpp20
-rw-r--r--lib/Driver/ToolChains/Arch/ARM.cpp49
-rw-r--r--test/CodeGen/arm-target-features.c28
-rw-r--r--test/Driver/arm-mfpu.c348
-rw-r--r--test/Driver/armv8.1m.main.c37
-rw-r--r--test/Preprocessor/arm-acle-6.5.c5
-rw-r--r--test/Preprocessor/arm-target-features.c3
7 files changed, 269 insertions, 221 deletions
diff --git a/lib/Basic/Targets/ARM.cpp b/lib/Basic/Targets/ARM.cpp
index b6ad82260c..259adedd61 100644
--- a/lib/Basic/Targets/ARM.cpp
+++ b/lib/Basic/Targets/ARM.cpp
@@ -408,18 +408,30 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
SoftFloat = true;
} else if (Feature == "+soft-float-abi") {
SoftFloatABI = true;
- } else if (Feature == "+vfp2") {
+ } else if (Feature == "+vfp2sp" || Feature == "+vfp2d16sp" ||
+ Feature == "+vfp2" || Feature == "+vfp2d16") {
FPU |= VFP2FPU;
HW_FP |= HW_FP_SP;
- } else if (Feature == "+vfp3") {
+ if (Feature == "+vfp2" || Feature == "+vfp2d16")
+ HW_FP |= HW_FP_DP;
+ } else if (Feature == "+vfp3sp" || Feature == "+vfp3d16sp" ||
+ Feature == "+vfp3" || Feature == "+vfp3d16") {
FPU |= VFP3FPU;
HW_FP |= HW_FP_SP;
- } else if (Feature == "+vfp4") {
+ if (Feature == "+vfp3" || Feature == "+vfp3d16")
+ HW_FP |= HW_FP_DP;
+ } else if (Feature == "+vfp4sp" || Feature == "+vfp4d16sp" ||
+ Feature == "+vfp4" || Feature == "+vfp4d16") {
FPU |= VFP4FPU;
HW_FP |= HW_FP_SP | HW_FP_HP;
- } else if (Feature == "+fp-armv8") {
+ if (Feature == "+vfp4" || Feature == "+vfp4d16")
+ HW_FP |= HW_FP_DP;
+ } else if (Feature == "+fp-armv8sp" || Feature == "+fp-armv8d16sp" ||
+ Feature == "+fp-armv8" || Feature == "+fp-armv8d16") {
FPU |= FPARMV8;
HW_FP |= HW_FP_SP | HW_FP_HP;
+ if (Feature == "+fp-armv8" || Feature == "+fp-armv8d16")
+ HW_FP |= HW_FP_DP;
} else if (Feature == "+neon") {
FPU |= NeonFPU;
HW_FP |= HW_FP_SP;
diff --git a/lib/Driver/ToolChains/Arch/ARM.cpp b/lib/Driver/ToolChains/Arch/ARM.cpp
index 5ff1dd9c91..0b07058da0 100644
--- a/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -100,6 +100,7 @@ static void DecodeARMFeaturesFromCPU(const Driver &D, StringRef CPU,
static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
llvm::StringRef ArchName, llvm::StringRef CPUName,
std::vector<StringRef> &Features,
+ std::vector<StringRef> &ExtensionFeatures,
const llvm::Triple &Triple) {
std::pair<StringRef, StringRef> Split = ArchName.split("+");
@@ -107,7 +108,7 @@ static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(MArch);
if (ArchKind == llvm::ARM::ArchKind::INVALID ||
(Split.second.size() && !DecodeARMFeatures(
- D, Split.second, CPUName, ArchKind, Features)))
+ D, Split.second, CPUName, ArchKind, ExtensionFeatures)))
D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
}
@@ -115,6 +116,7 @@ static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
llvm::StringRef CPUName, llvm::StringRef ArchName,
std::vector<StringRef> &Features,
+ std::vector<StringRef> &ExtensionFeatures,
const llvm::Triple &Triple) {
std::pair<StringRef, StringRef> Split = CPUName.split("+");
@@ -123,7 +125,7 @@ static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
arm::getLLVMArchKindForARM(CPU, ArchName, Triple);
if (ArchKind == llvm::ARM::ArchKind::INVALID ||
(Split.second.size() && !DecodeARMFeatures(
- D, Split.second, CPU, ArchKind, Features)))
+ D, Split.second, CPU, ArchKind, ExtensionFeatures)))
D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
}
@@ -289,6 +291,13 @@ void arm::getARMTargetFeatures(const ToolChain &TC,
const Arg *WaCPU = nullptr, *WaFPU = nullptr;
const Arg *WaHDiv = nullptr, *WaArch = nullptr;
+ // This vector will accumulate features from the architecture
+ // extension suffixes on -mcpu and -march (e.g. the 'bar' in
+ // -mcpu=foo+bar). We want to apply those after the features derived
+ // from the FPU, in case -mfpu generates a negative feature which
+ // the +bar is supposed to override.
+ std::vector<StringRef> ExtensionFeatures;
+
if (!ForAS) {
// FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
// yet (it uses the -mfloat-abi and -msoft-float options), and it is
@@ -351,12 +360,14 @@ void arm::getARMTargetFeatures(const ToolChain &TC,
D.Diag(clang::diag::warn_drv_unused_argument)
<< ArchArg->getAsString(Args);
ArchName = StringRef(WaArch->getValue()).substr(7);
- checkARMArchName(D, WaArch, Args, ArchName, CPUName, Features, Triple);
+ checkARMArchName(D, WaArch, Args, ArchName, CPUName,
+ Features, ExtensionFeatures, Triple);
// FIXME: Set Arch.
D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
} else if (ArchArg) {
ArchName = ArchArg->getValue();
- checkARMArchName(D, ArchArg, Args, ArchName, CPUName, Features, Triple);
+ checkARMArchName(D, ArchArg, Args, ArchName, CPUName,
+ Features, ExtensionFeatures, Triple);
}
// Add CPU features for generic CPUs
@@ -367,11 +378,12 @@ void arm::getARMTargetFeatures(const ToolChain &TC,
Features.push_back(
Args.MakeArgString((F.second ? "+" : "-") + F.first()));
} else if (!CPUName.empty()) {
- DecodeARMFeaturesFromCPU(D, CPUName, Features);
+ DecodeARMFeaturesFromCPU(D, CPUName, ExtensionFeatures);
}
if (CPUArg)
- checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
+ checkARMCPUName(D, CPUArg, Args, CPUName, ArchName,
+ Features, ExtensionFeatures, Triple);
// Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
if (WaFPU) {
@@ -389,6 +401,12 @@ void arm::getARMTargetFeatures(const ToolChain &TC,
<< std::string("-mfpu=") + AndroidFPU;
}
+ // Now we've finished accumulating features from arch, cpu and fpu,
+ // we can append the ones for architecture extensions that we
+ // collected separately.
+ Features.insert(std::end(Features),
+ std::begin(ExtensionFeatures), std::end(ExtensionFeatures));
+
// Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
if (WaHDiv) {
@@ -433,21 +451,20 @@ fp16_fml_fallthrough:
if (ABI == arm::FloatABI::Soft) {
llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
- // Disable hardware FP features which have been enabled.
+ // Disable all features relating to hardware FP.
// FIXME: Disabling fpregs should be enough all by itself, since all
// the other FP features are dependent on it. 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", "fp16fml"})
- if (std::find(std::begin(Features), std::end(Features), "+" + Feature) != std::end(Features))
- Features.push_back(Args.MakeArgString("-" + Feature));
-
- // Disable the base feature unconditionally, even if it was not
- // explicitly in the features list (e.g. if we had +vfp3, which
- // implies it).
- Features.push_back("-fpregs");
+ for (std::string Feature : {
+ "vfp2", "vfp2sp", "vfp2d16", "vfp2d16sp",
+ "vfp3", "vfp3sp", "vfp3d16", "vfp3d16sp",
+ "vfp4", "vfp4sp", "vfp4d16", "vfp4d16sp",
+ "fp-armv8", "fp-armv8sp", "fp-armv8d16", "fp-armv8d16sp",
+ "fullfp16", "neon", "crypto", "dotprod", "fp16fml",
+ "fp64", "d32", "fpregs"})
+ Features.push_back(Args.MakeArgString("-" + Feature));
}
// En/disable crc code generation.
diff --git a/test/CodeGen/arm-target-features.c b/test/CodeGen/arm-target-features.c
index d62cea65ed..ec165aeec2 100644
--- a/test/CodeGen/arm-target-features.c
+++ b/test/CodeGen/arm-target-features.c
@@ -1,23 +1,23 @@
// REQUIRES: arm-registered-target
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a8 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3
-// CHECK-VFP3: "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+thumb-mode,+vfp3"
+// CHECK-VFP3: "target-features"="+armv7-a,+d32,+dsp,+fp64,+fpregs,+neon,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4
-// CHECK-VFP4: "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+thumb-mode,+vfp4"
+// CHECK-VFP4: "target-features"="+armv7-a,+d32,+dsp,+fp16,+fp64,+fpregs,+neon,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-a12 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
// RUN: %clang_cc1 -triple thumbv7s-linux-gnueabi -target-cpu swift -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-2
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu krait -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
-// CHECK-VFP4-DIV: "target-features"="+armv7-a,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
-// CHECK-VFP4-DIV-2: "target-features"="+armv7s,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
+// CHECK-VFP4-DIV: "target-features"="+armv7-a,+d32,+dsp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp"
+// CHECK-VFP4-DIV-2: "target-features"="+armv7s,+d32,+dsp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp"
// RUN: %clang_cc1 -triple armv7-linux-gnueabihf -target-cpu cortex-a15 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-ARM
// RUN: %clang_cc1 -triple armv7-linux-gnueabihf -target-cpu cortex-a17 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-ARM
-// CHECK-VFP4-DIV-ARM: "target-features"="+armv7-a,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+vfp4,-thumb-mode"
+// CHECK-VFP4-DIV-ARM: "target-features"="+armv7-a,+d32,+dsp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp,-thumb-mode"
// RUN: %clang_cc1 -triple thumbv7s-apple-ios7.0 -target-cpu cyclone -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu cortex-a32 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
@@ -28,34 +28,34 @@
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m1 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m2 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m3 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
-// CHECK-BASIC-V8: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode"
+// CHECK-BASIC-V8: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp-armv8d16,+fp-armv8d16sp,+fp-armv8sp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp"
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V82
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V82
-// CHECK-BASIC-V82: "target-features"="+armv8.2-a,+crc,+crypto,+d32,+dotprod,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,+ras,+thumb-mode"
+// CHECK-BASIC-V82: "target-features"="+armv8.2-a,+crc,+crypto,+d32,+dotprod,+dsp,+fp-armv8,+fp-armv8d16,+fp-armv8d16sp,+fp-armv8sp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+ras,+thumb-mode,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp"
// RUN: %clang_cc1 -triple armv8-linux-gnueabi -target-cpu cortex-a53 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8-ARM
-// CHECK-BASIC-V8-ARM: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,-thumb-mode"
+// CHECK-BASIC-V8-ARM: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp-armv8d16,+fp-armv8d16sp,+fp-armv8sp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+neon,+vfp2,+vfp2d16,+vfp2d16sp,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,+vfp4,+vfp4d16,+vfp4d16sp,+vfp4sp,-thumb-mode"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-DIV
-// CHECK-VFP3-D16-DIV: "target-features"="+armv7-r,+dsp,+fp64,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
+// CHECK-VFP3-D16-DIV: "target-features"="+armv7-r,+dsp,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp2d16,+vfp2d16sp,+vfp3d16,+vfp3d16sp"
// RUN: %clang_cc1 -triple armv7-linux-gnueabi -target-cpu cortex-r4f -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-THUMB-DIV
-// CHECK-VFP3-D16-THUMB-DIV: "target-features"="+armv7-r,+dsp,+fp64,+hwdiv,+vfp3,-thumb-mode"
+// CHECK-VFP3-D16-THUMB-DIV: "target-features"="+armv7-r,+dsp,+fp64,+fpregs,+hwdiv,+vfp2d16,+vfp2d16sp,+vfp3d16,+vfp3d16sp,-thumb-mode"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-FP16-DIV
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r8 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-FP16-DIV
-// CHECK-VFP3-D16-FP16-DIV: "target-features"="+armv7-r,+dsp,+fp16,+fp64,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
+// CHECK-VFP3-D16-FP16-DIV: "target-features"="+armv7-r,+dsp,+fp16,+fp64,+fpregs,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp2d16,+vfp2d16sp,+vfp3d16,+vfp3d16sp"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-D16-SP-THUMB-DIV
-// CHECK-VFP4-D16-SP-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+hwdiv,+thumb-mode,+vfp4"
+// CHECK-VFP4-D16-SP-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+fp16,+fpregs,+hwdiv,+thumb-mode,+vfp2d16sp,+vfp3d16sp,+vfp4d16sp"
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP5-D16-THUMB-DIV
-// CHECK-VFP5-D16-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+fp-armv8,+fp64,+hwdiv,+thumb-mode"
+// CHECK-VFP5-D16-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+fp-armv8d16,+fp-armv8d16sp,+fp16,+fp64,+fpregs,+hwdiv,+thumb-mode,+vfp2d16,+vfp2d16sp,+vfp3d16,+vfp3d16sp,+vfp4d16,+vfp4d16sp"
// RUN: %clang_cc1 -triple armv7-linux-gnueabi -target-cpu cortex-r4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV
@@ -107,6 +107,6 @@
// CHECK-ARMV8M-M23-LINUX: "target-features"="+armv8-m.base,+hwdiv,+thumb-mode"
// RUN: %clang_cc1 -triple thumb-linux-gnueabi -target-cpu cortex-m33 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ARMV8M-MAIN-LINUX
-// CHECK-ARMV8M-MAIN-LINUX: "target-features"="+armv8-m.main,+dsp,+fp-armv8,+hwdiv,+thumb-mode"
+// CHECK-ARMV8M-MAIN-LINUX: "target-features"="+armv8-m.main,+dsp,+fp-armv8d16sp,+fp16,+fpregs,+hwdiv,+thumb-mode,+vfp2d16sp,+vfp3d16sp,+vfp4d16sp"
void foo() {}
diff --git a/test/Driver/arm-mfpu.c b/test/Driver/arm-mfpu.c
index 921afa227c..4b0289b73b 100644
--- a/test/Driver/arm-mfpu.c
+++ b/test/Driver/arm-mfpu.c
@@ -3,7 +3,7 @@
// 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-DAG: "-target-feature" "+soft-float-abi"
// CHECK-DEFAULT-NOT: "-target-feature" "+vfp2"
// CHECK-DEFAULT-NOT: "-target-feature" "+vfp3"
// CHECK-DEFAULT-NOT: "-target-feature" "+neon"
@@ -23,19 +23,19 @@
// 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-2 %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"
-// CHECK-VFP: "-target-feature" "-fp-armv8"
-// CHECK-VFP: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-2: "-target-feature" "-vfp2"
+// CHECK-VFP-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP-DAG: "-target-feature" "+vfp2"
+// CHECK-VFP-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-VFP-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-2-DAG: "-target-feature" "-vfp2d16sp"
// RUN: %clang -target arm-linux-eabi -mfpu=vfp3 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3 %s
@@ -44,33 +44,33 @@
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3: "-target-feature" "+soft-float-abi"
-// CHECK-VFP3: "-target-feature" "+vfp3"
-// CHECK-VFP3: "-target-feature" "-vfp4"
-// CHECK-VFP3: "-target-feature" "-fp-armv8"
-// CHECK-VFP3: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-3: "-target-feature" "-vfp3"
+// CHECK-VFP3-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3-DAG: "-target-feature" "+vfp3"
+// CHECK-VFP3-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP3-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-3-DAG: "-target-feature" "-vfp3d16sp"
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-fp16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3-FP16 %s
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-fp16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3-FP16-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3-FP16: "-target-feature" "+soft-float-abi"
-// CHECK-VFP3-FP16: "-target-feature" "+vfp3"
-// CHECK-VFP3-FP16: "-target-feature" "+fp16"
-// CHECK-VFP3-FP16: "-target-feature" "-vfp4"
-// CHECK-VFP3-FP16: "-target-feature" "-fp-armv8"
-// CHECK-VFP3-FP16: "-target-feature" "+fp64"
-// CHECK-VFP3-FP16: "-target-feature" "+d32"
-// CHECK-VFP3-FP16: "-target-feature" "-neon"
-// CHECK-VFP3-FP16: "-target-feature" "-crypto"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "+vfp3"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "+fp16"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "+fp64"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "+d32"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "-neon"
+// CHECK-VFP3-FP16-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=vfp3-d16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3-D16 %s
@@ -79,58 +79,58 @@
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-d16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3-D16: "-target-feature" "+soft-float-abi"
-// CHECK-VFP3-D16: "-target-feature" "+vfp3"
-// CHECK-VFP3-D16: "-target-feature" "-vfp4"
-// CHECK-VFP3-D16: "-target-feature" "-fp-armv8"
-// CHECK-VFP3-D16: "-target-feature" "+fp64"
+// CHECK-VFP3-D16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3-D16-DAG: "-target-feature" "+vfp3d16"
+// CHECK-VFP3-D16-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3-D16-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP3-D16-DAG: "-target-feature" "+fp64"
// CHECK-VFP3-D16-NOT: "-target-feature" "+d32"
-// CHECK-VFP3-D16: "-target-feature" "-neon"
+// CHECK-VFP3-D16-DAG: "-target-feature" "-neon"
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-d16-fp16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3-D16-FP16 %s
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-d16-fp16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3-D16-FP16-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3-D16-FP16: "-target-feature" "+soft-float-abi"
-// CHECK-VFP3-D16-FP16: "-target-feature" "+vfp3"
-// CHECK-VFP3-D16-FP16: "-target-feature" "+fp16"
-// CHECK-VFP3-D16-FP16: "-target-feature" "-vfp4"
-// CHECK-VFP3-D16-FP16: "-target-feature" "-fp-armv8"
-// CHECK-VFP3-D16-FP16: "-target-feature" "+fp64"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "+vfp3d16"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "+fp16"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "+fp64"
// CHECK-VFP3-D16-FP16-NOT: "-target-feature" "+d32"
-// CHECK-VFP3-D16-FP16: "-target-feature" "-neon"
-// CHECK-VFP3-D16-FP16: "-target-feature" "-crypto"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "-neon"
+// CHECK-VFP3-D16-FP16-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3xd %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3XD %s
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3xd -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3XD-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3XD: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3XD-DAG: "-target-feature" "+soft-float-abi"
// CHECK-VFP3XD-NOT: "-target-feature" "+fp64"
// CHECK-VFP3XD-NOT: "-target-feature" "+d32"
-// CHECK-VFP3XD: "-target-feature" "+vfp3"
-// CHECK-VFP3XD: "-target-feature" "-fp16"
-// CHECK-VFP3XD: "-target-feature" "-vfp4"
-// CHECK-VFP3XD: "-target-feature" "-fp-armv8"
-// CHECK-VFP3XD: "-target-feature" "-neon"
-// CHECK-VFP3XD: "-target-feature" "-crypto"
+// CHECK-VFP3XD-DAG: "-target-feature" "+vfp3d16sp"
+// CHECK-VFP3XD-DAG: "-target-feature" "-fp16"
+// CHECK-VFP3XD-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3XD-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP3XD-DAG: "-target-feature" "-neon"
+// CHECK-VFP3XD-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3xd-fp16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP3XD-FP16 %s
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3xd-fp16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP3XD-FP16: "-target-feature" "+soft-float-abi"
-// CHECK-VFP3XD-FP16: "-target-feature" "+vfp3"
-// CHECK-VFP3XD-FP16: "-target-feature" "+fp16"
-// CHECK-VFP3XD-FP16: "-target-feature" "-vfp4"
-// CHECK-VFP3XD-FP16: "-target-feature" "-fp-armv8"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "+vfp3d16sp"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "+fp16"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "-fp-armv8d16sp"
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+fp64"
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+d32"
-// CHECK-VFP3XD-FP16: "-target-feature" "-neon"
-// CHECK-VFP3XD-FP16: "-target-feature" "-crypto"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "-neon"
+// CHECK-VFP3XD-FP16-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=vfp4 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP4 %s
@@ -139,17 +139,17 @@
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv4 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-4 %s
// CHECK-VFP4-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP4: "-target-feature" "+soft-float-abi"
-// CHECK-VFP4: "-target-feature" "+vfp4"
-// CHECK-VFP4: "-target-feature" "-fp-armv8"
-// CHECK-VFP4: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-4: "-target-feature" "-vfp4"
+// CHECK-VFP4-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP4-DAG: "-target-feature" "+vfp4"
+// CHECK-VFP4-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP4-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-4-DAG: "-target-feature" "-vfp4d16sp"
// RUN: %clang -target arm-linux-eabi -mfpu=vfp4-d16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-VFP4-D16 %s
@@ -158,12 +158,12 @@
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv4-d16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-4 %s
// CHECK-VFP4-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-VFP4-D16: "-target-feature" "+soft-float-abi"
-// CHECK-VFP4-D16: "-target-feature" "+vfp4"
-// CHECK-VFP4-D16: "-target-feature" "-fp-armv8"
-// CHECK-VFP4-D16: "-target-feature" "+fp64"
+// CHECK-VFP4-D16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-VFP4-D16-DAG: "-target-feature" "+vfp4d16"
+// CHECK-VFP4-D16-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-VFP4-D16-DAG: "-target-feature" "+fp64"
// CHECK-VFP4-D16-NOT: "-target-feature" "+d32"
-// CHECK-VFP4-D16: "-target-feature" "-neon"
+// CHECK-VFP4-D16-DAG: "-target-feature" "-neon"
// RUN: %clang -target arm-linux-eabi -mfpu=fp4-sp-d16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-FP4-SP-D16 %s
@@ -172,12 +172,12 @@
// RUN: %clang -target arm-linux-eabi -mfpu=fpv4-sp-d16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-4 %s
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-FP4-SP-D16: "-target-feature" "+soft-float-abi"
-// CHECK-FP4-SP-D16: "-target-feature" "+vfp4"
-// CHECK-FP4-SP-D16: "-target-feature" "-fp-armv8"
+// CHECK-FP4-SP-D16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-FP4-SP-D16-DAG: "-target-feature" "+vfp4d16sp"
+// CHECK-FP4-SP-D16-DAG: "-target-feature" "-fp-armv8d16sp"
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+fp64"
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+d32"
-// CHECK-FP4-SP-D16: "-target-feature" "-neon"
+// CHECK-FP4-SP-D16-DAG: "-target-feature" "-neon"
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-sp-d16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-FP5-SP-D16 %s
@@ -186,12 +186,12 @@
// RUN: %clang -target arm-linux-eabi -mfpu=fp-armv8-sp-d16 -mfloat-abi=soft %s -### -o %t.o \
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-FP5-SP-D16: "-target-feature" "+soft-float-abi"
-// CHECK-FP5-SP-D16: "-target-feature" "+fp-armv8"
-// CHECK-FP5-SP-D16: "-target-feature" "-neon"
+// CHECK-FP5-SP-D16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-FP5-SP-D16-DAG: "-target-feature" "+fp-armv8d16sp"
+// CHECK-FP5-SP-D16-DAG: "-target-feature" "-neon"
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+fp64"
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+d32"
-// CHECK-FP5-SP-D16: "-target-feature" "-crypto"
+// CHECK-FP5-SP-D16-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-dp-d16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-FP5-DP-D16 %s
@@ -200,74 +200,74 @@
// RUN: %clang -target arm-linux-eabi -mfpu=fpv5-dp-d16 %s -mfloat-abi=soft -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-5 %s
// CHECK-FP5-DP-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-FP5-DP-D16: "-target-feature" "+soft-float-abi"
-// CHECK-FP5-DP-D16: "-target-feature" "+fp-armv8"
-// CHECK-FP5-DP-D16: "-target-feature" "+fp64"
+// CHECK-FP5-DP-D16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-FP5-DP-D16-DAG: "-target-feature" "+fp-armv8d16"
+// CHECK-FP5-DP-D16-DAG: "-target-feature" "+fp64"
// CHECK-FP5-DP-D16-NOT: "-target-feature" "+d32"
-// CHECK-FP5-DP-D16: "-target-feature" "-neon"
-// CHECK-FP5-DP-D16: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "+soft-float"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-5: "-target-feature" "-fp-armv8"
+// CHECK-FP5-DP-D16-DAG: "-target-feature" "-neon"
+// CHECK-FP5-DP-D16-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "+soft-float"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-5-DAG: "-target-feature" "-fp-armv8d16sp"
// RUN: %clang -target arm-linux-eabi -mfpu=neon %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NEON %s
// RUN: %clang -target arm-linux-eabi -mfpu=neon -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-6 %s
// CHECK-NEON-NOT: "-target-feature" "+soft-float"
-// CHECK-NEON: "-target-feature" "+neon"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-6: "-target-feature" "-neon"
+// CHECK-NEON-DAG: "-target-feature" "+neon"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-6-DAG: "-target-feature" "-neon"
// RUN: %clang -target arm-linux-eabi -mfpu=neon-fp16 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NEON-FP16 %s
// RUN: %clang -target arm-linux-eabi -mfpu=neon-fp16 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-6 %s
// CHECK-NEON-FP16-NOT: "-target-feature" "+soft-float"
-// CHECK-NEON-FP16: "-target-feature" "+soft-float-abi"
-// CHECK-NEON-FP16: "-target-feature" "+vfp3"
-// CHECK-NEON-FP16: "-target-feature" "+fp16"
-// CHECK-NEON-FP16: "-target-feature" "-vfp4"
-// CHECK-NEON-FP16: "-target-feature" "-fp-armv8"
-// CHECK-NEON-FP16: "-target-feature" "+fp64"
-// CHECK-NEON-FP16: "-target-feature" "+d32"
-// CHECK-NEON-FP16: "-target-feature" "+neon"
-// CHECK-NEON-FP16: "-target-feature" "-crypto"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+vfp3"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+fp16"
+// CHECK-NEON-FP16-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-NEON-FP16-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+fp64"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+d32"
+// CHECK-NEON-FP16-DAG: "-target-feature" "+neon"
+// CHECK-NEON-FP16-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-eabi -mfpu=neon-vfpv3 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NEON-VFPV3 %s
// RUN: %clang -target arm-linux-eabi -mfpu=neon-vfpv3 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-6 %s
// CHECK-NEON-VFPV3-NOT: "-target-feature" "+soft-float"
-// CHECK-NEON-VFPV3: "-target-feature" "+soft-float-abi"
-// CHECK-NEON-VFPV3: "-target-feature" "+vfp3"
-// CHECK-NEON-VFPV3: "-target-feature" "+neon"
+// CHECK-NEON-VFPV3-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-NEON-VFPV3-DAG: "-target-feature" "+vfp3"
+// CHECK-NEON-VFPV3-DAG: "-target-feature" "+neon"
// RUN: %clang -target arm-linux-eabi -mfpu=neon-vfpv4 %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NEON-VFPV4 %s
// RUN: %clang -target arm-linux-eabi -mfpu=neon-vfpv4 -mfloat-abi=soft %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-7 %s
// CHECK-NEON-VFPV4-NOT: "-target-feature" "+soft-float"
-// CHECK-NEON-VFPV4: "-target-feature" "+soft-float-abi"
-// CHECK-NEON-VFPV4: "-target-feature" "+vfp4"
-// CHECK-NEON-VFPV4: "-target-feature" "+neon"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-7: "-target-feature" "-neon"
+// CHECK-NEON-VFPV4-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-NEON-VFPV4-DAG: "-target-feature" "+vfp4"
+// CHECK-NEON-VFPV4-DAG: "-target-feature" "+neon"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-7-DAG: "-target-feature" "-neon"
// RUN: %clang -target arm-linux-eabi -msoft-float %s -### -o %t.o 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
@@ -275,58 +275,58 @@
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
// RUN: %clang -target armv8a -mfpu=neon %s -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-8 %s
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP-8: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-8-DAG: "-target-feature" "-neon"
// RUN: %clang -target armv8 -mfpu=fp-armv8 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-ARMV8-SOFT-FLOAT %s
-// CHECK-ARMV8-SOFT-FLOAT: "-target-feature" "+soft-float"
-// CHECK-ARMV8-SOFT-FLOAT: "-target-feature" "+soft-float-abi"
+// CHECK-ARMV8-SOFT-FLOAT-DAG: "-target-feature" "+soft-float"
+// CHECK-ARMV8-SOFT-FLOAT-DAG: "-target-feature" "+soft-float-abi"
// NOT-CHECK-ARMV8-SOFT-FLOAT: "-target-feature" "+fp-armv8"
-// CHECK-ARMV9-SOFT-FLOAT: "-target-feature" "-neon"
-// CHECK-ARMV8-SOFT-FLOAT: "-target-feature" "-crypto"
+// CHECK-ARMV9-SOFT-FLOAT-DAG: "-target-feature" "-neon"
+// CHECK-ARMV8-SOFT-FLOAT-DAG: "-target-feature" "-crypto"
// RUN: %clang -target armv8-linux-gnueabihf -mfpu=fp-armv8 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-FP-ARMV8 %s
// CHECK-FP-ARMV8-NOT: "-target-feature" "+soft-float"
// CHECK-FP-ARMV8-NOT: "-target-feature" "+soft-float-abi"
-// CHECK-FP-ARMV8: "-target-feature" "+fp-armv8"
-// CHECK-FP-ARMV8: "-target-feature" "-neon"
-// CHECK-FP-ARMV8: "-target-feature" "-crypto"
+// CHECK-FP-ARMV8-DAG: "-target-feature" "+fp-armv8"
+// CHECK-FP-ARMV8-DAG: "-target-feature" "-neon"
+// CHECK-FP-ARMV8-DAG: "-target-feature" "-crypto"
// RUN: %clang -target armv8-linux-gnueabihf -mfpu=neon-fp-armv8 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NEON-FP-ARMV8 %s
// CHECK-NEON-FP-ARMV8-NOT: "-target-feature" "+soft-float"
// CHECK-NEON-FP-ARMV8-NOT: "-target-feature" "+soft-float-abi"
-// CHECK-NEON-FP-ARMV8: "-target-feature" "+fp-armv8"
-// CHECK-NEON-FP-ARMV8: "-target-feature" "+neon"
-// CHECK-NEON-FP-ARMV8: "-target-feature" "-crypto"
+// CHECK-NEON-FP-ARMV8-DAG: "-target-feature" "+fp-armv8"
+// CHECK-NEON-FP-ARMV8-DAG: "-target-feature" "+neon"
+// CHECK-NEON-FP-ARMV8-DAG: "-target-feature" "-crypto"
// RUN: %clang -target armv8-linux-gnueabihf -mfpu=crypto-neon-fp-armv8 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CRYPTO-NEON-FP-ARMV8 %s
// CHECK-CRYPTO-NEON-FP-ARMV8-NOT: "-target-feature" "+soft-float"
// CHECK-CRYPTO-NEON-FP-ARMV8-NOT: "-target-feature" "+soft-float-abi"
-// CHECK-CRYPTO-NEON-FP-ARMV8: "-target-feature" "+fp-armv8"
-// CHECK-CRYPTO-NEON-FP-ARMV8: "-target-feature" "+crypto"
+// CHECK-CRYPTO-NEON-FP-ARMV8-DAG: "-target-feature" "+fp-armv8"
+// CHECK-CRYPTO-NEON-FP-ARMV8-DAG: "-target-feature" "+crypto"
// RUN: %clang -target armv8-linux-gnueabi -mfpu=none %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-NO-FP %s
// CHECK-NO-FP-NOT: "-target-feature" "+soft-float"
-// CHECK-NO-FP: "-target-feature" "+soft-float-abi"
-// CHECK-NO-FP: "-target-feature" "-fpregs"
-// CHECK-NO-FP: "-target-feature" "-vfp2"
-// CHECK-NO-FP: "-target-feature" "-vfp3"
-// CHECK-NO-FP: "-target-feature" "-vfp4"
-// CHECK-NO-FP: "-target-feature" "-fp-armv8"
+// CHECK-NO-FP-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-NO-FP-DAG: "-target-feature" "-fpregs"
+// CHECK-NO-FP-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-NO-FP-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-NO-FP-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-NO-FP-DAG: "-target-feature" "-fp-armv8d16sp"
// CHECK-NO-FP-NOT: "-target-feature" "+fp64"
// CHECK-NO-FP-NOT: "-target-feature" "+d32"
-// CHECK-NO-FP: "-target-feature" "-neon"
-// CHECK-NO-FP: "-target-feature" "-crypto"
+// CHECK-NO-FP-DAG: "-target-feature" "-neon"
+// CHECK-NO-FP-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-linux-gnueabihf %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-HF %s
@@ -334,7 +334,7 @@
// RUN: | FileCheck --check-prefix=CHECK-HF %s
// CHECK-HF-NOT: "-target-feature" "+soft-float"
// CHECK-HF-NOT: "-target-feature" "+soft-float-abi"
-// CHECK-HF: "-target-cpu" "arm1176jzf-s"
+// CHECK-HF-DAG: "-target-cpu" "arm1176jzf-s"
// RUN: %clang -target armv7-apple-darwin -x assembler %s -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=ASM %s
@@ -356,20 +356,20 @@
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
// RUN: %clang -target armv8-linux-gnueabi -msoft-float %s -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
-// CHECK-SOFT-ABI-FP: "-target-feature" "+soft-float"
-// CHECK-SOFT-ABI-FP: "-target-feature" "+soft-float-abi"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-vfp2"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-vfp3"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-vfp4"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-fp-armv8"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-neon"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-crypto"
-// CHECK-SOFT-ABI-FP: "-target-feature" "-fpregs"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "+soft-float"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-vfp2d16sp"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-vfp3d16sp"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-vfp4d16sp"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-fp-armv8d16sp"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-neon"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-crypto"
+// CHECK-SOFT-ABI-FP-DAG: "-target-feature" "-fpregs"
// RUN: %clang -target arm-linux-androideabi21 %s -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-ARM5-ANDROID-FP-DEFAULT %s
-// CHECK-ARM5-ANDROID-FP-DEFAULT: "-target-feature" "+soft-float"
-// CHECK-ARM5-ANDROID-FP-DEFAULT: "-target-feature" "+soft-float-abi"
+// CHECK-ARM5-ANDROID-FP-DEFAULT-DAG: "-target-feature" "+soft-float"
+// CHECK-ARM5-ANDROID-FP-DEFAULT-DAG: "-target-feature" "+soft-float-abi"
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+d32"
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+vfp3"
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+vfp4"
@@ -380,19 +380,19 @@
// RUN: %clang -target armv7-linux-androideabi21 %s -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-ARM7-ANDROID-FP-DEFAULT %s
// CHECK-ARM7-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+soft-float"
-// CHECK-ARM7-ANDROID-FP-DEFAULT: "-target-feature" "+soft-float-abi"
-// CHECK-ARM7-ANDROID-FP-DEFAULT: "-target-feature" "+vfp3"
+// CHECK-ARM7-ANDROID-FP-DEFAULT-DAG: "-target-feature" "+soft-float-abi"
+// CHECK-ARM7-ANDROID-FP-DEFAULT-DAG: "-target-feature" "+vfp3"
// CHECK-ARM7-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+vfp4"
// CHECK-ARM7-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+fp-armv8"
-// CHECK-ARM7-ANDROID-FP-DEFAULT: "-target-feature" "+neon"
+// CHECK-ARM7-ANDROID-FP-DEFAULT-DAG: "-target-feature" "+neon"
// CHECK-ARM7-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+crypto"
// RUN: %clang -target armv7-linux-androideabi21 %s -mfpu=vfp3-d16 -### -c 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-ARM7-ANDROID-FP-D16 %s
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+soft-float"
-// CHECK-ARM7-ANDROID-FP-D16: "-target-feature" "+soft-float-abi"
+// CHECK-ARM7-ANDROID-FP-D16-DAG: "-target-feature" "+soft-float-abi"
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+d32"
-// CHECK-ARM7-ANDROID-FP-D16: "-target-feature" "+vfp3"
+// CHECK-ARM7-ANDROID-FP-D16-DAG: "-target-feature" "+vfp3d16"
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+vfp4"
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+fp-armv8"
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+neon"
diff --git a/test/Driver/armv8.1m.main.c b/test/Driver/armv8.1m.main.c
index 9a745b1b80..dd272e1580 100644
--- a/test/Driver/armv8.1m.main.c
+++ b/test/Driver/armv8.1m.main.c
@@ -4,37 +4,50 @@
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+fp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-FP < %t %s
-// CHECK-FP: "-target-feature" "+fp-armv8"
+// CHECK-FP-DAG: "-target-feature" "+fp-armv8d16sp"
+// CHECK-FP-NOT: "-target-feature" "+fp-armv8d16"
+// CHECK-FP-NOT: "-target-feature" "+fp-armv8sp"
+// CHECK-FP-NOT: "-target-feature" "+fp-armv8"
// CHECK-FP-NOT: "-target-feature" "+fp64"
// CHECK-FP-NOT: "-target-feature" "+d32"
-// CHECK-FP: "-target-feature" "+fullfp16"
+// CHECK-FP-DAG: "-target-feature" "+fullfp16"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+nofp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-NOFP < %t %s
-// CHECK-NOFP: "-target-feature" "-vfp2" "-target-feature" "-vfp3" "-target-feature" "-fp16" "-target-feature" "-vfp4" "-target-feature" "-fp-armv8" "-target-feature" "-fp64" "-target-feature" "-d32" "-target-feature" "-neon" "-target-feature" "-crypto"
+// CHECK-NOFP-DAG: "-target-feature" "-vfp2"
+// CHECK-NOFP-DAG: "-target-feature" "-vfp3"
+// CHECK-NOFP-DAG: "-target-feature" "-fp16"
+// CHECK-NOFP-DAG: "-target-feature" "-vfp4"
+// CHECK-NOFP-DAG: "-target-feature" "-fp-armv8"
+// CHECK-NOFP-DAG: "-target-feature" "-fp64"
+// CHECK-NOFP-DAG: "-target-feature" "-d32"
+// CHECK-NOFP-DAG: "-target-feature" "-neon"
+// CHECK-NOFP-DAG: "-target-feature" "-crypto"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+fp.dp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-FPDP < %t %s
-// CHECK-FPDP: "-target-feature" "+fp-armv8"
-// CHECK-FPDP: "-target-feature" "+fullfp16"
-// CHECK-FPDP: "-target-feature" "+fp64"
+// CHECK-FPDP-NOT: "-target-feature" "+fp-armv8sp"
+// CHECK-FPDP-DAG: "-target-feature" "+fp-armv8d16"
+// CHECK-FPDP-NOT: "-target-feature" "+fp-armv8"
+// CHECK-FPDP-DAG: "-target-feature" "+fullfp16"
+// CHECK-FPDP-DAG: "-target-feature" "+fp64"
// CHECK-FPDP-NOT: "-target-feature" "+d32"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+nofp.dp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-NOFPDP < %t %s
-// CHECK-NOFPDP: "-target-feature" "-fp64"
+// CHECK-NOFPDP-DAG: "-target-feature" "-fp64"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-MVE < %t %s
-// CHECK-MVE: "-target-feature" "+mve"
+// CHECK-MVE-DAG: "-target-feature" "+mve"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+nomve -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-NOMVE < %t %s
-// CHECK-NOMVE: "-target-feature" "-mve"
+// CHECK-NOMVE-DAG: "-target-feature" "-mve"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-MVEFP < %t %s
-// CHECK-MVEFP: "-target-feature" "+mve.fp"
+// CHECK-MVEFP-DAG: "-target-feature" "+mve.fp"
// CHECK-MVEFP-NOT: "-target-feature" "+fp64"
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+nomve.fp -### %s 2> %t
@@ -43,7 +56,7 @@
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+fp.dp -### %s 2> %t
// RUN: FileCheck --check-prefix=CHECK-MVEFP_DP < %t %s
-// CHECK-MVEFP_DP: "-target-feature" "+mve.fp"
-// CHECK-MVEFP_DP: "-target-feature" "+fp64"
+// CHECK-MVEFP_DP-DAG: "-target-feature" "+mve.fp"
+// CHECK-MVEFP_DP-DAG: "-target-feature" "+fp64"
double foo (double a) { return a; }
diff --git a/test/Preprocessor/arm-acle-6.5.c b/test/Preprocessor/arm-acle-6.5.c
index 143ed75bed..dccc59ec26 100644
--- a/test/Preprocessor/arm-acle-6.5.c
+++ b/test/Preprocessor/arm-acle-6.5.c
@@ -57,8 +57,11 @@
// RUN: %clang -target armv7r-eabi -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-NO-FMA
// RUN: %clang -target armv7r-eabi -mfpu=vfpv4 -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-FMA
// RUN: %clang -target armv7em-eabi -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-FMA
-// RUN: %clang -target armv8-eabi -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-NO-FMA
+
+// (armv8 defaults to fp-armv8 > vfpv4, so we *should* expect FMA unless we downgrade to pre-vfpv4)
+// RUN: %clang -target armv8-eabi -mfpu=vfpv3 -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-NO-FMA
// RUN: %clang -target armv8-eabi -mfpu=vfpv4 -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-FMA
+// RUN: %clang -target armv8-eabi -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-FMA
// CHECK-FMA: __ARM_FEATURE_FMA 1
diff --git a/test/Preprocessor/arm-target-features.c b/test/Preprocessor/arm-target-features.c
index 57b0aa9c69..ccc6d720a3 100644
--- a/test/Preprocessor/arm-target-features.c
+++ b/test/Preprocessor/arm-target-features.c
@@ -776,3 +776,6 @@
// CHECK-V85A: #define __ARM_ARCH 8
// CHECK-V85A: #define __ARM_ARCH_8_5A__ 1
// CHECK-V85A: #define __ARM_ARCH_PROFILE 'A'
+
+// RUN: %clang -target arm-none-none-eabi -march=armv7-m -mfpu=softvfp -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SOFTVFP %s
+// CHECK-SOFTVFP-NOT: #define __ARM_FP 0x