Index: lib/Driver/Tools.h =================================================================== --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -249,7 +249,9 @@ bool isUCLibc(const llvm::opt::ArgList &Args); bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple); bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, - StringRef ABIName); + StringRef ABIName, StringRef FloatABI); + bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple, + StringRef CPUName, StringRef ABIName, StringRef FloatABI); } namespace ppc { Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1116,7 +1116,7 @@ Features.push_back(Args.MakeArgString("+nooddspreg")); } else Features.push_back(Args.MakeArgString("+fp64")); - } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) { + } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) { Features.push_back(Args.MakeArgString("+fpxx")); Features.push_back(Args.MakeArgString("+nooddspreg")); } @@ -5766,7 +5766,7 @@ } bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, - StringRef ABIName) { + StringRef ABIName, StringRef FloatABI) { if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && Triple.getVendor() != llvm::Triple::MipsTechnologies) return false; @@ -5774,6 +5774,11 @@ if (ABIName != "32") return false; + // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is + // present. + if (FloatABI == "soft") + return false; + return llvm::StringSwitch(CPUName) .Cases("mips2", "mips3", "mips4", "mips5", true) .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true) @@ -5781,6 +5786,20 @@ .Default(false); } +bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple, + StringRef CPUName, StringRef ABIName, + StringRef FloatABI) { + bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI); + + // FPXX shouldn't be used if -msingle-float is present. + if (Arg *A = Args.getLastArg(options::OPT_msingle_float, + options::OPT_mdouble_float)) + if (A->getOption().matches(options::OPT_msingle_float)) + UseFPXX = false; + + return UseFPXX; +} + llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) { // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for // archs which Darwin doesn't use. @@ -7582,12 +7601,13 @@ } // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default. + StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args); if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, options::OPT_mfp64)) { A->claim(); A->render(Args, CmdArgs); - } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName, - ABIName)) + } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName, + ABIName, MIPSFloatABI)) CmdArgs.push_back("-mfpxx"); // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of Index: test/Driver/mips-as.c =================================================================== --- test/Driver/mips-as.c +++ test/Driver/mips-as.c @@ -291,3 +291,69 @@ // RUN: | FileCheck -check-prefix=DOUBLEFLOAT --implicit-check-not=-msingle-float %s // DOUBLEFLOAT: as{{(.exe)?}}" // DOUBLEFLOAT: -mdouble-float +// +// RUN: %clang -target mips-linux-gnu -### -no-integrated-as -msoft-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// SOFTFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// SOFTFLOAT-IMPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-linux-gnu -### -no-integrated-as -msoft-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SOFTFLOAT-EXPLICIT-FPXX %s +// SOFTFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// SOFTFLOAT-EXPLICIT-FPXX: -mfpxx +// SOFTFLOAT-EXPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-mti-linux-gnu -### -no-integrated-as -msoft-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=MTI-SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// MTI-SOFTFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// MTI-SOFTFLOAT-IMPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-mti-linux-gnu -### -no-integrated-as -msoft-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=MTI-SOFTFLOAT-EXPLICIT-FPXX %s +// MTI-SOFTFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// MTI-SOFTFLOAT-EXPLICIT-FPXX: -mfpxx +// MTI-SOFTFLOAT-EXPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-img-linux-gnu -### -no-integrated-as -msoft-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=IMG-SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// IMG-SOFTFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// IMG-SOFTFLOAT-IMPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-img-linux-gnu -### -no-integrated-as -msoft-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=IMG-SOFTFLOAT-EXPLICIT-FPXX %s +// IMG-SOFTFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// IMG-SOFTFLOAT-EXPLICIT-FPXX: -mfpxx +// IMG-SOFTFLOAT-EXPLICIT-FPXX: -msoft-float +// +// RUN: %clang -target mips-linux-gnu -### -no-integrated-as -msingle-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// SINGLEFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// SINGLEFLOAT-IMPLICIT-FPXX: -msingle-float +// +// RUN: %clang -target mips-linux-gnu -### -no-integrated-as -msingle-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SINGLEFLOAT-EXPLICIT-FPXX %s +// SINGLEFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// SINGLEFLOAT-EXPLICIT-FPXX: -mfpxx +// SINGLEFLOAT-EXPLICIT-FPXX: -msingle-float +// +// RUN: %clang -target mips-mti-linux-gnu -### -no-integrated-as -msingle-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=MTI-SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// MTI-SINGLEFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// MTI-SINGLEFLOAT-IMPLICIT-FPXX: -msingle-float +// +// RUN: %clang -target mips-mti-linux-gnu -### -no-integrated-as -msingle-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=MTI-SINGLEFLOAT-EXPLICIT-FPXX %s +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: -mfpxx +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: -msingle-float +// +// RUN: %clang -target mips-img-linux-gnu -### -no-integrated-as -msingle-float -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=IMG-SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// IMG-SINGLEFLOAT-IMPLICIT-FPXX: as{{(.exe)?}}" +// IMG-SINGLEFLOAT-IMPLICIT-FPXX: -msingle-float +// +// RUN: %clang -target mips-img-linux-gnu -### -no-integrated-as -msingle-float -mfpxx -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=IMG-SINGLEFLOAT-EXPLICIT-FPXX %s +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: as{{(.exe)?}}" +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: -mfpxx +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: -msingle-float Index: test/Driver/mips-features.c =================================================================== --- test/Driver/mips-features.c +++ test/Driver/mips-features.c @@ -157,3 +157,75 @@ // RUN: -G 16 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-MIPS-G %s // CHECK-MIPS-G: "-mllvm" "-mips-ssection-threshold=16" +// +// -msoft-float (unknown vendor) +// RUN: %clang -target mips-linux-gnu -### -c %s -msoft-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SOFTFLOAT %s +// CHECK-SOFTFLOAT: "-target-feature" "+soft-float" +// CHECK-SOFTFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msoft-float -mfpxx (unknown vendor) +// RUN: %clang -target mips-linux-gnu -### -c %s -msoft-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SOFTFLOAT-FPXX %s +// CHECK-SOFTFLOAT-FPXX: "-target-feature" "+soft-float" +// CHECK-SOFTFLOAT-FPXX: "-target-feature" "+fpxx" +// +// -msoft-float (MTI) +// RUN: %clang -target mips-mti-linux-gnu -### -c %s -msoft-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-MTI-SOFTFLOAT %s +// CHECK-MTI-SOFTFLOAT: "-target-feature" "+soft-float" +// CHECK-MTI-SOFTFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msoft-float -mfpxx (MTI) +// RUN: %clang -target mips-mti-linux-gnu -### -c %s -msoft-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-MTI-SOFTFLOAT-FPXX %s +// CHECK-MTI-SOFTFLOAT-FPXX: "-target-feature" "+soft-float" +// CHECK-MTI-SOFTFLOAT-FPXX: "-target-feature" "+fpxx" +// +// -msoft-float (IMG) +// RUN: %clang -target mips-img-linux-gnu -### -c %s -msoft-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-IMG-SOFTFLOAT %s +// CHECK-IMG-SOFTFLOAT: "-target-feature" "+soft-float" +// CHECK-IMG-SOFTFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msoft-float -mfpxx (IMG) +// RUN: %clang -target mips-img-linux-gnu -### -c %s -msoft-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-IMG-SOFTFLOAT-FPXX %s +// CHECK-IMG-SOFTFLOAT-FPXX: "-target-feature" "+soft-float" +// CHECK-IMG-SOFTFLOAT-FPXX: "-target-feature" "+fpxx" +// +// -msingle-float (unknown vendor) +// RUN: %clang -target mips-linux-gnu -### -c %s -msingle-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SINGLEFLOAT %s +// CHECK-SINGLEFLOAT: "-target-feature" "+single-float" +// CHECK-SINGLEFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msingle-float -mfpxx (unknown vendor) +// RUN: %clang -target mips-linux-gnu -### -c %s -msingle-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SINGLEFLOAT-FPXX %s +// CHECK-SINGLEFLOAT-FPXX: "-target-feature" "+single-float" +// CHECK-SINGLEFLOAT-FPXX: "-target-feature" "+fpxx" +// +// -msingle-float (MTI) +// RUN: %clang -target mips-mti-linux-gnu -### -c %s -msingle-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-MTI-SINGLEFLOAT %s +// CHECK-MTI-SINGLEFLOAT: "-target-feature" "+single-float" +// CHECK-MTI-SINGLEFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msingle-float -mfpxx (MTI) +// RUN: %clang -target mips-mti-linux-gnu -### -c %s -msingle-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-MTI-SINGLEFLOAT-FPXX %s +// CHECK-MTI-SINGLEFLOAT-FPXX: "-target-feature" "+single-float" +// CHECK-MTI-SINGLEFLOAT-FPXX: "-target-feature" "+fpxx" +// +// -msingle-float (IMG) +// RUN: %clang -target mips-img-linux-gnu -### -c %s -msingle-float 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-IMG-SINGLEFLOAT %s +// CHECK-IMG-SINGLEFLOAT: "-target-feature" "+single-float" +// CHECK-IMG-SINGLEFLOAT-NOT: "-target-feature" "+fpxx" +// +// -msingle-float -mfpxx (IMG) +// RUN: %clang -target mips-img-linux-gnu -### -c %s -msingle-float -mfpxx 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-IMG-SINGLEFLOAT-FPXX %s +// CHECK-IMG-SINGLEFLOAT-FPXX: "-target-feature" "+single-float" +// CHECK-IMG-SINGLEFLOAT-FPXX: "-target-feature" "+fpxx" Index: test/Driver/mips-integrated-as.s =================================================================== --- test/Driver/mips-integrated-as.s +++ test/Driver/mips-integrated-as.s @@ -209,3 +209,87 @@ // RUN: FileCheck -check-prefix=ABICALLS-OFF %s // ABICALLS-OFF: -cc1as // ABICALLS-OFF: "-target-feature" "+noabicalls" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -msoft-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// SOFTFLOAT-IMPLICIT-FPXX: -cc1as +// SOFTFLOAT-IMPLICIT-FPXX: "-target-feature" "+soft-float" +// SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -msoft-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=SOFTFLOAT-EXPLICIT-FPXX %s +// SOFTFLOAT-EXPLICIT-FPXX: -cc1as +// SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+soft-float" +// SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-mti-linux-gnu -### -fintegrated-as -msoft-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=MTI-SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// MTI-SOFTFLOAT-IMPLICIT-FPXX: -cc1as +// MTI-SOFTFLOAT-IMPLICIT-FPXX: "-target-feature" "+soft-float" +// MTI-SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// MTI-SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-mti-linux-gnu -### -fintegrated-as -msoft-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=MTI-SOFTFLOAT-EXPLICIT-FPXX %s +// MTI-SOFTFLOAT-EXPLICIT-FPXX: -cc1as +// MTI-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+soft-float" +// MTI-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// MTI-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-img-linux-gnu -### -fintegrated-as -msoft-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=IMG-SOFTFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// IMG-SOFTFLOAT-IMPLICIT-FPXX: -cc1as +// IMG-SOFTFLOAT-IMPLICIT-FPXX: "-target-feature" "+soft-float" +// IMG-SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// IMG-SOFTFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-img-linux-gnu -### -fintegrated-as -msoft-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=IMG-SOFTFLOAT-EXPLICIT-FPXX %s +// IMG-SOFTFLOAT-EXPLICIT-FPXX: -cc1as +// IMG-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+soft-float" +// IMG-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// IMG-SOFTFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -msingle-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// SINGLEFLOAT-IMPLICIT-FPXX: -cc1as +// SINGLEFLOAT-IMPLICIT-FPXX: "-target-feature" "+single-float" +// SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-linux-gnu -### -fintegrated-as -msingle-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=SINGLEFLOAT-EXPLICIT-FPXX %s +// SINGLEFLOAT-EXPLICIT-FPXX: -cc1as +// SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+single-float" +// SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-mti-linux-gnu -### -fintegrated-as -msingle-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=MTI-SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// MTI-SINGLEFLOAT-IMPLICIT-FPXX: -cc1as +// MTI-SINGLEFLOAT-IMPLICIT-FPXX: "-target-feature" "+single-float" +// MTI-SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// MTI-SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-mti-linux-gnu -### -fintegrated-as -msingle-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=MTI-SINGLEFLOAT-EXPLICIT-FPXX %s +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: -cc1as +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+single-float" +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// MTI-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-img-linux-gnu -### -fintegrated-as -msingle-float -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=IMG-SINGLEFLOAT-IMPLICIT-FPXX --implicit-check-not=-mfpxx %s +// IMG-SINGLEFLOAT-IMPLICIT-FPXX: -cc1as +// IMG-SINGLEFLOAT-IMPLICIT-FPXX: "-target-feature" "+single-float" +// IMG-SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+fpxx" +// IMG-SINGLEFLOAT-IMPLICIT-FPXX-NOT: "-target-feature" "+nooddspreg" + +// RUN: %clang -target mips-img-linux-gnu -### -fintegrated-as -msingle-float -mfpxx -c %s 2>&1 | \ +// RUN: FileCheck -check-prefix=IMG-SINGLEFLOAT-EXPLICIT-FPXX %s +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: -cc1as +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+single-float" +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+fpxx" +// IMG-SINGLEFLOAT-EXPLICIT-FPXX: "-target-feature" "+nooddspreg"