From 4378ff024d02e376f8a59b647855db955e7f7538 Mon Sep 17 00:00:00 2001 From: Toma Tabacu Date: Wed, 17 Sep 2014 09:01:54 +0000 Subject: [PATCH] [mips] Add assembler support for the .set nodsp directive. Summary: This directive is used to tell the assembler to reject DSP-specific instructions. Reviewers: dsanders Reviewed By: dsanders Differential Revision: http://reviews.llvm.org/D5142 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217946 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 17 +++++++++++++++++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp | 6 ++++++ lib/Target/Mips/MipsTargetStreamer.h | 2 ++ test/MC/Mips/set-nodsp.s | 12 ++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 test/MC/Mips/set-nodsp.s diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 4903dcff0da..5ae753f0a6d 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -192,6 +192,7 @@ class MipsAsmParser : public MCTargetAsmParser { bool parseSetNoMacroDirective(); bool parseSetMsaDirective(); bool parseSetNoMsaDirective(); + bool parseSetNoDspDirective(); bool parseSetReorderDirective(); bool parseSetNoReorderDirective(); bool parseSetNoMips16Directive(); @@ -2654,6 +2655,20 @@ bool MipsAsmParser::parseSetNoMsaDirective() { return false; } +bool MipsAsmParser::parseSetNoDspDirective() { + Parser.Lex(); // Eat "nodsp". + + // 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::FeatureDSP, "dsp"); + getTargetStreamer().emitDirectiveSetNoDsp(); + return false; +} + bool MipsAsmParser::parseSetNoMips16Directive() { Parser.Lex(); // If this is not the end of the statement, report an error. @@ -3037,6 +3052,8 @@ bool MipsAsmParser::parseDirectiveSet() { return parseSetFeature(Mips::FeatureMips64r6); } else if (Tok.getString() == "dsp") { return parseSetFeature(Mips::FeatureDSP); + } else if (Tok.getString() == "nodsp") { + return parseSetNoDspDirective(); } else if (Tok.getString() == "msa") { return parseSetMsaDirective(); } else if (Tok.getString() == "nomsa") { diff --git a/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index 48e52a95ee0..d9874c7f6cb 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -74,6 +74,7 @@ void MipsTargetStreamer::emitDirectiveSetMips64R6() { forbidModuleDirective(); } void MipsTargetStreamer::emitDirectiveSetPop() {} void MipsTargetStreamer::emitDirectiveSetPush() {} void MipsTargetStreamer::emitDirectiveSetDsp() { forbidModuleDirective(); } +void MipsTargetStreamer::emitDirectiveSetNoDsp() { forbidModuleDirective(); } void MipsTargetStreamer::emitDirectiveCpload(unsigned RegNo) {} void MipsTargetStreamer::emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset, const MCSymbol &Sym, bool IsReg) { @@ -247,6 +248,11 @@ void MipsTargetAsmStreamer::emitDirectiveSetDsp() { MipsTargetStreamer::emitDirectiveSetDsp(); } +void MipsTargetAsmStreamer::emitDirectiveSetNoDsp() { + OS << "\t.set\tnodsp\n"; + MipsTargetStreamer::emitDirectiveSetNoDsp(); +} + void MipsTargetAsmStreamer::emitDirectiveSetPop() { OS << "\t.set\tpop\n"; } void MipsTargetAsmStreamer::emitDirectiveSetPush() { OS << "\t.set\tpush\n"; } diff --git a/lib/Target/Mips/MipsTargetStreamer.h b/lib/Target/Mips/MipsTargetStreamer.h index 182c526389e..70c52b29a42 100644 --- a/lib/Target/Mips/MipsTargetStreamer.h +++ b/lib/Target/Mips/MipsTargetStreamer.h @@ -62,6 +62,7 @@ public: virtual void emitDirectiveSetMips64R2(); virtual void emitDirectiveSetMips64R6(); virtual void emitDirectiveSetDsp(); + virtual void emitDirectiveSetNoDsp(); virtual void emitDirectiveSetPop(); virtual void emitDirectiveSetPush(); @@ -165,6 +166,7 @@ public: void emitDirectiveSetMips64R2() override; void emitDirectiveSetMips64R6() override; void emitDirectiveSetDsp() override; + void emitDirectiveSetNoDsp() override; void emitDirectiveSetPop() override; void emitDirectiveSetPush() override; diff --git a/test/MC/Mips/set-nodsp.s b/test/MC/Mips/set-nodsp.s new file mode 100644 index 00000000000..f98cefba390 --- /dev/null +++ b/test/MC/Mips/set-nodsp.s @@ -0,0 +1,12 @@ +# RUN: not llvm-mc %s -mcpu=mips32 -mattr=+dsp -triple mips-unknown-linux 2>%t1 +# RUN: FileCheck %s < %t1 + + lbux $7, $10($11) + + .set nodsp + lbux $6, $10($11) + # CHECK: error: instruction requires a CPU feature not currently enabled + + .set dsp + lbux $5, $10($11) + # CHECK-NOT: error: instruction requires a CPU feature not currently enabled -- 2.11.0