From 8ec5cf65a8213988a9f861e6a94d12311e9b04c3 Mon Sep 17 00:00:00 2001 From: Alexis Deruell Date: Fri, 27 Jan 2017 12:00:55 +0000 Subject: [PATCH] Fix disassembling of TIC6X parallel instructions where the previous fetch packet ended with a 32-bit insn. PR 21056 opcodes * tic6x-dis.c (print_insn_tic6x): Correct displaying of parallel instructions when the previous fetch packet ends with a 32-bit instruction. gas * testsuite/gas/tic6x/insns16-parallel.s: New test case. * testsuite/gas/tic6x/insns16-parallel.d: New test driver. --- gas/ChangeLog | 6 +++ gas/testsuite/gas/tic6x/insns16-parallel.d | 43 ++++++++++++++++++++++ gas/testsuite/gas/tic6x/insns16-parallel.s | 42 +++++++++++++++++++++ opcodes/ChangeLog | 7 ++++ opcodes/tic6x-dis.c | 13 ++++++- 5 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/tic6x/insns16-parallel.d create mode 100644 gas/testsuite/gas/tic6x/insns16-parallel.s diff --git a/gas/ChangeLog b/gas/ChangeLog index d21f8bc0799..de3b9b021a9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2017-01-27 Alexis Deruell + + PR 21056 + * testsuite/gas/tic6x/insns16-parallel.s: New test case. + * testsuite/gas/tic6x/insns16-parallel.d: New test driver. + 2017-01-25 Sebastian Huber * configure.tgt (aarch64*-*-rtems*): Remove. diff --git a/gas/testsuite/gas/tic6x/insns16-parallel.d b/gas/testsuite/gas/tic6x/insns16-parallel.d new file mode 100644 index 00000000000..56a28297735 --- /dev/null +++ b/gas/testsuite/gas/tic6x/insns16-parallel.d @@ -0,0 +1,43 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: +#as: -march=c64x+ -mlittle-endian + +.*: *file format elf32-tic6x-le + + +Disassembly of section .text: +[ \t]*\.\.\. +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008001[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+\|\|[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 8c6e[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 8c6e[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> e8002000[ \t]+ +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+\|\|[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008001[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> e0000000[ \t]+ +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+\|\|[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[0-9a-f]+[02468ace] <[^>]*> 00008000[ \t]+nop 5 +[ \t]*\.\.\. diff --git a/gas/testsuite/gas/tic6x/insns16-parallel.s b/gas/testsuite/gas/tic6x/insns16-parallel.s new file mode 100644 index 00000000000..06897b1e3db --- /dev/null +++ b/gas/testsuite/gas/tic6x/insns16-parallel.s @@ -0,0 +1,42 @@ + .text + nop + .align 16 + nop + .align 16 +FP0: + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008001 +FP1: + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .short 0x8c6e + .short 0x8c6e + .word 0xe8002000 +FP2: + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008001 + .word 0xe0000000 +FP3: + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 + .word 0x00008000 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 270bcda2d9a..3070ad58fae 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2017-01-27 Alexis Deruell + + PR 21056 + * tic6x-dis.c (print_insn_tic6x): Correct displaying of parallel + instructions when the previous fetch packet ends with a 32-bit + instruction. + 2017-01-24 Dimitar Dimitrov * pru-opc.c: Remove vague reference to a future GDB port. diff --git a/opcodes/tic6x-dis.c b/opcodes/tic6x-dis.c index d94d66208c0..1a6f5757ce1 100644 --- a/opcodes/tic6x-dis.c +++ b/opcodes/tic6x-dis.c @@ -510,8 +510,17 @@ print_insn_tic6x (bfd_vma addr, struct disassemble_info *info) prev_header_based = tic6x_check_fetch_packet_header (fp_prev, &prev_header, info); - if (prev_header_based && prev_header.word_compact[6]) - p_bit = prev_header.p_bits[13]; + if (prev_header_based) + { + if (prev_header.word_compact[6]) + p_bit = prev_header.p_bits[13]; + else + { + unsigned int prev_opcode = tic6x_extract_32 (fp_prev + 24, + info); + p_bit = (prev_opcode & 0x1) ? TRUE : FALSE; + } + } else { unsigned int prev_opcode = tic6x_extract_32 (fp_prev + 28, -- 2.30.2