@@ -566,7 +566,8 @@ DecoupledBPUWithFTB::DBPFTBStats::DBPFTBStats(statistics::Group* parent, unsigne
566
566
ADD_STAT(controlCommitSquashOfUncond, statistics::units::Count::get(), "control squash of uncond branch at commit"),
567
567
ADD_STAT(controlCommitSquashOfUncondDirect, statistics::units::Count::get(), "control squash of uncond direct branch at commit"),
568
568
ADD_STAT(controlCommitSquashOfUncondIndirect, statistics::units::Count::get(), "control squash of indirect branch at commit"),
569
- ADD_STAT(controlCommitSquashOfUncondReturn, statistics::units::Count::get(), "control squash of return branch at commit")
569
+ ADD_STAT(controlCommitSquashOfUncondReturn, statistics::units::Count::get(), "control squash of return branch at commit"),
570
+ ADD_STAT(ftqEndReasonDist, statistics::units::Count::get(), "distribution of ftq end reason")
570
571
{
571
572
predsOfEachStage.init (numStages);
572
573
commitPredsFromEachStage.init (numStages+1 );
@@ -582,6 +583,11 @@ DecoupledBPUWithFTB::DBPFTBStats::DBPFTBStats(statistics::Group* parent, unsigne
582
583
commitTrapSquashLatencyDist.init (1 ,16 ,1 );
583
584
commitNonControlSquashLatencyDist.init (1 ,16 ,1 );
584
585
updateLatencyDist.init (1 ,64 ,2 );
586
+ ftqEndReasonDist.init (static_cast <int >(FTQEndReason::NUM_REASONS)).flags (statistics::pdf);
587
+ ftqEndReasonDist.subname (static_cast <int >(FTQEndReason::NOT_END), " not_end" );
588
+ ftqEndReasonDist.subname (static_cast <int >(FTQEndReason::TAKEN), " taken" );
589
+ ftqEndReasonDist.subname (static_cast <int >(FTQEndReason::SIZE_LIMIT), " size_limit" );
590
+ ftqEndReasonDist.subname (static_cast <int >(FTQEndReason::LOOP_END), " loop_end" );
585
591
}
586
592
587
593
DecoupledBPUWithFTB::BpTrace::BpTrace (FetchStream &stream, const DynInstPtr &inst, bool mispred)
@@ -903,6 +909,7 @@ DecoupledBPUWithFTB::decoupledPredict(const StaticInstPtr &inst,
903
909
if (raw_taken) {
904
910
if (current_loop_iter >= loop_iter - 1 ) {
905
911
run_out_of_this_entry = true ;
912
+ dbpFtbStats.ftqEndReasonDist [static_cast <int >(FTQEndReason::LOOP_END)]++;
906
913
if (loop_exit) {
907
914
taken = false ;
908
915
lb.tryUnpin ();
@@ -914,6 +921,7 @@ DecoupledBPUWithFTB::decoupledPredict(const StaticInstPtr &inst,
914
921
} else {
915
922
if (taken) {
916
923
run_out_of_this_entry = true ;
924
+ dbpFtbStats.ftqEndReasonDist [static_cast <int >(FTQEndReason::TAKEN)]++;
917
925
}
918
926
}
919
927
@@ -931,6 +939,7 @@ DecoupledBPUWithFTB::decoupledPredict(const StaticInstPtr &inst,
931
939
inst->advancePC (*target);
932
940
if (target->instAddr () >= end) {
933
941
run_out_of_this_entry = true ;
942
+ dbpFtbStats.ftqEndReasonDist [static_cast <int >(FTQEndReason::SIZE_LIMIT)]++;
934
943
}
935
944
}
936
945
DPRINTF (DecoupleBP, " Predict it %staken to %#lx\n " , taken ? " " : " not " ,
0 commit comments