#ifndef PPC_DEFS_H
#define PPC_DEFS_H

/* Enumerate all supported PowerPC instructions. */
enum PPCInstr : int {
    illegal = 0,
    addi,
    adde,
    addze,
    andidot,
    lwz,
    lwzu,
    lbz,
    lhz,
    rlwinmx,
    srawidot,
    bc,
    bdnz,
    bdz,
    bclr,
    mtspr,
    bexit, // arificial block exit opcode

    twi,
    mulli,
    subfic,
    cmpli,
    cmpi,
    addic,
    addicdot,
    addis,
    sc,
    rlwimix,
    rlwnmx,
    ori,
    oris,
    xori,
    xoris,
    andisdot,
    lbzu,
    stw,
    stwu,
    stb,
    stbu,
    lhzu,
    lha,
    lhau,
    sth,
    sthu,
    lmw,
    stmw,
    lfs,
    lfsu,
    lfd,
    lfdu,
    stfs,
    stfsu,
    stfd,
    stfdu,
    bcl,
    bca,
    bcla,
    b,
    bl,
    ba,
    bla,
    bclrl,
    crnor,
    rfi,
    crandc,
    isync,
    crxor,
    crnand,
    crand,
    creqv,
    crorc,
    cror,
    bcctr,
    bcctrl,
    cmp,
    tw,
    subfc,
    subfcdot,
    addc,
    addcdot,
    mulhwu,
    mulhwudot,
    mfcr,
    lwarx,
    lwzx,
    slw,
    slwdot,
    cntlzw,
    cntlzwdot,
    ppc_and,
    anddot,
    cmpl,
    subf,
    subfdot,
    dcbst,
    lwzux,
    andc,
    andcdot,
    mulhw,
    mulhwdot,
    mfmsr,
    dcbf,
    lbzx,
    neg,
    negdot,
    mul,
    muldot,
    lbzux,
    nor,
    nordot,
    subfe,
    subfedot,
    addedot,
    mtcrf,
    mtmsr,
    stwcx,
    stwx,
    stwux,
    subfze,
    subfzedot,
    addzedot,
    mtsr,
    stbx,
    subfme,
    subfmedot,
    addme,
    addmedot,
    mullw,
    mullwdot,
    mtsrin,
    dcbtst,
    stbux,
    add,
    adddot,
    lscbx,
    lscbxdot,
    dcbt,
    lhzx,
    eqv,
    eqvdot,
    tlbie,
    lhzux,
    ppc_xor,
    xordot,
    ppc_div,
    divdot,
    mfspr,
    lhax,
    ppc_abs,
    absdot,
    divs,
    divsdot,
    tlbia,
    mftb,
    lhaux,
    sthx,
    orc,
    orcdot,
    sthux,
    ppc_or,
    ordot,
    divwu,
    divwudot,
    dcbi,
    nand,
    nanddot,
    divw,
    divwdot,
    mcrxr,
    subfco,
    subfcodot,
    addco,
    addcodot,
    lswx,
    lwbrx,
    lfsx,
    srw,
    srwdot,
    subfo,
    subfodot,
    tlbsync,
    lfsux,
    mfsr,
    lswi,
    ppc_sync,
    lfdx,
    nego,
    negodot,
    mulo,
    mulodot,
    lfdux,
    subfeo,
    subfeodot,
    addeo,
    addeodot,
    mfsrin,
    stswx,
    stwbrx,
    stfsx,
    stfsux,
    subfzeo,
    subfzeodot,
    addzeo,
    addzeodot,
    stswi,
    stfdx,
    subfmeo,
    subfmeodot,
    addmeo,
    addmeodot,
    mullwo,
    mullwodot,
    stfdux,
    addo,
    addodot,
    lhbrx,
    sraw,
    srawdot,
    srawi,
    eieio,
    sthbrx,
    extsh,
    extshdot,
    extsb,
    extsbdot,
    divwuo,
    divwuodot,
    tlbld,
    icbi,
    stfiwx,
    divwo,
    divwodot,
    tlbli,
    dcbz,

    // POWER-specific
    dozi,
    rlmi,
    maskg,
    maskgdot,
    slq,
    slqdot,
    sle,
    sledot,
    sliq,
    sllq,
    sllqdot,
    sleq,
    sleqdot,
    slliq,
    slliqdot,
    doz,
    dozdot,
    nabs,
    nabsdot,
    clcs,
    clcsdot,
    rrib,
    rribdot,
    maskir,
    maskirdot,
    srq,
    srqdot,
    sre,
    sredot,
    sriq,
    sriqdot,
    srlq,
    srlqdot,
    sreq,
    sreqdot,
    srliq,
    srliqdot,
    dozo,
    dozodot,
    divo,
    divodot,
    abso,
    absodot,
    divso,
    divsodot,
    sraq,
    sraqdot,
    srea,
    sreadot,
    sraiq,
    sraiqdot,
    nabso,
    nabsodot,
};

#endif /* PPC_DEFS_H */
