Dump the processor statistics
PutF1I[out, "instructions: %g", insts];
PutF1I[out, ", cycles: %g", cycles];
IF insts > 0
THEN {
PutReal1[out, "\n bytes/inst: %g", (bytes*1.0)/insts, 2];
PutReal1[out, ", cycles/inst: %g", (cycles*1.0)/insts, 2];
IF rejects > 0
THEN
PutReal1[out, ", cycles/reject: %g", (cycles*1.0)/rejects, 2];
};
PutF1I[out, "\n instBytesUsed: %g", bytes];
PutF1I[out, ", instBytesFlushed: %g", discarded];
PutF1I[out, "\n euFetches: %g", euFetches];
PutF1I[out, ", euStores: %g", euStores];
{
detail of jumps, calls, and predictions
fallThruGood: INT ← new.pStats.fallThruGood - old.pStats.fallThruGood;
jumpGood: INT ← new.pStats.jumpGood - old.pStats.jumpGood;
fallThruBad: INT ← new.pStats.fallThruBad - old.pStats.fallThruBad;
jumpBad: INT ← new.pStats.jumpBad - old.pStats.jumpBad;
goodPredict: INT ← fallThruGood+jumpGood;
badPredict: INT ← fallThruBad+jumpBad;
PutF1I[out, "\n goodPredictions: %g", goodPredict];
PutF1I[out, ", badPredictions: %g", badPredict];
PutF1I[out, ", uncond jumps: %g", new.pStats.jumps - old.pStats.jumps];
PutF1I[out, ", calls: %g", new.pStats.calls - old.pStats.calls];
PutF1I[out, "\n (fallThruGood: %g", fallThruGood];
PutF1I[out, ", jumpGood: %g", jumpGood];
PutF1I[out, ", fallThruBad: %g", fallThruBad];
PutF1I[out, ", jumpBad: %g)", jumpBad];
};
PutF1I[out, "\n stackOver: %g",
new.pStats.stackOver - old.pStats.stackOver];
PutF1I[out, "\n instBufferCycles: %g",
new.pStats.instBufferCycles - old.pStats.instBufferCycles];
PutF1I[out, ", returnInterlockCycles: %g",
new.pStats.returnInterlockCycles - old.pStats.returnInterlockCycles];
PutF1I[out, ", lookaheadRejectCycles: %g",
new.pStats.lookaheadRejects - old.pStats.lookaheadRejects];
Dump the cache statistics
IO.PutRope[out, "\n\nIFU cache - "];
ShowBiasedCache[out, old.ifuStats, new.ifuStats];
IO.PutRope[out, "\nEU cache - "];
ShowBiasedCache[out, old.euStats, new.euStats];
IO.PutRope[out, "\n"];