Index: opcodes/ppc-dis.c |
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c |
index 090574451c54356afbd6e58d936b186343a484b2..594228794bef3e735e1bac9ec476f3bc41532596 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,55 @@ 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_parse_cpu (dialect, &sticky, "403"); |
+ break; |
+ case bfd_mach_ppc_405: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "405"); |
+ break; |
+ case bfd_mach_ppc_601: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "601"); |
+ break; |
+ case bfd_mach_ppc_a35: |
+ case bfd_mach_ppc_rs64ii: |
+ case bfd_mach_ppc_rs64iii: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "pwr2") | PPC_OPCODE_64; |
+ break; |
+ case bfd_mach_ppc_e500: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "e500"); |
+ break; |
+ case bfd_mach_ppc_e500mc: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "e500mc"); |
+ break; |
+ case bfd_mach_ppc_e500mc64: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "e500mc64"); |
+ break; |
+ case bfd_mach_ppc_e5500: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "e5500"); |
+ break; |
+ case bfd_mach_ppc_e6500: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "e6500"); |
+ break; |
+ case bfd_mach_ppc_titan: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "titan"); |
+ break; |
+ case bfd_mach_ppc_vle: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "vle"); |
+ break; |
+ default: |
+ dialect = ppc_parse_cpu (dialect, &sticky, "power8") | PPC_OPCODE_ANY; |
+ } |
+ |
arg = info->disassembler_options; |
while (arg != NULL) |
{ |
@@ -260,7 +310,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 +324,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 +702,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) |
{ |