//===-- PPCSchedule.td - PowerPC Scheduling Definitions ----*- tablegen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// Instruction Itinerary classes used for PowerPC
//
def IIC_IntSimple    : InstrItinClass;
def IIC_IntGeneral   : InstrItinClass;
def IIC_IntCompare   : InstrItinClass;
def IIC_IntDivD      : InstrItinClass;
def IIC_IntDivW      : InstrItinClass;
def IIC_IntMFFS      : InstrItinClass;
def IIC_IntMFVSCR    : InstrItinClass;
def IIC_IntMTFSB0    : InstrItinClass;
def IIC_IntMTSRD     : InstrItinClass;
def IIC_IntMulHD     : InstrItinClass;
def IIC_IntMulHW     : InstrItinClass;
def IIC_IntMulHWU    : InstrItinClass;
def IIC_IntMulLI     : InstrItinClass;
def IIC_IntRFID      : InstrItinClass;
def IIC_IntRotateD   : InstrItinClass;
def IIC_IntRotateDI  : InstrItinClass;
def IIC_IntRotate    : InstrItinClass;
def IIC_IntShift     : InstrItinClass;
def IIC_IntTrapD     : InstrItinClass;
def IIC_IntTrapW     : InstrItinClass;
def IIC_BrB          : InstrItinClass;
def IIC_BrCR         : InstrItinClass;
def IIC_BrMCR        : InstrItinClass;
def IIC_BrMCRX       : InstrItinClass;
def IIC_LdStDCBA     : InstrItinClass;
def IIC_LdStDCBF     : InstrItinClass;
def IIC_LdStDCBI     : InstrItinClass;
def IIC_LdStLoad     : InstrItinClass;
def IIC_LdStLoadUpd  : InstrItinClass;
def IIC_LdStLoadUpdX : InstrItinClass;
def IIC_LdStStore    : InstrItinClass;
def IIC_LdStStoreUpd : InstrItinClass;
def IIC_LdStDSS      : InstrItinClass;
def IIC_LdStICBI     : InstrItinClass;
def IIC_LdStLD       : InstrItinClass;
def IIC_LdStLDU      : InstrItinClass;
def IIC_LdStLDUX     : InstrItinClass;
def IIC_LdStLDARX    : InstrItinClass;
def IIC_LdStLFD      : InstrItinClass;
def IIC_LdStLFDU     : InstrItinClass;
def IIC_LdStLFDUX    : InstrItinClass;
def IIC_LdStLHA      : InstrItinClass;
def IIC_LdStLHAU     : InstrItinClass;
def IIC_LdStLHAUX    : InstrItinClass;
def IIC_LdStLMW      : InstrItinClass;
def IIC_LdStLVecX    : InstrItinClass;
def IIC_LdStLWA      : InstrItinClass;
def IIC_LdStLWARX    : InstrItinClass;
def IIC_LdStSLBIA    : InstrItinClass;
def IIC_LdStSLBIE    : InstrItinClass;
def IIC_LdStSTD      : InstrItinClass;
def IIC_LdStSTDCX    : InstrItinClass;
def IIC_LdStSTDU     : InstrItinClass;
def IIC_LdStSTDUX    : InstrItinClass;
def IIC_LdStSTFD     : InstrItinClass;
def IIC_LdStSTFDU    : InstrItinClass;
def IIC_LdStSTVEBX   : InstrItinClass;
def IIC_LdStSTWCX    : InstrItinClass;
def IIC_LdStSync     : InstrItinClass;
def IIC_SprISYNC     : InstrItinClass;
def IIC_SprMFSR      : InstrItinClass;
def IIC_SprMTMSR     : InstrItinClass;
def IIC_SprMTSR      : InstrItinClass;
def IIC_SprTLBSYNC   : InstrItinClass;
def IIC_SprMFCR      : InstrItinClass;
def IIC_SprMFCRF     : InstrItinClass;
def IIC_SprMFMSR     : InstrItinClass;
def IIC_SprMFSPR     : InstrItinClass;
def IIC_SprMFTB      : InstrItinClass;
def IIC_SprMTSPR     : InstrItinClass;
def IIC_SprMTSRIN    : InstrItinClass;
def IIC_SprRFI       : InstrItinClass;
def IIC_SprSC        : InstrItinClass;
def IIC_FPGeneral    : InstrItinClass;
def IIC_FPAddSub     : InstrItinClass;
def IIC_FPCompare    : InstrItinClass;
def IIC_FPDivD       : InstrItinClass;
def IIC_FPDivS       : InstrItinClass;
def IIC_FPFused      : InstrItinClass;
def IIC_FPRes        : InstrItinClass;
def IIC_FPSqrtD      : InstrItinClass;
def IIC_FPSqrtS      : InstrItinClass;
def IIC_VecGeneral   : InstrItinClass;
def IIC_VecFP        : InstrItinClass;
def IIC_VecFPCompare : InstrItinClass;
def IIC_VecComplex   : InstrItinClass;
def IIC_VecPerm      : InstrItinClass;
def IIC_VecFPRound   : InstrItinClass;
def IIC_VecVSL       : InstrItinClass;
def IIC_VecVSR       : InstrItinClass;
def IIC_SprMTMSRD    : InstrItinClass;
def IIC_SprSLIE      : InstrItinClass;
def IIC_SprSLBIE     : InstrItinClass;
def IIC_SprSLBMTE    : InstrItinClass;
def IIC_SprSLBMFEE   : InstrItinClass;
def IIC_SprSLBIA     : InstrItinClass;
def IIC_SprTLBIEL    : InstrItinClass;
def IIC_SprTLBIE     : InstrItinClass;

//===----------------------------------------------------------------------===//
// Processor instruction itineraries.

include "PPCScheduleG3.td"
include "PPCSchedule440.td"
include "PPCScheduleG4.td"
include "PPCScheduleG4Plus.td"
include "PPCScheduleG5.td"
include "PPCScheduleP7.td"
include "PPCScheduleA2.td"
include "PPCScheduleE500mc.td"
include "PPCScheduleE5500.td"

//===----------------------------------------------------------------------===//
// Instruction to itinerary class map - When add new opcodes to the supported
// set, refer to the following table to determine which itinerary class the
// opcode belongs.
//
//    opcode     itinerary class
//    ======     ===============
//    add        IIC_IntSimple
//    addc       IIC_IntGeneral
//    adde       IIC_IntGeneral
//    addi       IIC_IntSimple
//    addic      IIC_IntGeneral
//    addic.     IIC_IntGeneral
//    addis      IIC_IntSimple
//    addme      IIC_IntGeneral
//    addze      IIC_IntGeneral
//    and        IIC_IntSimple
//    andc       IIC_IntSimple
//    andi.      IIC_IntGeneral
//    andis.     IIC_IntGeneral
//    b          IIC_BrB
//    bc         IIC_BrB
//    bcctr      IIC_BrB
//    bclr       IIC_BrB
//    cmp        IIC_IntCompare
//    cmpi       IIC_IntCompare
//    cmpl       IIC_IntCompare
//    cmpli      IIC_IntCompare
//    cntlzd     IIC_IntRotateD
//    cntlzw     IIC_IntGeneral
//    crand      IIC_BrCR
//    crandc     IIC_BrCR
//    creqv      IIC_BrCR
//    crnand     IIC_BrCR
//    crnor      IIC_BrCR
//    cror       IIC_BrCR
//    crorc      IIC_BrCR
//    crxor      IIC_BrCR
//    dcba       IIC_LdStDCBA
//    dcbf       IIC_LdStDCBF
//    dcbi       IIC_LdStDCBI
//    dcbst      IIC_LdStDCBF
//    dcbt       IIC_LdStLoad
//    dcbtst     IIC_LdStLoad
//    dcbz       IIC_LdStDCBF
//    divd       IIC_IntDivD
//    divdu      IIC_IntDivD
//    divw       IIC_IntDivW
//    divwu      IIC_IntDivW
//    dss        IIC_LdStDSS
//    dst        IIC_LdStDSS
//    dstst      IIC_LdStDSS
//    eciwx      IIC_LdStLoad
//    ecowx      IIC_LdStLoad
//    eieio      IIC_LdStLoad
//    eqv        IIC_IntSimple
//    extsb      IIC_IntSimple
//    extsh      IIC_IntSimple
//    extsw      IIC_IntSimple
//    fabs       IIC_FPGeneral
//    fadd       IIC_FPAddSub
//    fadds      IIC_FPGeneral
//    fcfid      IIC_FPGeneral
//    fcmpo      IIC_FPCompare
//    fcmpu      IIC_FPCompare
//    fctid      IIC_FPGeneral
//    fctidz     IIC_FPGeneral
//    fctiw      IIC_FPGeneral
//    fctiwz     IIC_FPGeneral
//    fdiv       IIC_FPDivD
//    fdivs      IIC_FPDivS
//    fmadd      IIC_FPFused
//    fmadds     IIC_FPGeneral
//    fmr        IIC_FPGeneral
//    fmsub      IIC_FPFused
//    fmsubs     IIC_FPGeneral
//    fmul       IIC_FPFused
//    fmuls      IIC_FPGeneral
//    fnabs      IIC_FPGeneral
//    fneg       IIC_FPGeneral
//    fnmadd     IIC_FPFused
//    fnmadds    IIC_FPGeneral
//    fnmsub     IIC_FPFused
//    fnmsubs    IIC_FPGeneral
//    fres       IIC_FPRes
//    frsp       IIC_FPGeneral
//    frsqrte    IIC_FPGeneral
//    fsel       IIC_FPGeneral
//    fsqrt      IIC_FPSqrtD
//    fsqrts     IIC_FPSqrtS
//    fsub       IIC_FPAddSub
//    fsubs      IIC_FPGeneral
//    icbi       IIC_LdStICBI
//    isync      IIC_SprISYNC
//    lbz        IIC_LdStLoad
//    lbzu       IIC_LdStLoadUpd
//    lbzux      IIC_LdStLoadUpdX
//    lbzx       IIC_LdStLoad
//    ld         IIC_LdStLD
//    ldarx      IIC_LdStLDARX
//    ldu        IIC_LdStLDU
//    ldux       IIC_LdStLDUX
//    ldx        IIC_LdStLD
//    lfd        IIC_LdStLFD
//    lfdu       IIC_LdStLFDU
//    lfdux      IIC_LdStLFDUX
//    lfdx       IIC_LdStLFD
//    lfs        IIC_LdStLFD
//    lfsu       IIC_LdStLFDU
//    lfsux      IIC_LdStLFDUX
//    lfsx       IIC_LdStLFD
//    lha        IIC_LdStLHA
//    lhau       IIC_LdStLHAU
//    lhaux      IIC_LdStLHAUX
//    lhax       IIC_LdStLHA
//    lhbrx      IIC_LdStLoad
//    lhz        IIC_LdStLoad
//    lhzu       IIC_LdStLoadUpd
//    lhzux      IIC_LdStLoadUpdX
//    lhzx       IIC_LdStLoad
//    lmw        IIC_LdStLMW
//    lswi       IIC_LdStLMW
//    lswx       IIC_LdStLMW
//    lvebx      IIC_LdStLVecX
//    lvehx      IIC_LdStLVecX
//    lvewx      IIC_LdStLVecX
//    lvsl       IIC_LdStLVecX
//    lvsr       IIC_LdStLVecX
//    lvx        IIC_LdStLVecX
//    lvxl       IIC_LdStLVecX
//    lwa        IIC_LdStLWA
//    lwarx      IIC_LdStLWARX
//    lwaux      IIC_LdStLHAUX
//    lwax       IIC_LdStLHA
//    lwbrx      IIC_LdStLoad
//    lwz        IIC_LdStLoad
//    lwzu       IIC_LdStLoadUpd
//    lwzux      IIC_LdStLoadUpdX
//    lwzx       IIC_LdStLoad
//    mcrf       IIC_BrMCR
//    mcrfs      IIC_FPGeneral
//    mcrxr      IIC_BrMCRX
//    mfcr       IIC_SprMFCR
//    mffs       IIC_IntMFFS
//    mfmsr      IIC_SprMFMSR
//    mfspr      IIC_SprMFSPR
//    mfsr       IIC_SprMFSR
//    mfsrin     IIC_SprMFSR
//    mftb       IIC_SprMFTB
//    mfvscr     IIC_IntMFVSCR
//    mtcrf      IIC_BrMCRX
//    mtfsb0     IIC_IntMTFSB0
//    mtfsb1     IIC_IntMTFSB0
//    mtfsf      IIC_IntMTFSB0
//    mtfsfi     IIC_IntMTFSB0
//    mtmsr      IIC_SprMTMSR
//    mtmsrd     IIC_LdStLD
//    mtspr      IIC_SprMTSPR
//    mtsr       IIC_SprMTSR
//    mtsrd      IIC_IntMTSRD
//    mtsrdin    IIC_IntMTSRD
//    mtsrin     IIC_SprMTSRIN
//    mtvscr     IIC_IntMFVSCR
//    mulhd      IIC_IntMulHD
//    mulhdu     IIC_IntMulHD
//    mulhw      IIC_IntMulHW
//    mulhwu     IIC_IntMulHWU
//    mulld      IIC_IntMulHD
//    mulli      IIC_IntMulLI
//    mullw      IIC_IntMulHW
//    nand       IIC_IntSimple
//    neg        IIC_IntSimple
//    nor        IIC_IntSimple
//    or         IIC_IntSimple
//    orc        IIC_IntSimple
//    ori        IIC_IntSimple
//    oris       IIC_IntSimple
//    rfi        IIC_SprRFI
//    rfid       IIC_IntRFID
//    rldcl      IIC_IntRotateD
//    rldcr      IIC_IntRotateD
//    rldic      IIC_IntRotateDI
//    rldicl     IIC_IntRotateDI
//    rldicr     IIC_IntRotateDI
//    rldimi     IIC_IntRotateDI
//    rlwimi     IIC_IntRotate
//    rlwinm     IIC_IntGeneral
//    rlwnm      IIC_IntGeneral
//    sc         IIC_SprSC
//    slbia      IIC_LdStSLBIA
//    slbie      IIC_LdStSLBIE
//    sld        IIC_IntRotateD
//    slw        IIC_IntGeneral
//    srad       IIC_IntRotateD
//    sradi      IIC_IntRotateDI
//    sraw       IIC_IntShift
//    srawi      IIC_IntShift
//    srd        IIC_IntRotateD
//    srw        IIC_IntGeneral
//    stb        IIC_LdStStore
//    stbu       IIC_LdStStoreUpd
//    stbux      IIC_LdStStoreUpd
//    stbx       IIC_LdStStore
//    std        IIC_LdStSTD
//    stdcx.     IIC_LdStSTDCX
//    stdu       IIC_LdStSTDU
//    stdux      IIC_LdStSTDUX
//    stdx       IIC_LdStSTD
//    stfd       IIC_LdStSTFD
//    stfdu      IIC_LdStSTFDU
//    stfdux     IIC_LdStSTFDU
//    stfdx      IIC_LdStSTFD
//    stfiwx     IIC_LdStSTFD
//    stfs       IIC_LdStSTFD
//    stfsu      IIC_LdStSTFDU
//    stfsux     IIC_LdStSTFDU
//    stfsx      IIC_LdStSTFD
//    sth        IIC_LdStStore
//    sthbrx     IIC_LdStStore
//    sthu       IIC_LdStStoreUpd
//    sthux      IIC_LdStStoreUpd
//    sthx       IIC_LdStStore
//    stmw       IIC_LdStLMW
//    stswi      IIC_LdStLMW
//    stswx      IIC_LdStLMW
//    stvebx     IIC_LdStSTVEBX
//    stvehx     IIC_LdStSTVEBX
//    stvewx     IIC_LdStSTVEBX
//    stvx       IIC_LdStSTVEBX
//    stvxl      IIC_LdStSTVEBX
//    stw        IIC_LdStStore
//    stwbrx     IIC_LdStStore
//    stwcx.     IIC_LdStSTWCX
//    stwu       IIC_LdStStoreUpd
//    stwux      IIC_LdStStoreUpd
//    stwx       IIC_LdStStore
//    subf       IIC_IntGeneral
//    subfc      IIC_IntGeneral
//    subfe      IIC_IntGeneral
//    subfic     IIC_IntGeneral
//    subfme     IIC_IntGeneral
//    subfze     IIC_IntGeneral
//    sync       IIC_LdStSync
//    td         IIC_IntTrapD
//    tdi        IIC_IntTrapD
//    tlbia      IIC_LdStSLBIA
//    tlbie      IIC_LdStDCBF
//    tlbsync    IIC_SprTLBSYNC
//    tw         IIC_IntTrapW
//    twi        IIC_IntTrapW
//    vaddcuw    IIC_VecGeneral
//    vaddfp     IIC_VecFP
//    vaddsbs    IIC_VecGeneral
//    vaddshs    IIC_VecGeneral
//    vaddsws    IIC_VecGeneral
//    vaddubm    IIC_VecGeneral
//    vaddubs    IIC_VecGeneral
//    vadduhm    IIC_VecGeneral
//    vadduhs    IIC_VecGeneral
//    vadduwm    IIC_VecGeneral
//    vadduws    IIC_VecGeneral
//    vand       IIC_VecGeneral
//    vandc      IIC_VecGeneral
//    vavgsb     IIC_VecGeneral
//    vavgsh     IIC_VecGeneral
//    vavgsw     IIC_VecGeneral
//    vavgub     IIC_VecGeneral
//    vavguh     IIC_VecGeneral
//    vavguw     IIC_VecGeneral
//    vcfsx      IIC_VecFP
//    vcfux      IIC_VecFP
//    vcmpbfp    IIC_VecFPCompare
//    vcmpeqfp   IIC_VecFPCompare
//    vcmpequb   IIC_VecGeneral
//    vcmpequh   IIC_VecGeneral
//    vcmpequw   IIC_VecGeneral
//    vcmpgefp   IIC_VecFPCompare
//    vcmpgtfp   IIC_VecFPCompare
//    vcmpgtsb   IIC_VecGeneral
//    vcmpgtsh   IIC_VecGeneral
//    vcmpgtsw   IIC_VecGeneral
//    vcmpgtub   IIC_VecGeneral
//    vcmpgtuh   IIC_VecGeneral
//    vcmpgtuw   IIC_VecGeneral
//    vctsxs     IIC_VecFP
//    vctuxs     IIC_VecFP
//    vexptefp   IIC_VecFP
//    vlogefp    IIC_VecFP
//    vmaddfp    IIC_VecFP
//    vmaxfp     IIC_VecFPCompare
//    vmaxsb     IIC_VecGeneral
//    vmaxsh     IIC_VecGeneral
//    vmaxsw     IIC_VecGeneral
//    vmaxub     IIC_VecGeneral
//    vmaxuh     IIC_VecGeneral
//    vmaxuw     IIC_VecGeneral
//    vmhaddshs  IIC_VecComplex
//    vmhraddshs IIC_VecComplex
//    vminfp     IIC_VecFPCompare
//    vminsb     IIC_VecGeneral
//    vminsh     IIC_VecGeneral
//    vminsw     IIC_VecGeneral
//    vminub     IIC_VecGeneral
//    vminuh     IIC_VecGeneral
//    vminuw     IIC_VecGeneral
//    vmladduhm  IIC_VecComplex
//    vmrghb     IIC_VecPerm
//    vmrghh     IIC_VecPerm
//    vmrghw     IIC_VecPerm
//    vmrglb     IIC_VecPerm
//    vmrglh     IIC_VecPerm
//    vmrglw     IIC_VecPerm
//    vmsubfp    IIC_VecFP
//    vmsummbm   IIC_VecComplex
//    vmsumshm   IIC_VecComplex
//    vmsumshs   IIC_VecComplex
//    vmsumubm   IIC_VecComplex
//    vmsumuhm   IIC_VecComplex
//    vmsumuhs   IIC_VecComplex
//    vmulesb    IIC_VecComplex
//    vmulesh    IIC_VecComplex
//    vmuleub    IIC_VecComplex
//    vmuleuh    IIC_VecComplex
//    vmulosb    IIC_VecComplex
//    vmulosh    IIC_VecComplex
//    vmuloub    IIC_VecComplex
//    vmulouh    IIC_VecComplex
//    vnor       IIC_VecGeneral
//    vor        IIC_VecGeneral
//    vperm      IIC_VecPerm
//    vpkpx      IIC_VecPerm
//    vpkshss    IIC_VecPerm
//    vpkshus    IIC_VecPerm
//    vpkswss    IIC_VecPerm
//    vpkswus    IIC_VecPerm
//    vpkuhum    IIC_VecPerm
//    vpkuhus    IIC_VecPerm
//    vpkuwum    IIC_VecPerm
//    vpkuwus    IIC_VecPerm
//    vrefp      IIC_VecFPRound
//    vrfim      IIC_VecFPRound
//    vrfin      IIC_VecFPRound
//    vrfip      IIC_VecFPRound
//    vrfiz      IIC_VecFPRound
//    vrlb       IIC_VecGeneral
//    vrlh       IIC_VecGeneral
//    vrlw       IIC_VecGeneral
//    vrsqrtefp  IIC_VecFP
//    vsel       IIC_VecGeneral
//    vsl        IIC_VecVSL
//    vslb       IIC_VecGeneral
//    vsldoi     IIC_VecPerm
//    vslh       IIC_VecGeneral
//    vslo       IIC_VecPerm
//    vslw       IIC_VecGeneral
//    vspltb     IIC_VecPerm
//    vsplth     IIC_VecPerm
//    vspltisb   IIC_VecPerm
//    vspltish   IIC_VecPerm
//    vspltisw   IIC_VecPerm
//    vspltw     IIC_VecPerm
//    vsr        IIC_VecVSR
//    vsrab      IIC_VecGeneral
//    vsrah      IIC_VecGeneral
//    vsraw      IIC_VecGeneral
//    vsrb       IIC_VecGeneral
//    vsrh       IIC_VecGeneral
//    vsro       IIC_VecPerm
//    vsrw       IIC_VecGeneral
//    vsubcuw    IIC_VecGeneral
//    vsubfp     IIC_VecFP
//    vsubsbs    IIC_VecGeneral
//    vsubshs    IIC_VecGeneral
//    vsubsws    IIC_VecGeneral
//    vsububm    IIC_VecGeneral
//    vsububs    IIC_VecGeneral
//    vsubuhm    IIC_VecGeneral
//    vsubuhs    IIC_VecGeneral
//    vsubuwm    IIC_VecGeneral
//    vsubuws    IIC_VecGeneral
//    vsum2sws   IIC_VecComplex
//    vsum4sbs   IIC_VecComplex
//    vsum4shs   IIC_VecComplex
//    vsum4ubs   IIC_VecComplex
//    vsumsws    IIC_VecComplex
//    vupkhpx    IIC_VecPerm
//    vupkhsb    IIC_VecPerm
//    vupkhsh    IIC_VecPerm
//    vupklpx    IIC_VecPerm
//    vupklsb    IIC_VecPerm
//    vupklsh    IIC_VecPerm
//    vxor       IIC_VecGeneral
//    xor        IIC_IntSimple
//    xori       IIC_IntSimple
//    xoris      IIC_IntSimple
//