PR1202, mcore disassembler: wrong address loopt

Alan Modra amodra@gmail.com
Thu Jun 3 03:50:03 GMT 2021


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.

diff --git a/gas/testsuite/gas/mcore/allinsn.d b/gas/testsuite/gas/mcore/allinsn.d
index a53805bae2f..cf3b0ff6339 100644
--- a/gas/testsuite/gas/mcore/allinsn.d
+++ b/gas/testsuite/gas/mcore/allinsn.d
@@ -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
diff --git a/opcodes/mcore-dis.c b/opcodes/mcore-dis.c
index 0ee2e60eeda..c359ee0ec6e 100644
--- a/opcodes/mcore-dis.c
+++ b/opcodes/mcore-dis.c
@@ -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;
 

-- 
Alan Modra
Australia Development Lab, IBM


More information about the Binutils mailing list