X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fppc-dis.c;h=162f770697514b8180555a25cb9bb2ebe5a65cb5;hb=50d036364fb2a71b3ac9a0b0cdbe58296832a1b2;hp=9add60272a5172fad9f44c28451bce6aa3d349da;hpb=6f0e0752309e3e3016a48db1672e3092c677020c;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index 9add60272a..162f770697 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -1,5 +1,5 @@ /* ppc-dis.c -- Disassemble PowerPC instructions - Copyright (C) 1994-2019 Free Software Foundation, Inc. + Copyright (C) 1994-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor, Cygnus Support This file is part of the GNU opcodes library. @@ -185,10 +185,15 @@ struct ppc_mopt ppc_opts[] = { | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), 0 }, + { "power10", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64 + | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 + | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 + | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), + 0 }, { "future", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 - | PPC_OPCODE_POWERXX | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), + | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), 0 }, { "ppc", PPC_OPCODE_PPC, 0 }, @@ -354,7 +359,7 @@ powerpc_init_dialect (struct disassemble_info *info) break; default: if (info->arch == bfd_arch_powerpc) - dialect = ppc_parse_cpu (dialect, &sticky, "power9") | PPC_OPCODE_ANY; + dialect = ppc_parse_cpu (dialect, &sticky, "power10") | PPC_OPCODE_ANY; else dialect = ppc_parse_cpu (dialect, &sticky, "pwr"); break; @@ -750,8 +755,9 @@ print_insn_powerpc (bfd_vma memaddr, 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; + buffer[2] = buffer[3] = 0; status = (*info->read_memory_func) (memaddr, buffer, 2, info); + insn_length = 2; } if (status != 0) @@ -767,7 +773,7 @@ print_insn_powerpc (bfd_vma memaddr, /* Get the major opcode of the insn. */ opcode = NULL; - if ((dialect & PPC_OPCODE_POWERXX) != 0 + if ((dialect & PPC_OPCODE_POWER10) != 0 && PPC_OP (insn) == 0x1) { uint64_t temp_insn, suffix; @@ -801,12 +807,15 @@ print_insn_powerpc (bfd_vma memaddr, insn_length = 2; } } - if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0) - opcode = lookup_spe2 (insn); - if (opcode == NULL) - opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY); - if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0) - opcode = lookup_powerpc (insn, dialect); + if (opcode == NULL && insn_length == 4) + { + if ((dialect & PPC_OPCODE_SPE2) != 0) + opcode = lookup_spe2 (insn); + if (opcode == NULL) + opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY); + if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0) + opcode = lookup_powerpc (insn, dialect); + } if (opcode != NULL) { @@ -824,16 +833,16 @@ print_insn_powerpc (bfd_vma memaddr, need_paren } op_separator; bfd_boolean skip_optional; - int spaces; + int blanks; (*info->fprintf_func) (info->stream, "%s", opcode->name); /* gdb fprintf_func doesn't return count printed. */ - spaces = 8 - strlen (opcode->name); - if (spaces <= 0) - spaces = 1; + blanks = 8 - strlen (opcode->name); + if (blanks <= 0) + blanks = 1; /* Now extract and print the operands. */ - op_separator = spaces; + op_separator = blanks; skip_optional = FALSE; for (opindex = opcode->operands; *opindex != 0; opindex++) { @@ -872,6 +881,8 @@ print_insn_powerpc (bfd_vma memaddr, (*info->fprintf_func) (info->stream, "v%" PRId64, value); else if ((operand->flags & PPC_OPERAND_VSR) != 0) (*info->fprintf_func) (info->stream, "vs%" PRId64, value); + else if ((operand->flags & PPC_OPERAND_ACC) != 0) + (*info->fprintf_func) (info->stream, "a%" PRId64, value); else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0) (*info->print_address_func) (memaddr + value, info); else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0) @@ -918,9 +929,13 @@ print_insn_powerpc (bfd_vma memaddr, } /* We could not find a match. */ - (*info->fprintf_func) (info->stream, ".long 0x%" PRIx64, insn); - - return 4; + if (insn_length == 4) + (*info->fprintf_func) (info->stream, ".long 0x%x", + (unsigned int) insn); + else + (*info->fprintf_func) (info->stream, ".word 0x%x", + (unsigned int) insn >> 16); + return insn_length; } const disasm_options_and_args_t *