summaryrefslogtreecommitdiff
path: root/compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c')
-rw-r--r--compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c552
1 files changed, 552 insertions, 0 deletions
diff --git a/compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c b/compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c
new file mode 100644
index 0000000..2d54678
--- /dev/null
+++ b/compiler_and_linker/BackEnd/PowerPC/Scheduler/MachineSimulation601.c
@@ -0,0 +1,552 @@
+#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
+};