[llvm] 1cda1e6 - [ARC] Add disassembly for the conditioned RSUB immediate instruction

Mark Schimmel via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 22 11:35:38 PDT 2021


Author: Thomas Johnson
Date: 2021-07-22T11:34:39-07:00
New Revision: 1cda1e618648d463f89eb5cea8c9849bc0074b24

URL: https://github.com/llvm/llvm-project/commit/1cda1e618648d463f89eb5cea8c9849bc0074b24
DIFF: https://github.com/llvm/llvm-project/commit/1cda1e618648d463f89eb5cea8c9849bc0074b24.diff

LOG: [ARC] Add disassembly for the conditioned RSUB immediate instruction

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

Added: 
    

Modified: 
    llvm/lib/Target/ARC/ARCInstrFormats.td
    llvm/lib/Target/ARC/ARCInstrInfo.td
    llvm/test/MC/Disassembler/ARC/alu.txt
    llvm/test/MC/Disassembler/ARC/misc.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARC/ARCInstrFormats.td b/llvm/lib/Target/ARC/ARCInstrFormats.td
index c95c71ff007bb..5f539c92c7452 100644
--- a/llvm/lib/Target/ARC/ARCInstrFormats.td
+++ b/llvm/lib/Target/ARC/ARCInstrFormats.td
@@ -262,7 +262,8 @@ class F32_SOP_RR<bits<5> major, bits<6> subop, bit F, dag outs, dag ins,
 }
 
 // Single Operand Immediate Instructions.
-// 1-register, unsigned 6-bit immediate Single Operand instruction.
+// 1-register, unsigned 6-bit immediate Single Operand instruction with
+// condition code.
 // |26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
 // |B[2-0]  | 1| 1|            subop| F|B[5-3]  |U6           |1|cc       |
 class F32_SOP_CC_RU6<bits<5> major, bits<6> subop, bit F, dag outs, dag ins,
@@ -352,6 +353,30 @@ class F32_DOP_RU6<bits<5> major, bits<6> subop, bit F, dag outs, dag ins,
   let Inst{5-0} = A;
 }
 
+// 2-register, unsigned 6-bit immediate Dual Operand instruction with
+// condition code. This instruction uses B as the first 2 operands
+// (i.e, add.cc B, B, u6).
+// |26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
+// |B[2-0]  | 1| 1|            subop| F|B[5-3]  |U6           |1|cc       |
+class F32_DOP_CC_RRU6<bits<5> major, bits<6> subop, bit F, dag outs, dag ins,
+                      string asmstr, list<dag> pattern> :
+  InstARC<4, outs, ins, asmstr, pattern> {
+  bits<5> cc;
+  bits<6> U6;
+  bits<6> B;
+  bits<6> A;
+
+  let Inst{31-27} = major;
+  let Inst{26-24} = B{2-0};
+  let Inst{23-22} = 0b11;
+  let Inst{21-16} = subop;
+  let Inst{15} = F;
+  let Inst{14-12} = B{5-3};
+  let Inst{11-6} = U6;
+  let Inst{5} = 1;
+  let Inst{4-0} = cc;
+}
+
 // 2-register, signed 12-bit immediate Dual Operand instruction.
 // This instruction uses B as the first 2 operands (i.e., add B, B, -128).
 // |26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|

diff  --git a/llvm/lib/Target/ARC/ARCInstrInfo.td b/llvm/lib/Target/ARC/ARCInstrInfo.td
index 23e2d57b625ec..0813f5377a486 100644
--- a/llvm/lib/Target/ARC/ARCInstrInfo.td
+++ b/llvm/lib/Target/ARC/ARCInstrInfo.td
@@ -160,6 +160,23 @@ multiclass ArcBinaryInst<bits<5> major, bits<6> mincode,
                             []>
   { let Defs = [STATUS32]; }
 
+  def _cc_rru6 : F32_DOP_CC_RRU6<major, mincode, 0, (outs GPR32:$A),
+                                 (ins immU6:$U6, ccond:$cc, GPR32:$B),
+                                 !strconcat(opasm, ".$cc\t$A, $B, $U6"),
+                                 []> {
+                                   let Uses = [STATUS32];
+                                   let Constraints = "$A = $B";
+                                 }
+
+  def _cc_f_rru6 : F32_DOP_CC_RRU6<major, mincode, 1, (outs GPR32:$A),
+                                   (ins immU6:$U6, ccond:$cc, GPR32:$B),
+                                   !strconcat(opasm, ".$cc.f\t$A, $B, $U6"),
+                                   []> {
+                                     let Defs = [STATUS32];
+                                     let Uses = [STATUS32];
+                                     let Constraints = "$A = $B";
+                                   }
+
   // 2 register with 32-bit immediate variant.
   def _rrlimm : F32_DOP_RLIMM<major, mincode, 0,
                               (outs GPR32:$A),
@@ -243,6 +260,7 @@ defm SUB : ArcBinaryGEN4Inst<0b000010, "sub">;
 defm SUB1 : ArcBinaryGEN4Inst<0b010111, "sub1">;
 defm SUB2 : ArcBinaryGEN4Inst<0b011000, "sub2">;
 defm SUB3 : ArcBinaryGEN4Inst<0b011001, "sub3">;
+defm RSUB : ArcBinaryGEN4Inst<0b001110, "rsub">;
 defm OR  : ArcBinaryGEN4Inst<0b000101, "or",1>;
 defm AND : ArcBinaryGEN4Inst<0b000100, "and",1>;
 defm XOR : ArcBinaryGEN4Inst<0b000111, "xor",1>;

diff  --git a/llvm/test/MC/Disassembler/ARC/alu.txt b/llvm/test/MC/Disassembler/ARC/alu.txt
index 1068ac22ed85c..274233ed201bb 100644
--- a/llvm/test/MC/Disassembler/ARC/alu.txt
+++ b/llvm/test/MC/Disassembler/ARC/alu.txt
@@ -104,3 +104,12 @@
 
 # CHECK: sub3.f %fp, %fp, -1
 0x99 0x23 0xff 0xbf
+
+# CHECK: rsub.eq %r0, %r0, 30
+0xce 0x20 0xa1 0x07
+
+# CHECK: rsub.ne %r0, %r0, 31
+0xce 0x20 0xe2 0x07
+
+# CHECK: rsub.ne.f %r0, %r0, 31
+0xce 0x20 0xe2 0x87

diff  --git a/llvm/test/MC/Disassembler/ARC/misc.txt b/llvm/test/MC/Disassembler/ARC/misc.txt
index 04fdfd7ca877a..16e5f090baca8 100644
--- a/llvm/test/MC/Disassembler/ARC/misc.txt
+++ b/llvm/test/MC/Disassembler/ARC/misc.txt
@@ -16,6 +16,12 @@
 # CHECK: mov %r1, 20
 0x4a 0x21 0x00 0x05
 
+# CHECK: mov.eq %r0, 32
+0xca 0x20 0x21 0x08
+
+# CHECK: mov.ne %r0, 0
+0xca 0x20 0x22 0x00
+
 # CHECK: st.aw %fp, [%sp,-4]
 0xfc 0x1c 0xc8 0xb6
 


        


More information about the llvm-commits mailing list