Line 29... |
Line 29... |
|
|
struct dstats_entry dstats[DSTATS_LEN]; /* dependency stats */
|
struct dstats_entry dstats[DSTATS_LEN]; /* dependency stats */
|
struct sstats_entry sstats[SSTATS_LEN]; /* single stats */
|
struct sstats_entry sstats[SSTATS_LEN]; /* single stats */
|
struct fstats_entry fstats[FSTATS_LEN]; /* functional units stats */
|
struct fstats_entry fstats[FSTATS_LEN]; /* functional units stats */
|
struct mstats_entry mstats; /* misc units stats */
|
struct mstats_entry mstats; /* misc units stats */
|
|
struct cachestats_entry ic_stats; /* instruction cache stats */
|
|
struct cachestats_entry dc_stats; /* data cache stats */
|
|
struct raw_stats raw_stats; /* RAW hazard stats */
|
|
|
/* Dependency */
|
/* Dependency */
|
|
|
int check_depend()
|
int check_depend()
|
{
|
{
|
Line 119... |
Line 122... |
{
|
{
|
memset(sstats, 0, sizeof(sstats));
|
memset(sstats, 0, sizeof(sstats));
|
memset(dstats, 0, sizeof(dstats));
|
memset(dstats, 0, sizeof(dstats));
|
memset(fstats, 0, sizeof(fstats));
|
memset(fstats, 0, sizeof(fstats));
|
memset(&mstats, 0, sizeof(mstats));
|
memset(&mstats, 0, sizeof(mstats));
|
|
memset(&ic_stats, 0, sizeof(ic_stats));
|
|
memset(&dc_stats, 0, sizeof(dc_stats));
|
|
memset(&raw_stats, 0, sizeof(raw_stats));
|
}
|
}
|
|
|
void printstats()
|
void printstats(int which)
|
{
|
{
|
int i, all = 0, dependall = 0;
|
int i, all = 0, dependall = 0;
|
|
|
for(i = 0; i < SSTATS_LEN; i++)
|
for(i = 0; i < SSTATS_LEN; i++)
|
all += sstats[i].cnt_static;
|
all += sstats[i].cnt_static;
|
|
|
for(i = 0; i < SSTATS_LEN; i++)
|
for(i = 0; i < SSTATS_LEN; i++)
|
if (sstats[i].cnt_static)
|
if (sstats[i].cnt_static && (which == 1))
|
printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_static, (sstats[i].cnt_static * 100)/all);
|
printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_static, (sstats[i].cnt_static * 100)/all);
|
|
|
printf("SUM: %d instructions (static, single stats)\n", all);
|
printf("SUM: %d instructions (static, single stats)\n", all);
|
|
|
all = 0;
|
all = 0;
|
|
|
for(i = 0; i < SSTATS_LEN; i++)
|
for(i = 0; i < SSTATS_LEN; i++)
|
all += sstats[i].cnt_dynamic;
|
all += sstats[i].cnt_dynamic;
|
|
|
for(i = 0; i < SSTATS_LEN; i++)
|
for(i = 0; i < SSTATS_LEN; i++)
|
if (sstats[i].cnt_dynamic)
|
if (sstats[i].cnt_dynamic && (which == 2))
|
printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_dynamic, (sstats[i].cnt_dynamic * 100)/all);
|
printf(" %s\t\tused %6dx (%2d%%)\n", sstats[i].insn, sstats[i].cnt_dynamic, (sstats[i].cnt_dynamic * 100)/all);
|
|
|
printf("SUM: %d instructions (dynamic, single stats)\n", all);
|
printf("SUM: %d instructions (dynamic, single stats)\n", all);
|
|
|
all = 0;
|
all = 0;
|
Line 152... |
Line 159... |
all += dstats[i].cnt_dynamic;
|
all += dstats[i].cnt_dynamic;
|
dependall += dstats[i].depend;
|
dependall += dstats[i].depend;
|
}
|
}
|
|
|
for(i = 0; i < DSTATS_LEN; i++)
|
for(i = 0; i < DSTATS_LEN; i++)
|
if (dstats[i].cnt_dynamic) {
|
if (dstats[i].cnt_dynamic && (which == 3)) {
|
printf(" %s, %s ", dstats[i].insn1, dstats[i].insn2);
|
printf(" %s, %s ", dstats[i].insn1, dstats[i].insn2);
|
printf("\t\t\t%6dx (%2d%%)", dstats[i].cnt_dynamic, (dstats[i].cnt_dynamic * 100)/all);
|
printf("\t\t\t%6dx (%2d%%)", dstats[i].cnt_dynamic, (dstats[i].cnt_dynamic * 100)/all);
|
printf(" depend: %3d%%\n", (dstats[i].depend * 100) / dstats[i].cnt_dynamic);
|
printf(" depend: %3d%%\n", (dstats[i].depend * 100) / dstats[i].cnt_dynamic);
|
}
|
}
|
|
|
Line 168... |
Line 175... |
all += fstats[i].cnt_dynamic;
|
all += fstats[i].cnt_dynamic;
|
dependall += fstats[i].depend;
|
dependall += fstats[i].depend;
|
}
|
}
|
|
|
for(i = 0; i < FSTATS_LEN; i++)
|
for(i = 0; i < FSTATS_LEN; i++)
|
if (fstats[i].cnt_dynamic) {
|
if (fstats[i].cnt_dynamic && (which == 4)) {
|
printf(" %s,", func_unit_str[fstats[i].insn1]);
|
printf(" %s,", func_unit_str[fstats[i].insn1]);
|
printf(" %s", func_unit_str[fstats[i].insn2]);
|
printf(" %s", func_unit_str[fstats[i].insn2]);
|
printf("\t\t\t%6dx (%2d%%)", fstats[i].cnt_dynamic, (fstats[i].cnt_dynamic * 100)/all);
|
printf("\t\t\t%6dx (%2d%%)", fstats[i].cnt_dynamic, (fstats[i].cnt_dynamic * 100)/all);
|
printf(" depend: %3d%%\n", (fstats[i].depend * 100) / fstats[i].cnt_dynamic);
|
printf(" depend: %3d%%\n", (fstats[i].depend * 100) / fstats[i].cnt_dynamic);
|
}
|
}
|
|
|
|
for(i = 0; (i < RAW_RANGE) && (which == 5); i++)
|
|
printf(" Register set and reused in %d. cycle: %d cases\n", i, raw_stats.range[i]);
|
|
|
printf("SUM: %d instructions (dynamic, functional units stats) depend: %d%%\n", all, (dependall * 100) / all);
|
printf("SUM: %d instructions (dynamic, functional units stats) depend: %d%%\n", all, (dependall * 100) / all);
|
printf("Byte ADD: %d instructions\n", mstats.byteadd);
|
printf("Byte ADD: %d instructions\n", mstats.byteadd);
|
printf("BEQZ: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / (mstats.beqz.taken + mstats.beqz.nottaken));
|
printf("BEQZ: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / (mstats.beqz.taken + mstats.beqz.nottaken));
|
printf(" %d (%d%%) not taken\n", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / (mstats.beqz.taken + mstats.beqz.nottaken));
|
printf(" %d (%d%%) not taken\n", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / (mstats.beqz.taken + mstats.beqz.nottaken));
|
printf("BNEZ: %d (%d%%) taken,", mstats.bnez.taken, (mstats.bnez.taken * 100) / (mstats.bnez.taken + mstats.bnez.nottaken));
|
printf("BNEZ: %d (%d%%) taken,", mstats.bnez.taken, (mstats.bnez.taken * 100) / (mstats.bnez.taken + mstats.bnez.nottaken));
|
printf(" %d (%d%%) not taken\n", mstats.bnez.nottaken, (mstats.bnez.nottaken * 100) / (mstats.bnez.taken + mstats.bnez.nottaken));
|
printf(" %d (%d%%) not taken\n", mstats.bnez.nottaken, (mstats.bnez.nottaken * 100) / (mstats.bnez.taken + mstats.bnez.nottaken));
|
printf("BPB: hit %d (correct %d%%), miss %d\n", mstats.bpb.hit, (mstats.bpb.correct * 100) / mstats.bpb.hit, mstats.bpb.miss);
|
printf("BPB: hit %d (correct %d%%), miss %d\n", mstats.bpb.hit, (mstats.bpb.correct * 100) / mstats.bpb.hit, mstats.bpb.miss);
|
printf("BTIC: hit %d(%d%%), miss %d\n", mstats.btic.hit, (mstats.btic.hit * 100) / (mstats.btic.hit + mstats.btic.miss), mstats.btic.miss);
|
printf("BTIC: hit %d(%d%%), miss %d\n", mstats.btic.hit, (mstats.btic.hit * 100) / (mstats.btic.hit + mstats.btic.miss), mstats.btic.miss);
|
|
printf("IC read: hit %d(%d%%), miss %d\n", ic_stats.readhit, (ic_stats.readhit * 100) / (ic_stats.readhit + ic_stats.readmiss), ic_stats.readmiss);
|
|
printf("DC read: hit %d(%d%%), miss %d\n", dc_stats.readhit, (dc_stats.readhit * 100) / (dc_stats.readhit + dc_stats.readmiss), dc_stats.readmiss);
|
|
printf("DC write: hit %d(%d%%), miss %d\n", dc_stats.writehit, (dc_stats.writehit * 100) / (dc_stats.writehit + dc_stats.writemiss), dc_stats.writemiss);
|
}
|
}
|
|
|
No newline at end of file
|
No newline at end of file
|