use crate::exec::signals::ControlFlow;
use crate::isa::op::{AluOp, SystemOp, VectorOp};
use crate::uarch::ctx::CoreCtx;
pub(super) fn update_instruction_stats(
state: &mut CoreCtx<'_>,
entry: &crate::uarch::pipeline::rob::RobEntry,
) {
if !matches!(entry.ctrl.vec_op, VectorOp::None) {
update_vec_instruction_stats(state, entry.ctrl.vec_op);
return;
}
if entry.ctrl.atomic_op.is_some() {
state.uncore.stats.counter(state.core.stat_paths.commit.op_atomic).inc();
} else if entry.ctrl.mem_read {
if entry.ctrl.fp_reg_write {
state.uncore.stats.counter(state.core.stat_paths.commit.fp_load).inc();
} else {
state.uncore.stats.counter(state.core.stat_paths.commit.op_load).inc();
}
} else if entry.ctrl.mem_write {
if entry.ctrl.rs2_fp {
state.uncore.stats.counter(state.core.stat_paths.commit.fp_store).inc();
} else {
state.uncore.stats.counter(state.core.stat_paths.commit.op_store).inc();
}
} else if matches!(entry.ctrl.control_flow, ControlFlow::Branch | ControlFlow::Jump) {
state.uncore.stats.counter(state.core.stat_paths.commit.op_branch).inc();
} else if !matches!(entry.ctrl.system_op, SystemOp::None) {
state.uncore.stats.counter(state.core.stat_paths.commit.op_system).inc();
} else {
match entry.ctrl.alu {
AluOp::FAdd
| AluOp::FSub
| AluOp::FMul
| AluOp::FMin
| AluOp::FMax
| AluOp::FSgnJ
| AluOp::FSgnJN
| AluOp::FSgnJX
| AluOp::FEq
| AluOp::FLt
| AluOp::FLe
| AluOp::FClass
| AluOp::FCvtWS
| AluOp::FCvtWUS
| AluOp::FCvtLS
| AluOp::FCvtLUS
| AluOp::FCvtSW
| AluOp::FCvtSWU
| AluOp::FCvtSL
| AluOp::FCvtSLU
| AluOp::FCvtSD
| AluOp::FCvtDS
| AluOp::FCvtSH
| AluOp::FCvtHS
| AluOp::FCvtDH
| AluOp::FCvtHD
| AluOp::FMvToX
| AluOp::FMvToF => {
state.uncore.stats.counter(state.core.stat_paths.commit.fp_arith).inc();
}
AluOp::FDiv | AluOp::FSqrt => {
state.uncore.stats.counter(state.core.stat_paths.commit.fp_div_sqrt).inc();
}
AluOp::FMAdd | AluOp::FMSub | AluOp::FNMAdd | AluOp::FNMSub => {
state.uncore.stats.counter(state.core.stat_paths.commit.fp_fma).inc();
}
_ => state.uncore.stats.counter(state.core.stat_paths.commit.op_alu).inc(),
}
}
}
pub(super) fn update_vec_instruction_stats(state: &mut CoreCtx<'_>, op: VectorOp) {
match op {
VectorOp::None => {}
VectorOp::VLoadUnit
| VectorOp::VLoadFF
| VectorOp::VLoadMask
| VectorOp::VLoadWholeReg
| VectorOp::VLoadStride
| VectorOp::VLoadIndexOrd
| VectorOp::VLoadIndexUnord => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_load).inc();
}
VectorOp::VStoreUnit
| VectorOp::VStoreMask
| VectorOp::VStoreWholeReg
| VectorOp::VStoreStride
| VectorOp::VStoreIndexOrd
| VectorOp::VStoreIndexUnord => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_store).inc();
}
VectorOp::VAdd
| VectorOp::VSub
| VectorOp::VRsub
| VectorOp::VAnd
| VectorOp::VOr
| VectorOp::VXor
| VectorOp::VSll
| VectorOp::VSrl
| VectorOp::VSra
| VectorOp::VMinU
| VectorOp::VMin
| VectorOp::VMaxU
| VectorOp::VMax
| VectorOp::VMerge
| VectorOp::VMSeq
| VectorOp::VMSne
| VectorOp::VMSltu
| VectorOp::VMSlt
| VectorOp::VMSleu
| VectorOp::VMSle
| VectorOp::VMSgtu
| VectorOp::VMSgt
| VectorOp::VAdc
| VectorOp::VMadc
| VectorOp::VSbc
| VectorOp::VMsbc
| VectorOp::VSAddU
| VectorOp::VSAdd
| VectorOp::VSSubU
| VectorOp::VSSub
| VectorOp::VAAddU
| VectorOp::VAAdd
| VectorOp::VASubU
| VectorOp::VASub
| VectorOp::VSmul
| VectorOp::VSSrl
| VectorOp::VSSra
| VectorOp::VZextVf2
| VectorOp::VZextVf4
| VectorOp::VZextVf8
| VectorOp::VSextVf2
| VectorOp::VSextVf4
| VectorOp::VSextVf8
| VectorOp::VNSrl
| VectorOp::VNSra
| VectorOp::VNClipU
| VectorOp::VNClip
| VectorOp::VMul
| VectorOp::VMulh
| VectorOp::VMulhu
| VectorOp::VMulhsu
| VectorOp::VMacc
| VectorOp::VNMSac
| VectorOp::VMadd
| VectorOp::VNMSub
| VectorOp::VDivU
| VectorOp::VDiv
| VectorOp::VRemU
| VectorOp::VRem
| VectorOp::VWAddU
| VectorOp::VWAdd
| VectorOp::VWSubU
| VectorOp::VWSub
| VectorOp::VWAddUW
| VectorOp::VWAddW
| VectorOp::VWSubUW
| VectorOp::VWSubW
| VectorOp::VWMulU
| VectorOp::VWMul
| VectorOp::VWMulSU
| VectorOp::VWMaccU
| VectorOp::VWMacc
| VectorOp::VWMaccSU
| VectorOp::VWMaccUS
| VectorOp::VRedSum
| VectorOp::VRedAnd
| VectorOp::VRedOr
| VectorOp::VRedXor
| VectorOp::VRedMinU
| VectorOp::VRedMin
| VectorOp::VRedMaxU
| VectorOp::VRedMax
| VectorOp::VWRedSumU
| VectorOp::VWRedSum
| VectorOp::VAndN
| VectorOp::VBrev
| VectorOp::VBrev8
| VectorOp::VRev8
| VectorOp::VClz
| VectorOp::VCtz
| VectorOp::VCpopV
| VectorOp::VRol
| VectorOp::VRor
| VectorOp::VWsll
| VectorOp::VClMul
| VectorOp::VClMulH => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_int).inc();
}
VectorOp::VFAdd
| VectorOp::VFSub
| VectorOp::VFRSub
| VectorOp::VFMul
| VectorOp::VFDiv
| VectorOp::VFRDiv
| VectorOp::VFMin
| VectorOp::VFMax
| VectorOp::VFSgnj
| VectorOp::VFSgnjn
| VectorOp::VFSgnjx
| VectorOp::VMFEq
| VectorOp::VMFNe
| VectorOp::VMFLt
| VectorOp::VMFLe
| VectorOp::VMFGt
| VectorOp::VMFGe
| VectorOp::VFSqrt
| VectorOp::VFRsqrt7
| VectorOp::VFRec7
| VectorOp::VFClass
| VectorOp::VFCvtXuF
| VectorOp::VFCvtXF
| VectorOp::VFCvtFXu
| VectorOp::VFCvtFX
| VectorOp::VFCvtRtzXuF
| VectorOp::VFCvtRtzXF
| VectorOp::VFMacc
| VectorOp::VFNMacc
| VectorOp::VFMSac
| VectorOp::VFNMSac
| VectorOp::VFMAdd
| VectorOp::VFNMAdd
| VectorOp::VFMSub
| VectorOp::VFNMSub
| VectorOp::VFWAdd
| VectorOp::VFWSub
| VectorOp::VFWMul
| VectorOp::VFWAddW
| VectorOp::VFWSubW
| VectorOp::VFWMacc
| VectorOp::VFWNMacc
| VectorOp::VFWMSac
| VectorOp::VFWNMSac
| VectorOp::VFWCvtXuF
| VectorOp::VFWCvtXF
| VectorOp::VFWCvtFXu
| VectorOp::VFWCvtFX
| VectorOp::VFWCvtFF
| VectorOp::VFWCvtRtzXuF
| VectorOp::VFWCvtRtzXF
| VectorOp::VFNCvtXuF
| VectorOp::VFNCvtXF
| VectorOp::VFNCvtFXu
| VectorOp::VFNCvtFX
| VectorOp::VFNCvtFF
| VectorOp::VFNCvtRodFF
| VectorOp::VFNCvtRtzXuF
| VectorOp::VFNCvtRtzXF
| VectorOp::VFMerge
| VectorOp::VFMvSF
| VectorOp::VFMvFS
| VectorOp::VFSlide1Up
| VectorOp::VFSlide1Down
| VectorOp::VFRedOSum
| VectorOp::VFRedUSum
| VectorOp::VFRedMax
| VectorOp::VFRedMin
| VectorOp::VFWRedOSum
| VectorOp::VFWRedUSum => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_fp).inc();
}
VectorOp::Vsetvli
| VectorOp::Vsetivli
| VectorOp::Vsetvl
| VectorOp::VMAndMM
| VectorOp::VMNandMM
| VectorOp::VMAndnMM
| VectorOp::VMOrMM
| VectorOp::VMNorMM
| VectorOp::VMOrnMM
| VectorOp::VMXorMM
| VectorOp::VMXnorMM
| VectorOp::VCPopM
| VectorOp::VFirstM
| VectorOp::VMSbfM
| VectorOp::VMSifM
| VectorOp::VMSofM
| VectorOp::VIotaM
| VectorOp::VIdV
| VectorOp::VMvXS
| VectorOp::VMvSX
| VectorOp::VSlideUp(_)
| VectorOp::VSlideDown(_)
| VectorOp::VSlide1Up
| VectorOp::VSlide1Down
| VectorOp::VRgather
| VectorOp::VRgatherEi16
| VectorOp::VCompress
| VectorOp::VMv1r
| VectorOp::VMv2r
| VectorOp::VMv4r
| VectorOp::VMv8r => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_misc).inc();
}
VectorOp::VAesEm
| VectorOp::VAesEf
| VectorOp::VAesDm
| VectorOp::VAesDf
| VectorOp::VAesZ
| VectorOp::VAesKf1
| VectorOp::VAesKf2
| VectorOp::VSha2Ms
| VectorOp::VSha2Ch
| VectorOp::VSha2Cl
| VectorOp::VSm3Me
| VectorOp::VSm3C
| VectorOp::VSm4R
| VectorOp::VSm4K
| VectorOp::VGhsh
| VectorOp::VGmul => {
state.uncore.stats.counter(state.core.stat_paths.commit.vec_crypto).inc();
}
}
}