Line 32... |
Line 32... |
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 ic_stats; /* instruction cache stats */
|
struct cachestats_entry dc_stats; /* data cache stats */
|
struct cachestats_entry dc_stats; /* data cache stats */
|
struct raw_stats raw_stats; /* RAW hazard stats */
|
struct raw_stats raw_stats; /* RAW hazard stats */
|
|
struct slp_stats slp_stats; /* SLP stats */
|
|
|
/* Dependency */
|
/* Dependency */
|
|
|
int check_depend()
|
int check_depend()
|
{
|
{
|
Line 125... |
Line 126... |
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(&ic_stats, 0, sizeof(ic_stats));
|
memset(&dc_stats, 0, sizeof(dc_stats));
|
memset(&dc_stats, 0, sizeof(dc_stats));
|
memset(&raw_stats, 0, sizeof(raw_stats));
|
memset(&raw_stats, 0, sizeof(raw_stats));
|
|
memset(&slp_stats, 0, sizeof(slp_stats));
|
|
}
|
|
|
|
/* SLP
|
|
|
|
1: R
|
|
2: R
|
|
3: R
|
|
OK
|
|
|
|
1: W
|
|
2: R
|
|
3: R
|
|
flush 2 3
|
|
|
|
1: R
|
|
2: W
|
|
3: R
|
|
OK
|
|
|
|
1: R
|
|
2: W
|
|
3: R
|
|
flush 3
|
|
|
|
flushing: don't flush if written location hasn't change after the write since
|
|
original read got correct data.
|
|
|
|
*/
|
|
|
|
void slp_checkaccess(unsigned long addr, char type)
|
|
{
|
|
if ((addr < (MEMORY_START + MEMORY_LEN - 4000)) &&
|
|
slp_stats.supercnt && (type == SLP_MEMWRITE)) {
|
|
slp_stats.supercalls++;
|
|
slp_stats.supercnt = 0;
|
|
}
|
|
}
|
|
|
|
void slp_func_entry()
|
|
{
|
|
if (++slp_stats.curdepth > slp_stats.maxdepth)
|
|
slp_stats.maxdepth = slp_stats.curdepth;
|
|
|
|
slp_stats.calls++;
|
|
slp_stats.supercnt++;
|
|
}
|
|
|
|
void slp_func_exit()
|
|
{
|
|
slp_stats.curdepth--;
|
}
|
}
|
|
|
void printstats(int which)
|
void printstats(int which)
|
{
|
{
|
int i, all = 0, dependall = 0;
|
int i, all = 0, dependall = 0;
|
Line 185... |
Line 237... |
}
|
}
|
|
|
for(i = 0; (i < RAW_RANGE) && (which == 5); i++)
|
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(" Register set and reused in %d. cycle: %d cases\n", i, raw_stats.range[i]);
|
|
|
|
if (which == 6) {
|
|
printf("SLP:\n");
|
|
printf("maxdepth: %6d calls: %6d\n", slp_stats.maxdepth, slp_stats.calls);
|
|
printf("calls: %6d supercalls: %6d\n", slp_stats.calls, slp_stats.supercalls);
|
|
}
|
|
|
printf("SUM: %d instructions (dynamic, functional units stats) depend: %d%%\n", all, (dependall * 100) / SD(all));
|
printf("SUM: %d instructions (dynamic, functional units stats) depend: %d%%\n", all, (dependall * 100) / SD(all));
|
printf("Byte ADD: %d instructions\n", mstats.byteadd);
|
printf("Byte ADD: %d instructions\n", mstats.byteadd);
|
printf("bnf: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
|
printf("bnf: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
|
printf(" %d (%d%%) not taken,", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
|
printf(" %d (%d%%) not taken,", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
|
printf(" %d (%d%%) forward,", mstats.beqz.forward, (mstats.beqz.forward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));
|
printf(" %d (%d%%) forward,", mstats.beqz.forward, (mstats.beqz.forward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));
|