Index: llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487/clang/lib/Driver/ToolChains/Arch/Mips.cpp =================================================================== --- llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487.orig/clang/lib/Driver/ToolChains/Arch/Mips.cpp +++ llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487/clang/lib/Driver/ToolChains/Arch/Mips.cpp @@ -467,10 +467,10 @@ bool mips::isFP64ADefault(const llvm::Tr bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, StringRef ABIName, mips::FloatABI FloatABI) { - if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && +/* if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && Triple.getVendor() != llvm::Triple::MipsTechnologies && !Triple.isAndroid()) - return false; + return false;*/ if (ABIName != "32") return false; Index: llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487/llvm/lib/Target/Mips/MipsSubtarget.cpp =================================================================== --- llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487.orig/llvm/lib/Target/Mips/MipsSubtarget.cpp +++ llvm-toolchain-snapshot_15~++20220407011631+46f0e2ceb487/llvm/lib/Target/Mips/MipsSubtarget.cpp @@ -81,7 +81,7 @@ MipsSubtarget::MipsSubtarget(const Tripl InMips16HardFloat(Mips16HardFloat), InMicroMipsMode(false), HasDSP(false), HasDSPR2(false), HasDSPR3(false), AllowMixed16_32(Mixed16_32 || Mips_Os16), Os16(Mips_Os16), HasMSA(false), UseTCCInDIV(false), HasSym32(false), - HasEVA(false), DisableMadd4(false), HasMT(false), HasCRC(false), + HasEVA(false), DisableMadd4(true), HasMT(false), HasCRC(false), HasVirt(false), HasGINV(false), UseIndirectJumpsHazard(false), StackAlignOverride(StackAlignOverride), TM(TM), TargetTriple(TT), TSInfo(), InstrInfo(MipsInstrInfo::create( @@ -92,6 +92,9 @@ MipsSubtarget::MipsSubtarget(const Tripl if (MipsArchVersion == MipsDefault) MipsArchVersion = Mips32; + if (hasMips32r6() || hasMips64r6()) + DisableMadd4 = false; + // MIPS-I has not been tested. if (MipsArchVersion == Mips1 && !MIPS1WarningPrinted) { errs() << "warning: MIPS-I support is experimental\n"; @@ -243,6 +246,7 @@ MipsSubtarget & MipsSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS, const TargetMachine &TM) { StringRef CPUName = MIPS_MC::selectMipsCPU(TM.getTargetTriple(), CPU); + SubtargetFeatures Features(FS); // Parse features string. ParseSubtargetFeatures(CPUName, /*TuneCPU*/ CPUName, FS); @@ -265,6 +269,13 @@ MipsSubtarget::initializeSubtargetDepend report_fatal_error("64-bit code requested on a subtarget that doesn't " "support it!"); + for (const std::string &Feature : Features.getFeatures()) { + if (Feature == "+nomadd4") + DisableMadd4 = true; + else if (Feature == "-nomadd4") + DisableMadd4 = false; + } + return *this; }