X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fppc-dis.c;h=eca1f36710814cc991f13a2cdbb0d5062ef53355;hb=c5316fc6e634858a3821e612e613342da562e0b3;hp=a735fbb5a9a97dee368d1329a907eafffb00fdc2;hpb=b3adc24a0713411ab38a21dc894dd40dbc5c8f4f;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index a735fbb5a9..eca1f36710 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -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 }, @@ -233,6 +238,11 @@ struct ppc_mopt ppc_opts[] = { | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), 0 }, + { "pwr10", (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 }, { "pwrx", PPC_OPCODE_POWER | PPC_OPCODE_POWER2, 0 }, { "raw", PPC_OPCODE_PPC, @@ -354,7 +364,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 +760,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 +778,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 +812,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) { @@ -872,6 +886,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 +934,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 *