diff options
Diffstat (limited to 'src/devices/cpu/powerpc/ppcfe.cpp')
-rw-r--r-- | src/devices/cpu/powerpc/ppcfe.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/devices/cpu/powerpc/ppcfe.cpp b/src/devices/cpu/powerpc/ppcfe.cpp index 57ec36cd317..1e8fb105ee1 100644 --- a/src/devices/cpu/powerpc/ppcfe.cpp +++ b/src/devices/cpu/powerpc/ppcfe.cpp @@ -119,6 +119,16 @@ bool ppc_device::frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.cycles = 2; // ??? return true; + case 0x09: // DOZI (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED_OR_ZERO(desc, G_RA(op)); + GPR_MODIFIED(desc, G_RD(op)); + return true; + case 0x0e: // ADDI case 0x0f: // ADDIS GPR_USED_OR_ZERO(desc, G_RA(op)); @@ -1156,6 +1166,81 @@ bool ppc_device::frontend::describe_1f(uint32_t op, opcode_desc &desc, const opc return false; desc.flags |= OPFLAG_CAN_CHANGE_MODES | OPFLAG_CAN_CAUSE_EXCEPTION | OPFLAG_END_SEQUENCE; return true; + + case 0x14b: // DIV (POWER) + case 0x16b: // DIVS (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED(desc, G_RA(op)); + GPR_USED(desc, G_RB(op)); + GPR_MODIFIED(desc, G_RD(op)); + XER_OV_MODIFIED(desc); + XER_SO_MODIFIED(desc); + if (op & M_RC) + CR_MODIFIED(desc, 0); + return true; + + case 0x6b: // MUL (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED(desc, G_RA(op)); + GPR_USED(desc, G_RB(op)); + GPR_MODIFIED(desc, G_RD(op)); + XER_OV_MODIFIED(desc); + XER_SO_MODIFIED(desc); + if (op & M_RC) + CR_MODIFIED(desc, 0); + return true; + + case 0x108: // DOZ (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED(desc, G_RA(op)); + GPR_USED(desc, G_RB(op)); + GPR_MODIFIED(desc, G_RD(op)); + XER_OV_MODIFIED(desc); + XER_SO_MODIFIED(desc); + if (op & M_RC) + CR_MODIFIED(desc, 0); + return true; + + case 0x168: // ABS (POWER) + case 0x1e8: // NABS (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED(desc, G_RA(op)); + GPR_USED(desc, G_RB(op)); + GPR_MODIFIED(desc, G_RD(op)); + XER_OV_MODIFIED(desc); + XER_SO_MODIFIED(desc); + if (op & M_RC) + CR_MODIFIED(desc, 0); + return true; + + case 0x21d: // MASKIR (POWER) + if (!(m_ppc.m_cap & PPCCAP_LEGACY_POWER)) + { + return false; + } + + GPR_USED(desc, G_RS(op)); + GPR_USED(desc, G_RB(op)); + GPR_MODIFIED(desc, G_RA(op)); + if (op & M_RC) + CR_MODIFIED(desc, 0); + return true; } return false; |