From: Andrew Burgess Date: Fri, 6 Jan 2023 16:42:23 +0000 (+0000) Subject: opcodes/mips: disassemble unknown micromips instructions as two shorts X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=77be7257442b1ca19deba8ec0e424f0faf53321f;p=binutils-gdb.git opcodes/mips: disassemble unknown micromips instructions as two shorts Before commit: commit 2438b771ee07be19d5b01ea55e077dd8b7cef445 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. --- diff --git a/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n32.d b/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n32.d new file mode 100644 index 00000000000..e6608f30265 --- /dev/null +++ b/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 diff --git a/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n64.d b/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-n64.d new file mode 100644 index 00000000000..f892bfabbe7 --- /dev/null +++ b/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 diff --git a/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-o32.d b/binutils/testsuite/binutils-all/mips/micromips-reserved-enc-o32.d new file mode 100644 index 00000000000..3de3989b37a --- /dev/null +++ b/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 + \.\.\. diff --git a/binutils/testsuite/binutils-all/mips/micromips-reserved-enc.s b/binutils/testsuite/binutils-all/mips/micromips-reserved-enc.s new file mode 100644 index 00000000000..d4918f36857 --- /dev/null +++ b/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 diff --git a/binutils/testsuite/binutils-all/mips/mips.exp b/binutils/testsuite/binutils-all/mips/mips.exp index 6a0ec25a06f..91bf3274592 100644 --- a/binutils/testsuite/binutils-all/mips/mips.exp +++ b/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" diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index 6a513cd8946..859d4e3806f 100644 --- a/opcodes/mips-dis.c +++ b/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;