diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index c6bee6302d8a..d010a97ca50d 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -2460,6 +2460,13 @@ bool MipsAsmParser::parseDirectiveSet() { setFeatureBits(Mips::FeatureMips32r2,"mips32r2"); getTargetStreamer().emitDirectiveSetMips32R2(); return false; + } else if (Tok.getString() == "dsp") { + Parser.Lex(); // Eat token. + if (getLexer().isNot(AsmToken::EndOfStatement)) + return reportParseError("unexpected token in .set directive"); + setFeatureBits(Mips::FeatureDSP, "dsp"); + getTargetStreamer().emitDirectiveSetDsp(); + return false; } else { // It is just an identifier, look for an assignment. parseSetAssignment(); diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index ef6d8d40e3a5..e9ce4b8bf25a 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -101,6 +101,9 @@ void MipsTargetAsmStreamer::emitDirectiveSetMips32R2() { OS << "\t.set\tmips32r2\n"; } +void MipsTargetAsmStreamer::emitDirectiveSetDsp() { + OS << "\t.set\tdsp\n"; +} // Print a 32 bit hex number with all numbers. static void printHex32(unsigned Value, raw_ostream &OS) { OS << "0x"; @@ -310,3 +313,7 @@ void MipsTargetELFStreamer::emitFMask(unsigned FPUBitmask, void MipsTargetELFStreamer::emitDirectiveSetMips32R2() { // No action required for ELF output. } + +void MipsTargetELFStreamer::emitDirectiveSetDsp() { + // No action required for ELF output. +} diff --git a/llvm/lib/Target/Mips/MipsTargetStreamer.h b/llvm/lib/Target/Mips/MipsTargetStreamer.h index b1132676a98f..7917b77ced1e 100644 --- a/llvm/lib/Target/Mips/MipsTargetStreamer.h +++ b/llvm/lib/Target/Mips/MipsTargetStreamer.h @@ -41,6 +41,7 @@ public: virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) = 0; virtual void emitDirectiveSetMips32R2() = 0; + virtual void emitDirectiveSetDsp() = 0; }; // This part is for ascii assembly output @@ -71,6 +72,7 @@ public: virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff); virtual void emitDirectiveSetMips32R2(); + virtual void emitDirectiveSetDsp(); }; // This part is for ELF object output @@ -108,6 +110,7 @@ public: virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff); virtual void emitDirectiveSetMips32R2(); + virtual void emitDirectiveSetDsp(); }; } #endif diff --git a/llvm/test/MC/Mips/mips_directives.s b/llvm/test/MC/Mips/mips_directives.s index f3fd1aff516d..074e59f5f412 100644 --- a/llvm/test/MC/Mips/mips_directives.s +++ b/llvm/test/MC/Mips/mips_directives.s @@ -58,3 +58,10 @@ $BB0_4: ldxc1 $f0, $zero($5) luxc1 $f0, $6($5) lwxc1 $f6, $2($5) + +# CHECK: .set dsp +# CHECK: lbux $7, $10($11) # encoding: [0x7d,0x6a,0x39,0x8a] +# CHECK: lhx $5, $6($7) # encoding: [0x7c,0xe6,0x29,0x0a] + .set dsp + lbux $7, $10($11) + lhx $5, $6($7)