[ARC] Fix decoding of w6 signed short immediate.
authorClaudiu Zissulescu <claziss@gmail.com>
Mon, 23 Jul 2018 09:09:43 +0000 (11:09 +0200)
committerClaudiu Zissulescu <claziss@gmail.com>
Mon, 23 Jul 2018 09:09:43 +0000 (11:09 +0200)
gas/
  Claudiu Zissulescu  <claziss@synopsys.com>

        * testsuite/gas/arc/st.d: Fix test.

opcodes/
  Claudiu Zissulescu  <claziss@synopsys.com>

        * arc-opc.c (extract_w6): Fix extending the sign.

gas/ChangeLog
gas/testsuite/gas/arc/st.d
opcodes/ChangeLog
opcodes/arc-opc.c

index dbaa02d..8b36246 100644 (file)
@@ -1,5 +1,9 @@
 2018-07-23  Claudiu Zissulescu <claziss@synopsys.com>
 
+       * testsuite/gas/arc/st.d: Fix test.
+
+2018-07-23  Claudiu Zissulescu <claziss@synopsys.com>
+
        * config/tc-arc.c (tokenize_extinsn): Convert to lower case the
        name of extension instructions.
        * testsuite/gas/arc/textinsn_case.d: New file.
index 6fe5b88..269b2cf 100644 (file)
@@ -13,7 +13,7 @@ Disassembly of section .text:
   10:  1a02 004c               st[hw]+.aw      r1,\[r2,2\]
   14:  1e00 7040 0000 0384     st      r1,\[0x384\]
   1c:  1a00 0003               stb     0,\[r2\]
-  20:  1af8 8e01               st      56,\[r2,-8\]
+  20:  1af8 8e01               st      -8,\[r2,-8\]
   24:  1e00 7080 0000 0000     st      r2,\[0\]
                        28: R_ARC_32_ME foo
   2c:  1a02 0060               st.di   r1,\[r2,2\]
index 9d0de43..d99b85c 100644 (file)
@@ -1,5 +1,9 @@
 2018-07-23  Claudiu Zissulescu <claziss@synopsys.com>
 
+       * arc-opc.c (extract_w6): Fix extending the sign.
+
+2018-07-23  Claudiu Zissulescu <claziss@synopsys.com>
+
        * arc-tbl.h (vewt): Allow it for ARC EM family.
 
 2018-07-23  Alan Modra  <amodra@gmail.com>
index 5349e13..b87a231 100644 (file)
@@ -651,10 +651,14 @@ static long long
 extract_w6 (unsigned long long  insn,
            bfd_boolean *       invalid ATTRIBUTE_UNUSED)
 {
-  unsigned value = 0;
+  int value = 0;
 
   value |= ((insn >> 6) & 0x003f) << 0;
 
+  /* Extend the sign.  */
+  int signbit = 1 << 5;
+  value = (value ^ signbit) - signbit;
+
   return value;
 }