#include "compiler/Scheduler.h" #include "compiler/PCode.h" #include "compiler/PCodeInfo.h" // https://stuff.mit.edu/afs/sipb/contrib/doc/specs/ic/cpu/powerpc/mpc601.pdf // https://www.nxp.com/docs/en/user-guide/MPC601UMAD.pdf typedef enum Stage { IU, // Integer Unit FD, // FP Decode FPM, // FP Multiply FPA, // FP Add FWA, // FP Arithmetic Writeback BPU, // Branch Processing Unit NumStages, Serialize, // special form for instructions that use IU but are serialised Unsupported // instructions not supported by this processor } Stage; static struct { // the instruction currently in this pipeline stage PCode *instr; // how many cycles are left for this instruction to finish int remaining; } pipeline[NumStages]; static struct { // the initial stage for this instruction Stage stage; // the total amount of cycles required by this instruction char latency; // how long it takes to finish each stage char cycles[4]; } instruction_timing[OPCODE_MAX] = { BPU, 0, 0, 0, 0, 1, // PC_B BPU, 0, 0, 0, 0, 1, // PC_BL BPU, 0, 0, 0, 0, 1, // PC_BC BPU, 0, 0, 0, 0, 1, // PC_BCLR BPU, 0, 0, 0, 0, 1, // PC_BCCTR BPU, 0, 0, 0, 0, 1, // PC_BT BPU, 0, 0, 0, 0, 1, // PC_BTLR BPU, 0, 0, 0, 0, 1, // PC_BTCTR BPU, 0, 0, 0, 0, 1, // PC_BF BPU, 0, 0, 0, 0, 1, // PC_BFLR BPU, 0, 0, 0, 0, 1, // PC_BFCTR BPU, 0, 0, 0, 0, 1, // PC_BDNZ BPU, 0, 0, 0, 0, 1, // PC_BDNZT BPU, 0, 0, 0, 0, 1, // PC_BDNZF BPU, 0, 0, 0, 0, 1, // PC_BDZ BPU, 0, 0, 0, 0, 1, // PC_BDZT BPU, 0, 0, 0, 0, 1, // PC_BDZF BPU, 0, 0, 0, 0, 1, // PC_BLR BPU, 0, 0, 0, 0, 1, // PC_BCTR BPU, 0, 0, 0, 0, 1, // PC_BCTRL BPU, 0, 0, 0, 0, 1, // PC_BLRL IU, 2, 1, 0, 0, 0, // PC_LBZ IU, 2, 1, 0, 0, 0, // PC_LBZU IU, 2, 1, 0, 0, 0, // PC_LBZX IU, 2, 1, 0, 0, 0, // PC_LBZUX IU, 2, 1, 0, 0, 0, // PC_LHZ IU, 2, 1, 0, 0, 0, // PC_LHZU IU, 2, 1, 0, 0, 0, // PC_LHZX IU, 2, 1, 0, 0, 0, // PC_LHZUX IU, 2, 1, 0, 0, 0, // PC_LHA IU, 2, 1, 0, 0, 0, // PC_LHAU IU, 2, 1, 0, 0, 0, // PC_LHAX IU, 2, 1, 0, 0, 0, // PC_LHAUX IU, 2, 1, 0, 0, 0, // PC_LHBRX IU, 2, 1, 0, 0, 0, // PC_LWZ IU, 2, 1, 0, 0, 0, // PC_LWZU IU, 2, 1, 0, 0, 0, // PC_LWZX IU, 2, 1, 0, 0, 0, // PC_LWZUX IU, 2, 1, 0, 0, 0, // PC_LWBRX IU, 1, 1, 0, 0, 0, // PC_LMW IU, 1, 1, 0, 0, 0, // PC_STB IU, 1, 1, 0, 0, 0, // PC_STBU IU, 1, 1, 0, 0, 0, // PC_STBX IU, 1, 1, 0, 0, 0, // PC_STBUX IU, 1, 1, 0, 0, 0, // PC_STH IU, 1, 1, 0, 0, 0, // PC_STHU IU, 1, 1, 0, 0, 0, // PC_STHX IU, 1, 1, 0, 0, 0, // PC_STHUX IU, 1, 1, 0, 0, 0, // PC_STHBRX IU, 1, 1, 0, 0, 0, // PC_STW IU, 1, 1, 0, 0, 0, // PC_STWU IU, 1, 1, 0, 0, 0, // PC_STWX IU, 1, 1, 0, 0, 0, // PC_STWUX IU, 1, 1, 0, 0, 0, // PC_STWBRX IU, 1, 1, 0, 0, 0, // PC_STMW IU, 2, 1, 0, 0, 0, // PC_DCBF IU, 2, 1, 0, 0, 0, // PC_DCBST IU, 2, 1, 0, 0, 0, // PC_DCBT IU, 2, 1, 0, 0, 0, // PC_DCBTST IU, 2, 1, 0, 0, 0, // PC_DCBZ IU, 1, 1, 0, 0, 0, // PC_ADD IU, 1, 1, 0, 0, 0, // PC_ADDC IU, 1, 1, 0, 0, 0, // PC_ADDE IU, 1, 1, 0, 0, 0, // PC_ADDI IU, 1, 1, 0, 0, 0, // PC_ADDIC IU, 1, 1, 0, 0, 0, // PC_ADDICR IU, 1, 1, 0, 0, 0, // PC_ADDIS IU, 1, 1, 0, 0, 0, // PC_ADDME IU, 1, 1, 0, 0, 0, // PC_ADDZE IU, 36, 36, 0, 0, 0, // PC_DIVW IU, 36, 36, 0, 0, 0, // PC_DIVWU IU, 5, 5, 0, 0, 0, // PC_MULHW IU, 5, 5, 0, 0, 0, // PC_MULHWU IU, 5, 5, 0, 0, 0, // PC_MULLI IU, 5, 5, 0, 0, 0, // PC_MULLW IU, 1, 1, 0, 0, 0, // PC_NEG IU, 1, 1, 0, 0, 0, // PC_SUBF IU, 1, 1, 0, 0, 0, // PC_SUBFC IU, 1, 1, 0, 0, 0, // PC_SUBFE IU, 1, 1, 0, 0, 0, // PC_SUBFIC IU, 1, 1, 0, 0, 0, // PC_SUBFME IU, 1, 1, 0, 0, 0, // PC_SUBFZE IU, 3, 1, 0, 0, 0, // PC_CMPI IU, 3, 1, 0, 0, 0, // PC_CMP IU, 3, 1, 0, 0, 0, // PC_CMPLI IU, 3, 1, 0, 0, 0, // PC_CMPL IU, 1, 1, 0, 0, 0, // PC_ANDI IU, 1, 1, 0, 0, 0, // PC_ANDIS IU, 1, 1, 0, 0, 0, // PC_ORI IU, 1, 1, 0, 0, 0, // PC_ORIS IU, 1, 1, 0, 0, 0, // PC_XORI IU, 1, 1, 0, 0, 0, // PC_XORIS IU, 1, 1, 0, 0, 0, // PC_AND IU, 1, 1, 0, 0, 0, // PC_OR IU, 1, 1, 0, 0, 0, // PC_XOR IU, 1, 1, 0, 0, 0, // PC_NAND IU, 1, 1, 0, 0, 0, // PC_NOR IU, 1, 1, 0, 0, 0, // PC_EQV IU, 1, 1, 0, 0, 0, // PC_ANDC IU, 1, 1, 0, 0, 0, // PC_ORC IU, 1, 1, 0, 0, 0, // PC_EXTSB IU, 1, 1, 0, 0, 0, // PC_EXTSH IU, 1, 1, 0, 0, 0, // PC_CNTLZW IU, 1, 1, 0, 0, 0, // PC_RLWINM IU, 1, 1, 0, 0, 0, // PC_RLWNM IU, 1, 1, 0, 0, 0, // PC_RLWIMI IU, 1, 1, 0, 0, 0, // PC_SLW IU, 1, 1, 0, 0, 0, // PC_SRW IU, 1, 1, 0, 0, 0, // PC_SRAWI IU, 1, 1, 0, 0, 0, // PC_SRAW IU, 1, 1, 0, 0, 0, // PC_CRAND IU, 1, 1, 0, 0, 0, // PC_CRANDC IU, 1, 1, 0, 0, 0, // PC_CREQV IU, 1, 1, 0, 0, 0, // PC_CRNAND IU, 1, 1, 0, 0, 0, // PC_CRNOR IU, 1, 1, 0, 0, 0, // PC_CROR IU, 1, 1, 0, 0, 0, // PC_CRORC IU, 1, 1, 0, 0, 0, // PC_CRXOR IU, 1, 1, 0, 0, 0, // PC_MCRF IU, 4, 1, 0, 0, 0, // PC_MTXER IU, 4, 1, 0, 0, 0, // PC_MTCTR IU, 4, 1, 0, 0, 0, // PC_MTLR IU, 2, 1, 0, 0, 0, // PC_MTCRF IU, 1, 0, 0, 0, 0, // PC_MTMSR IU, 1, 0, 0, 0, 0, // PC_MTSPR IU, 1, 0, 0, 0, 0, // PC_MFMSR IU, 1, 0, 0, 0, 0, // PC_MFSPR IU, 1, 1, 0, 0, 0, // PC_MFXER IU, 1, 1, 0, 0, 0, // PC_MFCTR IU, 1, 1, 0, 0, 0, // PC_MFLR IU, 1, 1, 0, 0, 0, // PC_MFCR FD, 4, 1, 1, 1, 1, // PC_MFFS FD, 4, 1, 1, 1, 1, // PC_MTFSF Serialize, 1, 1, 0, 0, 1, // PC_EIEIO Serialize, 1, 1, 0, 0, 1, // PC_ISYNC Serialize, 1, 1, 0, 0, 1, // PC_SYNC Serialize, 0, 0, 0, 0, 1, // PC_RFI IU, 1, 1, 0, 0, 0, // PC_LI IU, 1, 1, 0, 0, 0, // PC_LIS IU, 1, 1, 0, 0, 0, // PC_MR IU, 1, 1, 0, 0, 0, // PC_NOP IU, 1, 1, 0, 0, 0, // PC_NOT IU, 3, 1, 0, 0, 0, // PC_LFS IU, 3, 1, 0, 0, 0, // PC_LFSU IU, 3, 1, 0, 0, 0, // PC_LFSX IU, 3, 1, 0, 0, 0, // PC_LFSUX IU, 3, 1, 0, 0, 0, // PC_LFD IU, 3, 1, 0, 0, 0, // PC_LFDU IU, 3, 1, 0, 0, 0, // PC_LFDX IU, 3, 1, 0, 0, 0, // PC_LFDUX IU, 1, 1, 0, 0, 0, // PC_STFS IU, 1, 1, 0, 0, 0, // PC_STFSU IU, 1, 1, 0, 0, 0, // PC_STFSX IU, 1, 1, 0, 0, 0, // PC_STFSUX IU, 1, 1, 0, 0, 0, // PC_STFD IU, 1, 1, 0, 0, 0, // PC_STFDU IU, 1, 1, 0, 0, 0, // PC_STFDX IU, 1, 1, 0, 0, 0, // PC_STFDUX FD, 4, 1, 1, 1, 1, // PC_FMR FD, 4, 1, 1, 1, 1, // PC_FABS FD, 4, 1, 1, 1, 1, // PC_FNEG FD, 4, 1, 1, 1, 1, // PC_FNABS FD, 4, 1, 1, 1, 1, // PC_FADD FD, 4, 1, 1, 1, 1, // PC_FADDS FD, 4, 1, 1, 1, 1, // PC_FSUB FD, 4, 1, 1, 1, 1, // PC_FSUBS FD, 5, 1, 1, 2, 1, // PC_FMUL FD, 4, 1, 1, 1, 1, // PC_FMULS FD, 31, 1, 1, 28, 1, // PC_FDIV FD, 17, 1, 1, 14, 1, // PC_FDIVS FD, 5, 1, 1, 2, 1, // PC_FMADD FD, 4, 1, 1, 1, 1, // PC_FMADDS FD, 5, 1, 1, 2, 1, // PC_FMSUB FD, 4, 1, 1, 1, 1, // PC_FMSUBS FD, 5, 1, 1, 2, 1, // PC_FNMADD FD, 4, 1, 1, 1, 1, // PC_FNMADDS FD, 5, 1, 1, 2, 1, // PC_FNMSUB FD, 4, 1, 1, 1, 1, // PC_FNMSUBS FD, 4, 1, 1, 1, 1, // PC_FRES FD, 4, 1, 1, 1, 1, // PC_FRSQRTE FD, 4, 1, 1, 1, 1, // PC_FSEL FD, 4, 1, 1, 1, 1, // PC_FRSP FD, 4, 1, 1, 1, 1, // PC_FCTIW FD, 4, 1, 1, 1, 1, // PC_FCTIWZ FD, 6, 1, 1, 1, 1, // PC_FCMPU FD, 6, 1, 1, 1, 1, // PC_FCMPO IU, 0, 0, 0, 0, 0, // PC_LWARX IU, 0, 0, 0, 0, 0, // PC_LSWI IU, 0, 0, 0, 0, 0, // PC_LSWX IU, 0, 0, 0, 0, 0, // PC_STFIWX IU, 0, 0, 0, 0, 0, // PC_STSWI IU, 0, 0, 0, 0, 0, // PC_STSWX IU, 0, 0, 0, 0, 0, // PC_STWCX IU, 0, 0, 0, 0, 0, // PC_ECIWX IU, 0, 0, 0, 0, 0, // PC_ECOWX IU, 0, 0, 0, 0, 0, // PC_DCBI IU, 0, 0, 0, 0, 0, // PC_ICBI IU, 0, 0, 0, 0, 0, // PC_MCRFS IU, 0, 0, 0, 0, 0, // PC_MCRXR IU, 0, 0, 0, 0, 0, // PC_MFTB IU, 0, 0, 0, 0, 0, // PC_MFSR IU, 0, 0, 0, 0, 0, // PC_MTSR IU, 0, 0, 0, 0, 0, // PC_MFSRIN IU, 0, 0, 0, 0, 0, // PC_MTSRIN IU, 0, 0, 0, 0, 0, // PC_MTFSB0 IU, 0, 0, 0, 0, 0, // PC_MTFSB1 IU, 0, 0, 0, 0, 0, // PC_MTFSFI Serialize, 0, 0, 0, 0, 0, // PC_SC IU, 0, 0, 0, 0, 0, // PC_FSQRT IU, 0, 0, 0, 0, 0, // PC_FSQRTS IU, 0, 0, 0, 0, 0, // PC_TLBIA IU, 0, 0, 0, 0, 0, // PC_TLBIE IU, 0, 0, 0, 0, 0, // PC_TLBLD IU, 0, 0, 0, 0, 0, // PC_TLBLI IU, 0, 0, 0, 0, 0, // PC_TLBSYNC Serialize, 0, 0, 0, 0, 0, // PC_TW Serialize, 0, 0, 0, 0, 0, // PC_TRAP Serialize, 0, 0, 0, 0, 0, // PC_TWI Serialize, 0, 0, 0, 0, 0, // PC_OPWORD IU, 0, 0, 0, 0, 0, // PC_MFROM IU, 0, 0, 0, 0, 0, // PC_DSA IU, 0, 0, 0, 0, 0, // PC_ESA IU, 0, 0, 0, 0, 0, // PC_DCCCI IU, 0, 0, 0, 0, 0, // PC_DCREAD IU, 0, 0, 0, 0, 0, // PC_ICBT IU, 0, 0, 0, 0, 0, // PC_ICCCI IU, 0, 0, 0, 0, 0, // PC_ICREAD IU, 0, 0, 0, 0, 0, // PC_RFCI IU, 0, 0, 0, 0, 0, // PC_TLBRE IU, 0, 0, 0, 0, 0, // PC_TLBSX IU, 0, 0, 0, 0, 0, // PC_TLBWE IU, 0, 0, 0, 0, 0, // PC_WRTEE IU, 0, 0, 0, 0, 0, // PC_WRTEEI IU, 0, 0, 0, 0, 0, // PC_MFDCR IU, 0, 0, 0, 0, 0, // PC_MTDCR Unsupported, 0, 0, 0, 0, 0, // PC_DCBA Unsupported, 0, 0, 0, 0, 0, // PC_DSS Unsupported, 0, 0, 0, 0, 0, // PC_DSSALL Unsupported, 0, 0, 0, 0, 0, // PC_DST Unsupported, 0, 0, 0, 0, 0, // PC_DSTT Unsupported, 0, 0, 0, 0, 0, // PC_DSTST Unsupported, 0, 0, 0, 0, 0, // PC_DSTSTT Unsupported, 0, 0, 0, 0, 0, // PC_LVEBX Unsupported, 0, 0, 0, 0, 0, // PC_LVEHX Unsupported, 0, 0, 0, 0, 0, // PC_LVEWX Unsupported, 0, 0, 0, 0, 0, // PC_LVSL Unsupported, 0, 0, 0, 0, 0, // PC_LVSR Unsupported, 0, 0, 0, 0, 0, // PC_LVX Unsupported, 0, 0, 0, 0, 0, // PC_LVXL Unsupported, 0, 0, 0, 0, 0, // PC_STVEBX Unsupported, 0, 0, 0, 0, 0, // PC_STVEHX Unsupported, 0, 0, 0, 0, 0, // PC_STVEWX Unsupported, 0, 0, 0, 0, 0, // PC_STVX Unsupported, 0, 0, 0, 0, 0, // PC_STVXL Unsupported, 0, 0, 0, 0, 0, // PC_MFVSCR Unsupported, 0, 0, 0, 0, 0, // PC_MTVSCR Unsupported, 0, 0, 0, 0, 0, // PC_VADDCUW Unsupported, 0, 0, 0, 0, 0, // PC_VADDFP Unsupported, 0, 0, 0, 0, 0, // PC_VADDSBS Unsupported, 0, 0, 0, 0, 0, // PC_VADDSHS Unsupported, 0, 0, 0, 0, 0, // PC_VADDSWS Unsupported, 0, 0, 0, 0, 0, // PC_VADDUBM Unsupported, 0, 0, 0, 0, 0, // PC_VADDUBS Unsupported, 0, 0, 0, 0, 0, // PC_VADDUHM Unsupported, 0, 0, 0, 0, 0, // PC_VADDUHS Unsupported, 0, 0, 0, 0, 0, // PC_VADDUWM Unsupported, 0, 0, 0, 0, 0, // PC_VADDUWS Unsupported, 0, 0, 0, 0, 0, // PC_VAND Unsupported, 0, 0, 0, 0, 0, // PC_VANDC Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSB Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSH Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSW Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUB Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUH Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUW Unsupported, 0, 0, 0, 0, 0, // PC_VCFSX Unsupported, 0, 0, 0, 0, 0, // PC_VCFUX Unsupported, 0, 0, 0, 0, 0, // PC_VCMPBFP Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQFP Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUB Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUH Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUW Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGEFP Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTFP Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSB Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSH Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSW Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUB Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUH Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUW Unsupported, 0, 0, 0, 0, 0, // PC_VCTSXS Unsupported, 0, 0, 0, 0, 0, // PC_VCTUXS Unsupported, 0, 0, 0, 0, 0, // PC_VEXPTEFP Unsupported, 0, 0, 0, 0, 0, // PC_VLOGEFP Unsupported, 0, 0, 0, 0, 0, // PC_VMAXFP Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSB Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSH Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSW Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUB Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUH Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUW Unsupported, 0, 0, 0, 0, 0, // PC_VMINFP Unsupported, 0, 0, 0, 0, 0, // PC_VMINSB Unsupported, 0, 0, 0, 0, 0, // PC_VMINSH Unsupported, 0, 0, 0, 0, 0, // PC_VMINSW Unsupported, 0, 0, 0, 0, 0, // PC_VMINUB Unsupported, 0, 0, 0, 0, 0, // PC_VMINUH Unsupported, 0, 0, 0, 0, 0, // PC_VMINUW Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHB Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHH Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHW Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLB Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLH Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLW Unsupported, 0, 0, 0, 0, 0, // PC_VMULESB Unsupported, 0, 0, 0, 0, 0, // PC_VMULESH Unsupported, 0, 0, 0, 0, 0, // PC_VMULEUB Unsupported, 0, 0, 0, 0, 0, // PC_VMULEUH Unsupported, 0, 0, 0, 0, 0, // PC_VMULOSB Unsupported, 0, 0, 0, 0, 0, // PC_VMULOSH Unsupported, 0, 0, 0, 0, 0, // PC_VMULOUB Unsupported, 0, 0, 0, 0, 0, // PC_VMULOUH Unsupported, 0, 0, 0, 0, 0, // PC_VNOR Unsupported, 0, 0, 0, 0, 0, // PC_VOR Unsupported, 0, 0, 0, 0, 0, // PC_VPKPX Unsupported, 0, 0, 0, 0, 0, // PC_VPKSHSS Unsupported, 0, 0, 0, 0, 0, // PC_VPKSHUS Unsupported, 0, 0, 0, 0, 0, // PC_VPKSWSS Unsupported, 0, 0, 0, 0, 0, // PC_VPKSWUS Unsupported, 0, 0, 0, 0, 0, // PC_VPKUHUM Unsupported, 0, 0, 0, 0, 0, // PC_VPKUHUS Unsupported, 0, 0, 0, 0, 0, // PC_VPKUWUM Unsupported, 0, 0, 0, 0, 0, // PC_VPKUWUS Unsupported, 0, 0, 0, 0, 0, // PC_VREFP Unsupported, 0, 0, 0, 0, 0, // PC_VRFIM Unsupported, 0, 0, 0, 0, 0, // PC_VRFIN Unsupported, 0, 0, 0, 0, 0, // PC_VRFIP Unsupported, 0, 0, 0, 0, 0, // PC_VRFIZ Unsupported, 0, 0, 0, 0, 0, // PC_VRLB Unsupported, 0, 0, 0, 0, 0, // PC_VRLH Unsupported, 0, 0, 0, 0, 0, // PC_VRLW Unsupported, 0, 0, 0, 0, 0, // PC_VRSQRTEFP Unsupported, 0, 0, 0, 0, 0, // PC_VSL Unsupported, 0, 0, 0, 0, 0, // PC_VSLB Unsupported, 0, 0, 0, 0, 0, // PC_VSLH Unsupported, 0, 0, 0, 0, 0, // PC_VSLO Unsupported, 0, 0, 0, 0, 0, // PC_VSLW Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTB Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTH Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTW Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISB Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISH Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISW Unsupported, 0, 0, 0, 0, 0, // PC_VSR Unsupported, 0, 0, 0, 0, 0, // PC_VSRAB Unsupported, 0, 0, 0, 0, 0, // PC_VSRAH Unsupported, 0, 0, 0, 0, 0, // PC_VSRAW Unsupported, 0, 0, 0, 0, 0, // PC_VSRB Unsupported, 0, 0, 0, 0, 0, // PC_VSRH Unsupported, 0, 0, 0, 0, 0, // PC_VSRO Unsupported, 0, 0, 0, 0, 0, // PC_VSRW Unsupported, 0, 0, 0, 0, 0, // PC_VSUBCUW Unsupported, 0, 0, 0, 0, 0, // PC_VSUBFP Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSBS Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSHS Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSWS Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUBM Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUBS Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUHM Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUHS Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUWM Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUWS Unsupported, 0, 0, 0, 0, 0, // PC_VSUMSWS Unsupported, 0, 0, 0, 0, 0, // PC_VSUFPMSWS Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWASBS Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWASHS Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWAUBS Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHPX Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHSB Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHSH Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLPX Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLSB Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLSH Unsupported, 0, 0, 0, 0, 0, // PC_VXOR Unsupported, 0, 0, 0, 0, 0, // PC_VMADDFP Unsupported, 0, 0, 0, 0, 0, // PC_VMHADDSHS Unsupported, 0, 0, 0, 0, 0, // PC_VMHRADDSHS Unsupported, 0, 0, 0, 0, 0, // PC_VMLADDUHM Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMMBM Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMSHM Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMSHS Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUBM Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUHM Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUHS Unsupported, 0, 0, 0, 0, 0, // PC_VNMSUBFP Unsupported, 0, 0, 0, 0, 0, // PC_VPERM Unsupported, 0, 0, 0, 0, 0, // PC_VSEL Unsupported, 0, 0, 0, 0, 0, // PC_VSLDOI Unsupported, 0, 0, 0, 0, 0, // PC_VMR Unsupported, 0, 0, 0, 0, 0, // PC_VMRP IU, 0, 0, 0, 0, 0, // PC_SLE IU, 0, 0, 0, 0, 0, // PC_SLEQ IU, 0, 0, 0, 0, 0, // PC_SLIQ IU, 0, 0, 0, 0, 0, // PC_SLLIQ IU, 0, 0, 0, 0, 0, // PC_SLLQ IU, 0, 0, 0, 0, 0, // PC_SLQ IU, 0, 0, 0, 0, 0, // PC_SRAIQ IU, 0, 0, 0, 0, 0, // PC_SRAQ IU, 0, 0, 0, 0, 0, // PC_SRE IU, 0, 0, 0, 0, 0, // PC_SREA IU, 0, 0, 0, 0, 0, // PC_SREQ IU, 0, 0, 0, 0, 0, // PC_SRIQ IU, 0, 0, 0, 0, 0, // PC_SRLIQ IU, 0, 0, 0, 0, 0, // PC_SRLQ IU, 0, 0, 0, 0, 0, // PC_SRQ IU, 0, 0, 0, 0, 0, // PC_MASKG IU, 0, 0, 0, 0, 0, // PC_MASKIR IU, 0, 0, 0, 0, 0, // PC_LSCBX IU, 0, 0, 0, 0, 0, // PC_DIV IU, 0, 0, 0, 0, 0, // PC_DIVS IU, 0, 0, 0, 0, 0, // PC_DOZ IU, 0, 0, 0, 0, 0, // PC_MUL IU, 0, 0, 0, 0, 0, // PC_NABS IU, 0, 0, 0, 0, 0, // PC_ABS IU, 0, 0, 0, 0, 0, // PC_CLCS IU, 0, 0, 0, 0, 0, // PC_DOZI IU, 0, 0, 0, 0, 0, // PC_RLMI IU, 0, 0, 0, 0, 0, // PC_RRIB }; static void advance(int stageCount, int oldStage, int newStage) { PCode *instr = pipeline[oldStage].instr; int cycles = instruction_timing[instr->op].cycles[newStage - stageCount]; pipeline[newStage].instr = instr; pipeline[newStage].remaining = cycles; pipeline[oldStage].instr = NULL; } static void complete_instruction(int stage) { pipeline[stage].instr = NULL; } static int latency(PCode *instr) { int cycles = instruction_timing[instr->op].latency; if (PCODE_FLAG_SET_F(instr) & fRecordBit) cycles += 2; if (instr->op == PC_LMW || instr->op == PC_STMW) cycles += instr->argCount - 2; return cycles; } static void initialize(void) { int stage; for (stage = 0; stage < NumStages; stage++) pipeline[stage].instr = NULL; } static int can_issue(PCode *instr) { int stage = instruction_timing[instr->op].stage; if (stage == Serialize) stage = IU; if (pipeline[stage].instr) return 0; return 1; } static void issue(PCode *instr) { int stage = instruction_timing[instr->op].stage; int cycles = instruction_timing[instr->op].cycles[IU]; if (stage == Serialize) stage = IU; pipeline[stage].instr = instr; pipeline[stage].remaining = cycles; } static void advance_clock(void) { int stage; for (stage = 0; stage < NumStages; stage++) { if (pipeline[stage].instr && pipeline[stage].remaining) --pipeline[stage].remaining; } if (pipeline[IU].instr && pipeline[IU].remaining == 0) complete_instruction(IU); if (pipeline[FWA].instr && pipeline[FWA].remaining == 0) complete_instruction(FWA); if (pipeline[BPU].instr && pipeline[BPU].remaining == 0) complete_instruction(BPU); if (pipeline[FPA].instr && pipeline[FPA].remaining == 0 && !pipeline[FWA].instr) advance(1, FPA, FWA); if (pipeline[FPM].instr && pipeline[FPM].remaining == 0 && !pipeline[FPA].instr) advance(1, FPM, FPA); if (pipeline[FD].instr && pipeline[FD].remaining == 0 && !pipeline[FPM].instr) advance(1, FD, FPM); } static int serializes(PCode *instr) { return instruction_timing[instr->op].stage == Serialize; } MachineInfo machine601 = { 2, 0, 0, &latency, &initialize, &can_issue, &issue, &advance_clock, &serializes, &default_uses_vpermute_unit };