diff --git a/scripts/instructions.yaml b/scripts/instructions.yaml index 8a5f384..e42a09f 100644 --- a/scripts/instructions.yaml +++ b/scripts/instructions.yaml @@ -1768,6 +1768,12 @@ mtocrf: compare: CMP_RC_0 fxm: FXM_ONEHOT +mcrf: + unit: U_CR + internalOp: CR_MCRF + rOut: ROUT_NONE + compare: CMP_RC_0 + b: unit: U_BR internalOp: BR_UNCOND diff --git a/src/main/scala/Control.scala b/src/main/scala/Control.scala index fbeb7c3..ff18072 100644 --- a/src/main/scala/Control.scala +++ b/src/main/scala/Control.scala @@ -37,8 +37,9 @@ object Control { val SPR_MF = 0.U(2.W) val SPR_MT = 1.U(2.W) - val CR_MF = 0.U(2.W) - val CR_MT = 1.U(2.W) + val CR_MF = 0.U(2.W) + val CR_MT = 1.U(2.W) + val CR_MCRF = 2.U(2.W) val BR_UNCOND = 0.U(2.W) val BR_COND = 1.U(2.W) diff --git a/src/main/scala/Core.scala b/src/main/scala/Core.scala index 5097de5..afc4cf5 100644 --- a/src/main/scala/Core.scala +++ b/src/main/scala/Core.scala @@ -240,6 +240,8 @@ class Core(bits: Int, memSize: Int, memFileName: String, resetAddr: Int) extends conditionRegister := fxm.asBools.zip(conditionRegister).zip(executeRs(31, 0).nibbles().reverse).map({ case ((fxm, cr), reg) => Mux(fxm, reg, cr) }) + } .elsewhen (ctrl.internalOp === CR_MCRF) { + conditionRegister(insn_bf(executeInsn)) := conditionRegister(insn_bfa(executeInsn)) } } diff --git a/src/main/scala/Instructions.scala b/src/main/scala/Instructions.scala index 20c08c6..8ca9948 100644 --- a/src/main/scala/Instructions.scala +++ b/src/main/scala/Instructions.scala @@ -164,6 +164,7 @@ object Instructions { def MFOCRF = BitPat("b011111?????1?????????0000010011?") def MTCRF = BitPat("b011111?????0?????????0010010000?") def MTOCRF = BitPat("b011111?????1?????????0010010000?") + def MCRF = BitPat("b010011???????????????0000000000?") // SPR read/write def MFSPR = BitPat("b011111???????????????0101010011?") @@ -214,7 +215,6 @@ object Instructions { //def DCBZ = BitPat("b011111???????????????1111110110?") - //def MCRF = BitPat("b010011???????????????0000000000?") //def ISEL = BitPat("b011111????????????????????01111?") // 2.03 //def PRTYD = BitPat("b011111???????????????0010111010?") // 2.05