diff options
Diffstat (limited to 'opcodes/ppc-dis.c')
-rw-r--r-- | opcodes/ppc-dis.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index 0ac8275..bd4dfac 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -53,7 +53,29 @@ powerpc_dialect(info) || strcmp (info->disassembler_options, "booke64") == 0)) dialect |= PPC_OPCODE_BOOKE | PPC_OPCODE_BOOKE64; else - dialect |= PPC_OPCODE_403 | PPC_OPCODE_601; + if ((info->mach == bfd_mach_ppc_e500) + || (info->disassembler_options + && ( strcmp (info->disassembler_options, "e500") == 0 + || strcmp (info->disassembler_options, "e500x2") == 0))) + { + dialect |= PPC_OPCODE_BOOKE + | PPC_OPCODE_SPE | PPC_OPCODE_ISEL + | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK + | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK + | PPC_OPCODE_RFMCI; + /* efs* and AltiVec conflict. */ + dialect &= ~PPC_OPCODE_ALTIVEC; + } + else + if (info->disassembler_options + && (strcmp (info->disassembler_options, "efs") == 0)) + { + dialect |= PPC_OPCODE_EFS; + /* efs* and AltiVec conflict. */ + dialect &= ~PPC_OPCODE_ALTIVEC; + } + else + dialect |= PPC_OPCODE_403 | PPC_OPCODE_601 | PPC_OPCODE_COMMON; if (info->disassembler_options && strcmp (info->disassembler_options, "power4") == 0) @@ -153,6 +175,9 @@ print_insn_powerpc (memaddr, info, bigendian, dialect) || (opcode->flags & dialect) == 0) continue; + if ((dialect & PPC_OPCODE_EFS) && (opcode->flags & PPC_OPCODE_ALTIVEC)) + continue; + /* Make two passes over the operands. First see if any of them have extraction functions, and, if they do, make sure the instruction is valid. */ |