diff options
6 files changed, 41 insertions, 5 deletions
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 0000000..e6608f3 --- /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 0000000..f892bfa --- /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 0000000..3de3989 --- /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 0000000..d4918f3 --- /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 6a0ec25..91bf327 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 6a513cd..859d4e3 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; |