diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index e94519e7483..7f21d68bdd1 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -708,16 +708,21 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { } getTargetStreamer().updateABIInfo(*Subtarget); - getTargetStreamer().emitDirectiveModuleFP(); - // If we are targeting O32 then we must emit a '.module [no]oddspreg' ... - if (Subtarget->isABI_O32()) { - // ... but don't emit it unless we are contradicting the default or an - // option has changed the default (i.e. FPXX). - if (!Subtarget->useOddSPReg() || Subtarget->isABI_FPXX()) - getTargetStreamer().emitDirectiveModuleOddSPReg(Subtarget->useOddSPReg(), - Subtarget->isABI_O32()); - } + // We should always emit a '.module fp=...' but binutils 2.24 does not accept + // it. We therefore emit it when it contradicts the ABI defaults (-mfpxx or + // -mfp64) and omit it otherwise. + if (Subtarget->isABI_O32() && (Subtarget->isABI_FPXX() || + Subtarget->isFP64bit())) + getTargetStreamer().emitDirectiveModuleFP(); + + // We should always emit a '.module [no]oddspreg' but binutils 2.24 does not + // accept it. We therefore emit it when it contradicts the default or an + // option has changed the default (i.e. FPXX) and omit it otherwise. + if (Subtarget->isABI_O32() && (!Subtarget->useOddSPReg() || + Subtarget->isABI_FPXX())) + getTargetStreamer().emitDirectiveModuleOddSPReg(Subtarget->useOddSPReg(), + Subtarget->isABI_O32()); } void MipsAsmPrinter::EmitJal(MCSymbol *Symbol) { diff --git a/test/CodeGen/Mips/abiflags32.ll b/test/CodeGen/Mips/abiflags32.ll index 093964f0e98..e32d4a586ee 100644 --- a/test/CodeGen/Mips/abiflags32.ll +++ b/test/CodeGen/Mips/abiflags32.ll @@ -3,10 +3,15 @@ ; RUN: llc -filetype=asm -mtriple mipsel-unknown-linux -mcpu=mips64 -mattr=-n64,n32 %s -o - | FileCheck -check-prefix=CHECK-64n %s ; CHECK: .nan legacy -; CHECK: .module fp=32 +; We don't emit '.module fp=32' for compatibility with binutils 2.24 which +; doesn't accept .module. +; CHECK-NOT: .module fp=32 ; CHECK-64: .nan legacy +; We do emit '.module fp=64' though since it contradicts the default value. ; CHECK-64: .module fp=64 ; CHECK-64n: .nan legacy -; CHECK-64n: .module fp=64 +; We don't emit '.module fp=64' for compatibility with binutils 2.24 which +; doesn't accept .module. +; CHECK-64n-NOT: .module fp=64