Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -167,6 +167,8 @@ bool parseSetNoAtDirective(); bool parseSetMacroDirective(); bool parseSetNoMacroDirective(); + bool parseSetMsaDirective(); + bool parseSetNoMsaDirective(); bool parseSetReorderDirective(); bool parseSetNoReorderDirective(); bool parseSetNoMips16Directive(); @@ -2487,6 +2489,30 @@ return false; } +bool MipsAsmParser::parseSetMsaDirective() { + Parser.Lex(); + + // If this is not the end of the statement, report an error. + if (getLexer().isNot(AsmToken::EndOfStatement)) + return reportParseError("unexpected token in statement"); + + setFeatureBits(Mips::FeatureMSA, "msa"); + getTargetStreamer().emitDirectiveSetMsa(); + return false; +} + +bool MipsAsmParser::parseSetNoMsaDirective() { + Parser.Lex(); + + // If this is not the end of the statement, report an error. + if (getLexer().isNot(AsmToken::EndOfStatement)) + return reportParseError("unexpected token in statement"); + + clearFeatureBits(Mips::FeatureMSA, "msa"); + getTargetStreamer().emitDirectiveSetNoMsa(); + return false; +} + bool MipsAsmParser::parseSetNoMips16Directive() { Parser.Lex(); // If this is not the end of the statement, report an error. @@ -2782,6 +2808,10 @@ return parseSetFeature(Mips::FeatureMips64r6); } else if (Tok.getString() == "dsp") { return parseSetFeature(Mips::FeatureDSP); + } else if (Tok.getString() == "msa") { + return parseSetMsaDirective(); + } else if (Tok.getString() == "nomsa") { + return parseSetNoMsaDirective(); } else { // It is just an identifier, look for an assignment. parseSetAssignment(); Index: lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -38,6 +38,8 @@ void MipsTargetStreamer::emitDirectiveSetNoReorder() {} void MipsTargetStreamer::emitDirectiveSetMacro() {} void MipsTargetStreamer::emitDirectiveSetNoMacro() {} +void MipsTargetStreamer::emitDirectiveSetMsa() { setCanHaveModuleDir(false); } +void MipsTargetStreamer::emitDirectiveSetNoMsa() { setCanHaveModuleDir(false); } void MipsTargetStreamer::emitDirectiveSetAt() {} void MipsTargetStreamer::emitDirectiveSetNoAt() {} void MipsTargetStreamer::emitDirectiveEnd(StringRef Name) {} @@ -118,6 +120,16 @@ setCanHaveModuleDir(false); } +void MipsTargetAsmStreamer::emitDirectiveSetMsa() { + OS << "\t.set\tmsa\n"; + MipsTargetStreamer::emitDirectiveSetMsa(); +} + +void MipsTargetAsmStreamer::emitDirectiveSetNoMsa() { + OS << "\t.set\tnomsa\n"; + MipsTargetStreamer::emitDirectiveSetNoMsa(); +} + void MipsTargetAsmStreamer::emitDirectiveSetAt() { OS << "\t.set\tat\n"; setCanHaveModuleDir(false); Index: lib/Target/Mips/MipsTargetStreamer.h =================================================================== --- lib/Target/Mips/MipsTargetStreamer.h +++ lib/Target/Mips/MipsTargetStreamer.h @@ -30,6 +30,8 @@ virtual void emitDirectiveSetNoReorder(); virtual void emitDirectiveSetMacro(); virtual void emitDirectiveSetNoMacro(); + virtual void emitDirectiveSetMsa(); + virtual void emitDirectiveSetNoMsa(); virtual void emitDirectiveSetAt(); virtual void emitDirectiveSetNoAt(); virtual void emitDirectiveEnd(StringRef Name); @@ -114,6 +116,8 @@ void emitDirectiveSetNoReorder() override; void emitDirectiveSetMacro() override; void emitDirectiveSetNoMacro() override; + void emitDirectiveSetMsa() override; + void emitDirectiveSetNoMsa() override; void emitDirectiveSetAt() override; void emitDirectiveSetNoAt() override; void emitDirectiveEnd(StringRef Name) override; Index: test/MC/Mips/msa/set-msa-directive-bad.s =================================================================== --- /dev/null +++ test/MC/Mips/msa/set-msa-directive-bad.s @@ -0,0 +1,11 @@ +# RUN: not llvm-mc %s -arch=mips -mcpu=mips32r2 2>%t1 +# RUN: FileCheck %s < %t1 + + .set nomsa + addvi.b $w14, $w12, 14 # CHECK: error: instruction requires a CPU feature not currently enabled + + .set msa + addvi.h $w26, $w17, 4 + + .set nomsa + addvi.w $w19, $w13, 11 # CHECK: error: instruction requires a CPU feature not currently enabled Index: test/MC/Mips/msa/set-msa-directive.s =================================================================== --- /dev/null +++ test/MC/Mips/msa/set-msa-directive.s @@ -0,0 +1,22 @@ +# RUN: llvm-mc %s -arch=mips -mcpu=mips32r2 | FileCheck %s + +# CHECK: .set msa +# CHECK: addvi.b $w14, $w12, 14 +# CHECK: addvi.h $w26, $w17, 4 +# CHECK: addvi.w $w19, $w13, 11 +# CHECK: addvi.d $w16, $w19, 7 +# CHECK: subvi.b $w14, $w12, 14 +# CHECK: subvi.h $w26, $w17, 4 +# CHECK: subvi.w $w19, $w13, 11 +# CHECK: subvi.d $w16, $w19, 7 + + .set msa + addvi.b $w14, $w12, 14 + addvi.h $w26, $w17, 4 + addvi.w $w19, $w13, 11 + addvi.d $w16, $w19, 7 + + subvi.b $w14, $w12, 14 + subvi.h $w26, $w17, 4 + subvi.w $w19, $w13, 11 + subvi.d $w16, $w19, 7