Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -4238,6 +4238,40 @@ return CPUAttr.equals("6T2") || ArchVersion >= 7; } + bool hasARMandThumbHwdiv() const { + if (ArchVersion >= 8) + return true; + return llvm::StringSwitch(CPU) + .Cases("cortex-a7", "cortex-a12", + "cortex-a15", "cortex-a17", true) + .Cases("cortex-r5", "cortex-r7", true) + .Cases("swift", "krait", true) + .Default(false); + } + + bool hasOnlyThumbHwdiv() const { + if (ArchVersion >= 8) + return true; + return llvm::StringSwitch(CPU) + .Cases("cortex-m3", "cortex-m4", + "cortex-m7", true) + .Cases("cortex-r4", "cortex-r4f", true) + .Case ("sc300", true) + .Default(false); + } + + bool is8AOrAbove() const { + return llvm::StringSwitch(CPU) + .Cases("cortex-a53", "cortex-a57", + "cortex-a72", "cyclone", true) + .Case ("generic", false) + .Default(ArchVersion >= 8); + } + + bool isGenericV8() const { + return CPU == "generic"; + } + StringRef getDefaultCPU(StringRef ArchName) const { const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName); return DefaultCPU ? DefaultCPU : ""; @@ -4384,37 +4418,30 @@ // FIXME: This should be based on Arch attributes, not CPU names. void getDefaultFeatures(llvm::StringMap &Features) const override { - if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore") - Features["vfp2"] = true; - else if (CPU == "cortex-a8" || CPU == "cortex-a9") { - Features["vfp3"] = true; - Features["neon"] = true; + std::vector FPUFeatures; + unsigned FPUKind = llvm::ARMTargetParser::getDefaultFPU(CPU); + llvm::ARMTargetParser::getFPUFeatures(FPUKind, FPUFeatures); + + for (const char *Feature : FPUFeatures) { + if (Feature[0] == '+') + Features[Feature+1] = true; } - else if (CPU == "cortex-a5") { - Features["vfp4"] = true; - Features["neon"] = true; - } else if (CPU == "swift" || CPU == "cortex-a7" || - CPU == "cortex-a12" || CPU == "cortex-a15" || - CPU == "cortex-a17" || CPU == "krait") { - Features["vfp4"] = true; + + // TargetParser does not explicitly define "+neon" + // it implies "+neon" by defining "+crypto" + if (is8AOrAbove()) { + Features["crc"] = true; Features["neon"] = true; - Features["hwdiv"] = true; - Features["hwdiv-arm"] = true; - } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" || - CPU == "cortex-a72") { - Features["fp-armv8"] = true; + } + else if (isGenericV8()) Features["neon"] = true; - Features["hwdiv"] = true; - Features["hwdiv-arm"] = true; - Features["crc"] = true; - Features["crypto"] = true; - } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) { - Features["hwdiv"] = true; + + if (hasARMandThumbHwdiv()) { Features["hwdiv-arm"] = true; - } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" || - CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") { Features["hwdiv"] = true; } + else if (hasOnlyThumbHwdiv()) + Features["hwdiv"] = true; } bool handleTargetFeatures(std::vector &Features, @@ -4458,6 +4485,8 @@ Crypto = 1; } else if (Feature == "+fp-only-sp") { HW_FP_remove |= HW_FP_DP | HW_FP_HP; + } else if (Feature == "+fp16") { + HW_FP |= HW_FP_HP; } } HW_FP &= ~HW_FP_remove; Index: test/CodeGen/arm-target-features.c =================================================================== --- test/CodeGen/arm-target-features.c +++ test/CodeGen/arm-target-features.c @@ -1,10 +1,25 @@ // 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 -// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-a9 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3 // CHECK-VFP3: "target-features"="+neon,+vfp3" +// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-a9 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-FP16 +// CHECK-VFP3-FP16: "target-features"="+fp16,+neon,+vfp3" + + +// 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"="+d16,+hwdiv,+vfp3" + + +// 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"="+d16,+hwdiv,+hwdiv-arm,+vfp3" + + +// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-FP16-DIV +// CHECK-VFP3-D16-FP16-DIV: "target-features"="+d16,+fp16,+hwdiv,+hwdiv-arm,+vfp3" + + // 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"="+neon,+vfp4" @@ -18,6 +33,10 @@ // CHECK-VFP4-DIV: "target-features"="+hwdiv,+hwdiv-arm,+neon,+vfp4" +// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-SP-D16-THUMB-DIV +// CHECK-VFP4-SP-D16-THUMB-DIV: "target-features"="+d16,+fp-only-sp,+hwdiv,+vfp4" + + // 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 armv8-linux-gnueabi -target-cpu cortex-a53 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8 // RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu cortex-a57 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8 @@ -25,13 +44,16 @@ // CHECK-BASIC-V8: "target-features"="+crc,+crypto,+fp-armv8,+hwdiv,+hwdiv-arm,+neon" -// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-DIV -// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-DIV -// CHECK-DIV: "target-features"="+hwdiv,+hwdiv-arm" +// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu generic -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-GENERIC-V8 +// CHECK-GENERIC-V8: "target-features"="+fp-armv8,+hwdiv,+hwdiv-arm,+neon" + + +// 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"="+d16,+fp-armv8,+hwdiv" + -// RUN: %clang_cc1 -triple armv7-linux-gnueabi -target-cpu cortex-r4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV +// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV // RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m3 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV -// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV // CHECK-THUMB-DIV: "target-features"="+hwdiv"