PR1202, mcore disassembler: wrong address loopt
authorAlan Modra <amodra@gmail.com>
Thu, 3 Jun 2021 02:33:09 +0000 (12:03 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 3 Jun 2021 03:35:57 +0000 (13:05 +0930)
Fixes a 16 year old bug report, which even came with a patch.

opcodes/
PR 1202
* mcore-dis.c (print_insn_mcore): Correct loopt disassembly.
Use unsigned int for inst.
gas/
PR 1202
* testsuite/gas/mcore/allinsn.d: Correct loopt expected output.

gas/ChangeLog
gas/testsuite/gas/mcore/allinsn.d
opcodes/ChangeLog
opcodes/mcore-dis.c

index 3e2e3c5d0b5ebc6915dd91ebd91f27d136401291..67b4583f212fd1afa04c6652a274172e01c9392f 100644 (file)
@@ -1,3 +1,8 @@
+2021-06-03  Alan Modra  <amodra@gmail.com>
+
+       PR 1202
+       * testsuite/gas/mcore/allinsn.d: Correct loopt expected output.
+
 2021-05-29  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/ppc/raw.s,
index a53805bae2f5154aa2e5ebd8c1d436549e14f73f..cf3b0ff6339367901989b3ff9c853ea26cc9b929 100644 (file)
@@ -199,7 +199,7 @@ Disassembly of section \.text:
   7e:  0041            ldq     r4-r7, \(r1\)
 
 0+080 <loopt>:
-  80:  048e            loopt   r8, 0x64
+  80:  048e            loopt   r8, 0x7e
 
 0+082 <LRW>:
   82:  7901            lrw     r9, 0x3C0C1BBA
index fc3dd0818dcb45335fd1ebf95ae32d49506c1e2e..6419ee83cc4f6ab24932e64c49988ac7d2df97f1 100644 (file)
@@ -1,3 +1,9 @@
+2021-06-03  Alan Modra  <amodra@gmail.com>
+
+       PR 1202
+       * mcore-dis.c (print_insn_mcore): Correct loopt disassembly.
+       Use unsigned int for inst.
+
 2021-06-02  Shahab Vahedi  <shahab@synopsys.com>
 
        * arc-dis.c (arc_option_arg_t): New enumeration.
index 0ee2e60eedae8a8c39792e0d4e41a2492424e96e..c359ee0ec6e4691f6fdd2059ea1528a2ed40ebc5 100644 (file)
@@ -95,7 +95,7 @@ print_insn_mcore (bfd_vma memaddr,
   unsigned char ibytes[4];
   fprintf_ftype print_func = info->fprintf_func;
   void *stream = info->stream;
-  unsigned short inst;
+  unsigned int inst;
   unsigned int i;
   int status;
 
@@ -215,10 +215,10 @@ print_insn_mcore (bfd_vma memaddr,
 
        case BL:
          {
-           uint32_t val = inst & 0x000F;
+           uint32_t val = memaddr + 2 + ((inst | ~0xF) << 1);
+
            (*print_func) (stream, "\t%s, 0x%x",
-                          grname[(inst >> 4) & 0xF],
-                          (uint32_t) (memaddr - (val << 1)));
+                          grname[(inst >> 4) & 0xF], val);
          }
          break;