X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fppc-dis.c;h=4e2bcd7835b9ceea208967012e8b0e802d7804dc;hb=1edebdbff51987eb2cdfdcdce433458bc25fb9a6;hp=090574451c54356afbd6e58d936b186343a484b2;hpb=94caa966375d53b07f39beac80f1f9af4cac18da;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index 090574451c..4e2bcd7835 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -88,7 +88,7 @@ struct ppc_mopt ppc_opts[] = { | PPC_OPCODE_A2), 0 }, { "altivec", (PPC_OPCODE_PPC), - PPC_OPCODE_ALTIVEC }, + PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 }, { "any", 0, PPC_OPCODE_ANY }, { "booke", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE), @@ -147,6 +147,11 @@ struct ppc_mopt ppc_opts[] = { | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), 0 }, + { "power8", (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_HTM + | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX), + 0 }, { "ppc", (PPC_OPCODE_PPC), 0 }, { "ppc32", (PPC_OPCODE_PPC), @@ -176,6 +181,11 @@ struct ppc_mopt ppc_opts[] = { | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), 0 }, + { "pwr8", (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_HTM + | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX), + 0 }, { "pwrx", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2), 0 }, { "spe", (PPC_OPCODE_PPC | PPC_OPCODE_EFS), @@ -187,6 +197,8 @@ struct ppc_mopt ppc_opts[] = { PPC_OPCODE_VLE }, { "vsx", (PPC_OPCODE_PPC), PPC_OPCODE_VSX }, + { "htm", (PPC_OPCODE_PPC), + PPC_OPCODE_HTM }, }; /* Switch between Booke and VLE dialects for interlinked dumps. */ @@ -211,13 +223,8 @@ get_powerpc_dialect (struct disassemble_info *info) /* Handle -m and -M options that set cpu type, and .machine arg. */ ppc_cpu_t -ppc_parse_cpu (ppc_cpu_t ppc_cpu, const char *arg) +ppc_parse_cpu (ppc_cpu_t ppc_cpu, ppc_cpu_t *sticky, const char *arg) { - const ppc_cpu_t retain_mask = (PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX - | PPC_OPCODE_SPE | PPC_OPCODE_ANY - | PPC_OPCODE_VLE | PPC_OPCODE_PMR); - /* Sticky bits. */ - ppc_cpu_t retain_flags = ppc_cpu & retain_mask; unsigned int i; for (i = 0; i < sizeof (ppc_opts) / sizeof (ppc_opts[0]); i++) @@ -225,8 +232,8 @@ ppc_parse_cpu (ppc_cpu_t ppc_cpu, const char *arg) { if (ppc_opts[i].sticky) { - retain_flags |= ppc_opts[i].sticky; - if ((ppc_cpu & ~retain_mask) != 0) + *sticky |= ppc_opts[i].sticky; + if ((ppc_cpu & ~*sticky) != 0) break; } ppc_cpu = ppc_opts[i].cpu; @@ -235,7 +242,7 @@ ppc_parse_cpu (ppc_cpu_t ppc_cpu, const char *arg) if (i >= sizeof (ppc_opts) / sizeof (ppc_opts[0])) return 0; - ppc_cpu |= retain_flags; + ppc_cpu |= *sticky; return ppc_cpu; } @@ -245,12 +252,72 @@ static void powerpc_init_dialect (struct disassemble_info *info) { ppc_cpu_t dialect = 0; + ppc_cpu_t sticky = 0; char *arg; struct dis_private *priv = calloc (sizeof (*priv), 1); if (priv == NULL) priv = &private; + switch (info->mach) + { + case bfd_mach_ppc_403: + case bfd_mach_ppc_403gc: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_403); + break; + case bfd_mach_ppc_405: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_403 | PPC_OPCODE_405); + break; + case bfd_mach_ppc_601: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_601); + break; + case bfd_mach_ppc_a35: + case bfd_mach_ppc_rs64ii: + case bfd_mach_ppc_rs64iii: + dialect = (PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_64); + break; + case bfd_mach_ppc_e500: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE + | PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI + | PPC_OPCODE_E500); + break; + case bfd_mach_ppc_e500mc: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI + | PPC_OPCODE_E500MC); + break; + case bfd_mach_ppc_e500mc64: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI + | PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_POWER5 + | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7); + break; + case bfd_mach_ppc_e5500: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI + | PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_POWER4 + | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 + | PPC_OPCODE_POWER7); + break; + case bfd_mach_ppc_e6500: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI + | PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_ALTIVEC + | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_E6500 | PPC_OPCODE_POWER4 + | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7); + break; + case bfd_mach_ppc_titan: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_PMR + | PPC_OPCODE_RFMCI | PPC_OPCODE_TITAN); + break; + case bfd_mach_ppc_vle: + dialect = (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_VLE); + break; + default: + dialect = ppc_parse_cpu (dialect, &sticky, "power8") | PPC_OPCODE_ANY; + } + arg = info->disassembler_options; while (arg != NULL) { @@ -260,7 +327,7 @@ powerpc_init_dialect (struct disassemble_info *info) if (end != NULL) *end = 0; - if ((new_cpu = ppc_parse_cpu (dialect, arg)) != 0) + if ((new_cpu = ppc_parse_cpu (dialect, &sticky, arg)) != 0) dialect = new_cpu; else if (strcmp (arg, "32") == 0) dialect &= ~(ppc_cpu_t) PPC_OPCODE_64; @@ -274,20 +341,6 @@ powerpc_init_dialect (struct disassemble_info *info) arg = end; } - if ((dialect & ~(ppc_cpu_t) PPC_OPCODE_64) == 0) - { - if (info->mach == bfd_mach_ppc64) - dialect |= PPC_OPCODE_64; - else - dialect &= ~(ppc_cpu_t) PPC_OPCODE_64; - if (info->mach == bfd_mach_ppc_vle) - dialect |= PPC_OPCODE_PPC | PPC_OPCODE_VLE; - else - /* Choose a reasonable default. */ - dialect |= (PPC_OPCODE_PPC | PPC_OPCODE_COMMON | PPC_OPCODE_601 - | PPC_OPCODE_ALTIVEC); - } - info->private_data = priv; POWERPC_DIALECT(info) = dialect; } @@ -666,7 +719,7 @@ print_insn_powerpc (bfd_vma memaddr, (*info->fprintf_func) (info->stream, "%s", cbnames[cc]); } else - (*info->fprintf_func) (info->stream, "%d", value); + (*info->fprintf_func) (info->stream, "%d", (int) value); if (need_paren) {