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