Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -177,6 +177,7 @@ const MCExpr *evaluateRelocExpr(const MCExpr *Expr, StringRef RelocStr); bool isEvaluated(const MCExpr *Expr); + bool parseSetMips0Directive(); bool parseSetArchDirective(); bool parseSetFeature(uint64_t Feature); bool parseDirectiveCPLoad(SMLoc Loc); @@ -2731,6 +2732,19 @@ return false; } +bool MipsAsmParser::parseSetMips0Directive() { + Parser.Lex(); + if (getLexer().isNot(AsmToken::EndOfStatement)) + return reportParseError("unexpected token, expected end of statement"); + + // Reset assembler options to their initial values. + setAvailableFeatures(AssemblerOptions.front()->getFeatures()); + AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures()); + + getTargetStreamer().emitDirectiveSetMips0(); + return false; +} + bool MipsAsmParser::parseSetArchDirective() { Parser.Lex(); if (getLexer().isNot(AsmToken::Equal)) @@ -2981,6 +2995,8 @@ return false; } else if (Tok.getString() == "micromips") { return parseSetFeature(Mips::FeatureMicroMips); + } else if (Tok.getString() == "mips0") { + return parseSetMips0Directive(); } else if (Tok.getString() == "mips1") { return parseSetFeature(Mips::FeatureMips1); } else if (Tok.getString() == "mips2") { Index: lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -59,6 +59,7 @@ void MipsTargetStreamer::emitDirectiveSetArch(StringRef Arch) { forbidModuleDirective(); } +void MipsTargetStreamer::emitDirectiveSetMips0() {} void MipsTargetStreamer::emitDirectiveSetMips1() { forbidModuleDirective(); } void MipsTargetStreamer::emitDirectiveSetMips2() { forbidModuleDirective(); } void MipsTargetStreamer::emitDirectiveSetMips3() { forbidModuleDirective(); } @@ -184,6 +185,8 @@ MipsTargetStreamer::emitDirectiveSetArch(Arch); } +void MipsTargetAsmStreamer::emitDirectiveSetMips0() { OS << "\t.set\tmips0\n"; } + void MipsTargetAsmStreamer::emitDirectiveSetMips1() { OS << "\t.set\tmips1\n"; MipsTargetStreamer::emitDirectiveSetMips1(); Index: lib/Target/Mips/MipsTargetStreamer.h =================================================================== --- lib/Target/Mips/MipsTargetStreamer.h +++ lib/Target/Mips/MipsTargetStreamer.h @@ -49,6 +49,7 @@ virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff); virtual void emitDirectiveSetArch(StringRef Arch); + virtual void emitDirectiveSetMips0(); virtual void emitDirectiveSetMips1(); virtual void emitDirectiveSetMips2(); virtual void emitDirectiveSetMips3(); @@ -151,6 +152,7 @@ void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override; void emitDirectiveSetArch(StringRef Arch) override; + void emitDirectiveSetMips0() override; void emitDirectiveSetMips1() override; void emitDirectiveSetMips2() override; void emitDirectiveSetMips3() override; Index: test/MC/Mips/set-mips0-directive.s =================================================================== --- /dev/null +++ test/MC/Mips/set-mips0-directive.s @@ -0,0 +1,27 @@ +# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 | \ +# RUN: FileCheck %s + + .text + rotr $7, $7, 22 + + .set mips32r6 + mod $2, $4, $6 + .set mips0 + rotr $2, $2, 15 + + .set mips3 + dadd $4, $4, $4 + .set mips0 + rotr $3, $3, 19 + +# CHECK: rotr $7, $7, 22 + +# CHECK: .set mips32r6 +# CHECK: mod $2, $4, $6 +# CHECK: .set mips0 +# CHECK: rotr $2, $2, 15 + +# CHECK: .set mips3 +# CHECK: dadd $4, $4, $4 +# CHECK: .set mips0 +# CHECK: rotr $3, $3, 19