diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index e98346fc9e4..277850c4deb 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -200,6 +200,7 @@ class MipsAsmParser : public MCTargetAsmParser { bool parseSetNoDspDirective(); bool parseSetReorderDirective(); bool parseSetNoReorderDirective(); + bool parseSetMips16Directive(); bool parseSetNoMips16Directive(); bool parseSetFpDirective(); bool parseSetPopDirective(); @@ -2783,14 +2784,32 @@ bool MipsAsmParser::parseSetNoDspDirective() { return false; } -bool MipsAsmParser::parseSetNoMips16Directive() { - Parser.Lex(); +bool MipsAsmParser::parseSetMips16Directive() { + Parser.Lex(); // Eat "mips16". + // If this is not the end of the statement, report an error. if (getLexer().isNot(AsmToken::EndOfStatement)) { reportParseError("unexpected token, expected end of statement"); return false; } - // For now do nothing. + + setFeatureBits(Mips::FeatureMips16, "mips16"); + getTargetStreamer().emitDirectiveSetMips16(); + Parser.Lex(); // Consume the EndOfStatement. + return false; +} + +bool MipsAsmParser::parseSetNoMips16Directive() { + Parser.Lex(); // Eat "nomips16". + + // If this is not the end of the statement, report an error. + if (getLexer().isNot(AsmToken::EndOfStatement)) { + reportParseError("unexpected token, expected end of statement"); + return false; + } + + clearFeatureBits(Mips::FeatureMips16, "mips16"); + getTargetStreamer().emitDirectiveSetNoMips16(); Parser.Lex(); // Consume the EndOfStatement. return false; } @@ -2940,9 +2959,6 @@ bool MipsAsmParser::parseSetFeature(uint64_t Feature) { case Mips::FeatureMicroMips: getTargetStreamer().emitDirectiveSetMicroMips(); break; - case Mips::FeatureMips16: - getTargetStreamer().emitDirectiveSetMips16(); - break; case Mips::FeatureMips1: selectArch("mips1"); getTargetStreamer().emitDirectiveSetMips1(); @@ -3131,7 +3147,7 @@ bool MipsAsmParser::parseDirectiveSet() { } else if (Tok.getString() == "nomacro") { return parseSetNoMacroDirective(); } else if (Tok.getString() == "mips16") { - return parseSetFeature(Mips::FeatureMips16); + return parseSetMips16Directive(); } else if (Tok.getString() == "nomips16") { return parseSetNoMips16Directive(); } else if (Tok.getString() == "nomicromips") { diff --git a/test/MC/Mips/set-mips16-directive.s b/test/MC/Mips/set-mips16-directive.s new file mode 100644 index 00000000000..cf8090eaa28 --- /dev/null +++ b/test/MC/Mips/set-mips16-directive.s @@ -0,0 +1,10 @@ +# RUN: llvm-mc %s -arch=mips | FileCheck %s +# FIXME: Update this test when we have a more mature implementation of Mips16 in the IAS. + +.text +.set mips16 +.set nomips16 + +# CHECK: .text +# CHECK: .set mips16 +# CHECK: .set nomips16