Browse Source

opcodes/mips: disassemble unknown micromips instructions as two shorts

Before commit:

  commit 2438b771ee
  Date:   Wed Nov 2 15:53:43 2022 +0000

      opcodes/mips: use .word/.short for undefined instructions

unknown 32-bit microMIPS instructions were disassembled as a raw
32-bit number with no '.word' directive.  The above commit changed
this and added a '.word' directive before the 32-bit number.

It was pointed out on the mailing list, that for microMIPS it would be
better to display such 32-bit instructions using a '.short' directive
followed by two 16-bit values.

This commit updates the mips disassembler to do this, and adds a new
test that validates this output.
users/aburgess/try-core-file-pid0
Andrew Burgess 4 years ago
parent
commit
77be725744
  1. 5
      binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n32.d
  2. 5
      binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n64.d
  3. 10
      binutils/testsuite/binutils-all/mips/micromips-reserved-enc-o32.d
  4. 9
      binutils/testsuite/binutils-all/mips/micromips-reserved-enc.s
  5. 4
      binutils/testsuite/binutils-all/mips/mips.exp
  6. 13
      opcodes/mips-dis.c

5
binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n32.d

@ -0,0 +1,5 @@
#PROG: objcopy
#objdump: -d --prefix-addresses --show-raw-insn
#name: microMIPS source file contains reserved encoding (n32)
#source: micromips-reserved-enc.s
#dump: micromips-reserved-enc-o32.d

5
binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n64.d

@ -0,0 +1,5 @@
#PROG: objcopy
#objdump: -d --prefix-addresses --show-raw-insn
#name: microMIPS source file contains reserved encoding (n64)
#source: micromips-reserved-enc.s
#dump: micromips-reserved-enc-o32.d

10
binutils/testsuite/binutils-all/mips/micromips-reserved-enc-o32.d

@ -0,0 +1,10 @@
#PROG: objcopy
#objdump: -d --prefix-addresses --show-raw-insn
#name: microMIPS source file contains reserved encoding (o32)
#source: micromips-reserved-enc.s
.*: +file format .*mips.*
Disassembly of section \.text:
[0-9a-f]+ <[^>]*> 7f6e 5d4c \.short 0x7f6e, 0x5d4c
\.\.\.

9
binutils/testsuite/binutils-all/mips/micromips-reserved-enc.s

@ -0,0 +1,9 @@
.module mips64r3
.module micromips
foo:
.insn
.short 0x7f6e, 0x5d4c
# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
.align 4, 0
.space 16

4
binutils/testsuite/binutils-all/mips/mips.exp

@ -266,3 +266,7 @@ run_dump_test_n64 "global-local-symtab-sort-n64${tmips}"
run_dump_test_o32 "global-local-symtab-final-o32" useld
run_dump_test_n32 "global-local-symtab-final-n32" useld
run_dump_test_n64 "global-local-symtab-final-n64" useld
run_dump_test_o32 "micromips-reserved-enc-o32"
run_dump_test_n32 "micromips-reserved-enc-n32"
run_dump_test_n64 "micromips-reserved-enc-n64"

13
opcodes/mips-dis.c

@ -2600,12 +2600,15 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
}
}
if (length == 2)
infprintf (is, dis_style_assembler_directive, ".short");
else
infprintf (is, dis_style_assembler_directive, ".word");
infprintf (is, dis_style_assembler_directive, ".short");
infprintf (is, dis_style_text, "\t");
infprintf (is, dis_style_immediate, "0x%x", insn);
if (length != 2)
{
infprintf (is, dis_style_immediate, "0x%x", (insn >> 16) & 0xffff);
infprintf (is, dis_style_text, ", ");
}
infprintf (is, dis_style_immediate, "0x%x", (insn & 0xffff));
info->insn_type = dis_noninsn;
return length;

Loading…
Cancel
Save