From a87a64780fde9dc8d1c3af8eda93fc1b878cd3cf Mon Sep 17 00:00:00 2001 From: Peter Bergner Date: Mon, 7 May 2018 20:47:54 -0500 Subject: [PATCH] Simplify VLE handling in print_insn_powerpc(). opcodes/ * ppc-dis.c (print_insn_powerpc) : Replace this... : ...with this. Update usage. Remove duplicate call to *info->memory_error_func. --- opcodes/ChangeLog | 6 ++++++ opcodes/ppc-dis.c | 55 ++++++++++++++++++++----------------------------------- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index b1abf30..0c6994e 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2018-05-07 Peter Bergner + + * ppc-dis.c (print_insn_powerpc) : Replace this... + : ...with this. Update usage. + Remove duplicate call to *info->memory_error_func. + 2018-05-07 Igor Tsimbalist H.J. Lu diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index f8b0292..0f7d7ba 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -660,28 +660,22 @@ print_insn_powerpc (bfd_vma memaddr, int status; uint64_t insn; const struct powerpc_opcode *opcode; - bfd_boolean insn_is_short; + int insn_length = 4; /* Assume we have a normal 4-byte instruction. */ status = (*info->read_memory_func) (memaddr, buffer, 4, info); + + /* The final instruction may be a 2-byte VLE insn. */ + if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0) + { + /* Clear buffer so unused bytes will not have garbage in them. */ + buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; + status = (*info->read_memory_func) (memaddr, buffer, 2, info); + } + if (status != 0) { - /* The final instruction may be a 2-byte VLE insn. */ - if ((dialect & PPC_OPCODE_VLE) != 0) - { - /* Clear buffer so unused bytes will not have garbage in them. */ - buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0; - status = (*info->read_memory_func) (memaddr, buffer, 2, info); - if (status != 0) - { - (*info->memory_error_func) (status, memaddr, info); - return -1; - } - } - else - { - (*info->memory_error_func) (status, memaddr, info); - return -1; - } + (*info->memory_error_func) (status, memaddr, info); + return -1; } if (bigendian) @@ -691,12 +685,15 @@ print_insn_powerpc (bfd_vma memaddr, /* Get the major opcode of the insn. */ opcode = NULL; - insn_is_short = FALSE; if ((dialect & PPC_OPCODE_VLE) != 0) { opcode = lookup_vle (insn); - if (opcode != NULL) - insn_is_short = PPC_OP_SE_VLE(opcode->mask); + if (opcode != NULL && PPC_OP_SE_VLE (opcode->mask)) + { + /* The operands will be fetched out of the 16-bit instruction. */ + insn >>= 16; + insn_length = 2; + } } if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0) opcode = lookup_spe2 (insn); @@ -718,10 +715,6 @@ print_insn_powerpc (bfd_vma memaddr, else (*info->fprintf_func) (info->stream, "%s", opcode->name); - if (insn_is_short) - /* The operands will be fetched out of the 16-bit instruction. */ - insn >>= 16; - /* Now extract and print the operands. */ need_comma = 0; need_paren = 0; @@ -813,16 +806,8 @@ print_insn_powerpc (bfd_vma memaddr, } } - /* We have found and printed an instruction. - If it was a short VLE instruction we have more to do. */ - if (insn_is_short) - { - memaddr += 2; - return 2; - } - else - /* Otherwise, return. */ - return 4; + /* We have found and printed an instruction. */ + return insn_length; } /* We could not find a match. */ -- 2.7.4