]> granicus.if.org Git - llvm/commitdiff
[mips] implement .set dspr2 directive
authorPetar Jovanovic <petar.jovanovic@imgtec.com>
Thu, 5 Oct 2017 17:40:32 +0000 (17:40 +0000)
committerPetar Jovanovic <petar.jovanovic@imgtec.com>
Thu, 5 Oct 2017 17:40:32 +0000 (17:40 +0000)
Implement .set dspr2 directive with appropriate feature bits. This
directive is a counterpart of -mattr=dspr2 command line option with the
exception that it does not influence elf header flags.

Patch by Milos Stojanovic.

Differential Revision: https://reviews.llvm.org/D38537

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314994 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
lib/Target/Mips/MipsTargetStreamer.h
test/MC/Mips/mips_directives.s
test/MC/Mips/module-directive-bad.s
test/MC/Mips/set-nodsp.s

index 9bbb430962ecaf605db96993430c2d1a70e8b915..6a411e0856bd4fd426f0ebb587d1adeb13e4bb7c 100644 (file)
@@ -6584,6 +6584,10 @@ bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
     setFeatureBits(Mips::FeatureDSP, "dsp");
     getTargetStreamer().emitDirectiveSetDsp();
     break;
+  case Mips::FeatureDSPR2:
+    setFeatureBits(Mips::FeatureDSPR2, "dspr2");
+    getTargetStreamer().emitDirectiveSetDspr2();
+    break;
   case Mips::FeatureMicroMips:
     setFeatureBits(Mips::FeatureMicroMips, "micromips");
     getTargetStreamer().emitDirectiveSetMicroMips();
@@ -6928,6 +6932,8 @@ bool MipsAsmParser::parseDirectiveSet() {
     return parseSetFeature(Mips::FeatureMips64r6);
   } else if (Tok.getString() == "dsp") {
     return parseSetFeature(Mips::FeatureDSP);
+  } else if (Tok.getString() == "dspr2") {
+    return parseSetFeature(Mips::FeatureDSPR2);
   } else if (Tok.getString() == "nodsp") {
     return parseSetNoDspDirective();
   } else if (Tok.getString() == "msa") {
index 2907b77158575e350eac0f9ea99d7eb4b9f79ec0..f01a800afc5eb5d85834f8a02804873c06077205 100644 (file)
@@ -98,6 +98,7 @@ void MipsTargetStreamer::emitDirectiveSetHardFloat() {
   forbidModuleDirective();
 }
 void MipsTargetStreamer::emitDirectiveSetDsp() { forbidModuleDirective(); }
+void MipsTargetStreamer::emitDirectiveSetDspr2() { forbidModuleDirective(); }
 void MipsTargetStreamer::emitDirectiveSetNoDsp() { forbidModuleDirective(); }
 void MipsTargetStreamer::emitDirectiveCpLoad(unsigned RegNo) {}
 bool MipsTargetStreamer::emitDirectiveCpRestore(
@@ -547,6 +548,11 @@ void MipsTargetAsmStreamer::emitDirectiveSetDsp() {
   MipsTargetStreamer::emitDirectiveSetDsp();
 }
 
+void MipsTargetAsmStreamer::emitDirectiveSetDspr2() {
+  OS << "\t.set\tdspr2\n";
+  MipsTargetStreamer::emitDirectiveSetDspr2();
+}
+
 void MipsTargetAsmStreamer::emitDirectiveSetNoDsp() {
   OS << "\t.set\tnodsp\n";
   MipsTargetStreamer::emitDirectiveSetNoDsp();
index 7d9f99ce071e86c0a8f2cdd9c18eace69a9fd727..b295c16ea81cb951254ec42ace90c6e661954c2e 100644 (file)
@@ -77,6 +77,7 @@ public:
   virtual void emitDirectiveSetMips64R5();
   virtual void emitDirectiveSetMips64R6();
   virtual void emitDirectiveSetDsp();
+  virtual void emitDirectiveSetDspr2();
   virtual void emitDirectiveSetNoDsp();
   virtual void emitDirectiveSetPop();
   virtual void emitDirectiveSetPush();
@@ -244,6 +245,7 @@ public:
   void emitDirectiveSetMips64R5() override;
   void emitDirectiveSetMips64R6() override;
   void emitDirectiveSetDsp() override;
+  void emitDirectiveSetDspr2() override;
   void emitDirectiveSetNoDsp() override;
   void emitDirectiveSetPop() override;
   void emitDirectiveSetPush() override;
index b421802a9c2e71b215e69a7ba208fba5f6ce15b1..b09c7aa71fe0e6bc232d43c59fc37bc4b1860d46 100644 (file)
@@ -83,3 +83,10 @@ $BB0_4:
    .set dsp
    lbux    $7, $10($11)
    lhx     $5, $6($7)
+
+# CHECK:   .set dspr2
+# CHECK:   append   $7, $10, 2          # encoding: [0x7d,0x47,0x10,0x31]
+# CHECK:   balign   $5, $6, 3           # encoding: [0x7c,0xc5,0x1c,0x31]
+   .set dspr2
+   append   $7, $10, 2
+   balign   $5, $6, 3
\ No newline at end of file
index 74dc6d22793b5c8e5f5f0993385bc358910e59b1..97f054699c20306d74d72f4c37ee0c1180911c76 100644 (file)
     .module fp=64
 # CHECK: :[[@LINE-1]]:13: error: .module directive must appear before any code
 
+    .set dspr2
+    .module fp=64
+# CHECK: :[[@LINE-1]]:13: error: .module directive must appear before any code
+
     .llvm_internal_mips_reallow_module_directive
     .module fp=32
 # CHECK-NOT: :[[@LINE-1]]:13: error: .module directive must appear before any code
index f98cefba3907caba17b9da5f712e83569bae8dd1..9ded5f663b780940834bcc212fb5af53e5e8fff0 100644 (file)
@@ -1,7 +1,8 @@
-# RUN: not llvm-mc %s -mcpu=mips32 -mattr=+dsp -triple mips-unknown-linux 2>%t1
+# RUN: not llvm-mc %s -mcpu=mips32 -mattr=+dspr2 -triple mips-unknown-linux 2>%t1
 # RUN: FileCheck %s < %t1
 
   lbux    $7, $10($11)
+  append  $4, $10, 2
 
   .set nodsp
   lbux    $6, $10($11)
   .set dsp
   lbux    $5, $10($11)
   # CHECK-NOT: error: instruction requires a CPU feature not currently enabled
+
+  .set nodsp
+  append  $3, $10, 2
+  # CHECK: error: instruction requires a CPU feature not currently enabled
+
+  .set dspr2
+  append  $2, $10, 2
+  # CHECK-NOT: error: instruction requires a CPU feature not currently enabled