[ARC] Disassembler: fix LIMM detection for short instructions.
authorClaudiu Zissulescu <claziss@synopsys.com>
Thu, 13 Oct 2016 13:01:19 +0000 (15:01 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Fri, 14 Oct 2016 11:52:15 +0000 (13:52 +0200)
The ARC (short) instructions are using a special register number to
indicate is the instruction uses a long immediate (LIMM).  In the case
of short instruction, this LIMM indicator depends on the ISA version
used. Thus, for ARCv1 processors, the LIMM indicator is 0x3E, the same
value used in "long" instructions.  However, for the ARCv2 processors,
this LIMM indicator is 0x1E.

This patch fixes the LIMM detection for ARCv1 ISA and adds two tests.

gas/
2016-10-13  Claudiu Zissulescu  <claziss@synopsys.com>

* testsuite/gas/arc/shortlimm_a7.d: New file.
* testsuite/gas/arc/shortlimm_a7.s: Likewise.
* testsuite/gas/arc/shortlimm_hs.d: Likewise.
* testsuite/gas/arc/shortlimm_hs.s: Likewise.

include/
2016-10-13  Claudiu Zissulescu  <claziss@synopsys.com>

* opcode/arc.h (ARC_OPCODE_ARCV2): New define.

opcodes/
2016-10-13  Claudiu Zissulescu  <claziss@synopsys.com>

        * arc-dis.c (find_format_from_table): Discriminate LIMM indicator
usage on ISA basis.

gas/ChangeLog
gas/testsuite/gas/arc/shortlimm_a7.d [new file with mode: 0644]
gas/testsuite/gas/arc/shortlimm_a7.s [new file with mode: 0644]
gas/testsuite/gas/arc/shortlimm_hs.d [new file with mode: 0644]
gas/testsuite/gas/arc/shortlimm_hs.s [new file with mode: 0644]
include/ChangeLog
include/opcode/arc.h
opcodes/ChangeLog
opcodes/arc-dis.c

index da3bc5a60ff8ef8e031e9609ec664c6a6695f371..c220884d67af736cb09fa1a916b1bb4f82cc9198 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-14  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * testsuite/gas/arc/shortlimm_a7.d: New file.
+       * testsuite/gas/arc/shortlimm_a7.s: Likewise.
+       * testsuite/gas/arc/shortlimm_hs.d: Likewise.
+       * testsuite/gas/arc/shortlimm_hs.s: Likewise.
+
 2016-10-11  Nick Clifton  <nickc@redhat.com>
 
        * gas/arm/tls.d: Adjust output to match change in objdump.
diff --git a/gas/testsuite/gas/arc/shortlimm_a7.d b/gas/testsuite/gas/arc/shortlimm_a7.d
new file mode 100644 (file)
index 0000000..efed86f
--- /dev/null
@@ -0,0 +1,11 @@
+#objdump: -d
+
+.*: +file format .*arc.*
+
+
+Disassembly of section .text:
+
+00000000 <.text>:
+   0:  70c7 0000 1000          add_s   r0,r0,0x1000
+   6:  72d7 0000 1000          cmp_s   r2,0x1000
+   c:  72cf 0000 1000          mov_s   r2,0x1000
diff --git a/gas/testsuite/gas/arc/shortlimm_a7.s b/gas/testsuite/gas/arc/shortlimm_a7.s
new file mode 100644 (file)
index 0000000..fd14206
--- /dev/null
@@ -0,0 +1,5 @@
+       .cpu ARC700
+       .text
+       add_s   r0,r0,0x1000
+       cmp_s   r2,0x1000
+       mov_s   r2,0x1000
diff --git a/gas/testsuite/gas/arc/shortlimm_hs.d b/gas/testsuite/gas/arc/shortlimm_hs.d
new file mode 100644 (file)
index 0000000..0313cff
--- /dev/null
@@ -0,0 +1,15 @@
+#objdump: -d
+
+.*: +file format .*arc.*
+
+
+Disassembly of section .text:
+
+00000000 <.text>:
+   0:  70c3 0000 1000          add_s   r0,r0,0x1000
+   6:  71c7 0000 1001          add_s   0,0x1001,1
+   c:  72d3 0000 1000          cmp_s   r2,0x1000
+  12:  71d7 0000 1000          cmp_s   0x1000,1
+  18:  42c3 0000 1000          mov_s   r2,0x1000
+  1e:  46db 0000 1000          mov_s   0,0x1000
+  24:  72df 0000 1000          mov_s.ne        r2,0x1000
diff --git a/gas/testsuite/gas/arc/shortlimm_hs.s b/gas/testsuite/gas/arc/shortlimm_hs.s
new file mode 100644 (file)
index 0000000..3f2be12
--- /dev/null
@@ -0,0 +1,9 @@
+       .cpu HS
+       .text
+       add_s   r0,r0,0x1000
+       add_s   0,0x1001,1
+       cmp_s   r2,0x1000
+       cmp_s   0x1000,1
+       mov_s   r2,0x1000
+       mov_s   0,0x1000
+       mov_s.ne        r2,0x1000
index 652bb212f23029618c65a2a9afa6224beeb744f5..6f681308ebb8cf813b208d473d2c966eb0668ab3 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-14  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * opcode/arc.h (ARC_OPCODE_ARCV2): New define.
+
 2016-09-29  Alan Modra  <amodra@gmail.com>
 
        * opcode/ppc.h (PPC_OPERAND_OPTIONAL32): Define.
index 09e973bdf5f29ea1d6e570cbb3f8f6802e371adb..724fdeef053602ad4694ffda5972951e4484d010 100644 (file)
@@ -186,6 +186,7 @@ extern const struct arc_opcode arc_opcodes[];
 #define ARC_OPCODE_ARCALL  (ARC_OPCODE_ARC600 | ARC_OPCODE_ARC700      \
                            | ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS)
 #define ARC_OPCODE_ARCFPX  (ARC_OPCODE_ARC700 | ARC_OPCODE_ARCv2EM)
+#define ARC_OPCODE_ARCV2   (ARC_OPCODE_ARCv2EM | ARC_OPCODE_ARCv2HS)
 
 /* CPU extensions.  */
 #define ARC_EA       0x0001
index 3ac9c3fba79f3b03870d0a0c89ecadc88da4c372..11ee45564e7ae4fc2f4bc2d940c76ce13d45a408 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-14  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * arc-dis.c (find_format_from_table): Discriminate LIMM indicator
+       usage on ISA basis.
+
 2016-10-11  Jiong Wang  <jiong.wang@arm.com>
 
        PR target/20666
index c4e118e34051b650a22a784b4b661328d190b470..898512c87b3fa8cf63c8a6be2f9634c8d897422c 100644 (file)
@@ -296,7 +296,7 @@ find_format_from_table (struct disassemble_info *info,
       /* Possible candidate, check the operands.  */
       for (opidx = opcode->operands; *opidx; opidx++)
        {
-         int value;
+         int value, limmind;
          const struct arc_operand *operand = &arc_operands[*opidx];
 
          if (operand->flags & ARC_OPERAND_FAKE)
@@ -309,11 +309,12 @@ find_format_from_table (struct disassemble_info *info,
 
          /* Check for LIMM indicator.  If it is there, then make sure
             we pick the right format.  */
+         limmind = (isa_mask & ARC_OPCODE_ARCV2) ? 0x1E : 0x3E;
          if (operand->flags & ARC_OPERAND_IR
              && !(operand->flags & ARC_OPERAND_LIMM))
            {
              if ((value == 0x3E && insn_len == 4)
-                 || (value == 0x1E && insn_len == 2))
+                 || (value == limmind && insn_len == 2))
                {
                  invalid = TRUE;
                  break;