tage.cc (13454:19a5b4fb1f1f) tage.cc (13455:56e25a5f9603)
1/*
2 * Copyright (c) 2014 The University of Wisconsin
3 *
4 * Copyright (c) 2006 INRIA (Institut National de Recherche en
5 * Informatique et en Automatique / French National Research Institute
6 * for Computer Science and Applied Mathematics)
7 *
8 * All rights reserved.

--- 334 unchanged lines hidden (view full) ---

343 bi->longestMatchPred =
344 gtable[bi->hitBank][tableIndices[bi->hitBank]].ctr >= 0;
345 bi->pseudoNewAlloc =
346 abs(2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) <= 1;
347
348 //if the entry is recognized as a newly allocated entry and
349 //useAltPredForNewlyAllocated is positive use the alternate
350 //prediction
1/*
2 * Copyright (c) 2014 The University of Wisconsin
3 *
4 * Copyright (c) 2006 INRIA (Institut National de Recherche en
5 * Informatique et en Automatique / French National Research Institute
6 * for Computer Science and Applied Mathematics)
7 *
8 * All rights reserved.

--- 334 unchanged lines hidden (view full) ---

343 bi->longestMatchPred =
344 gtable[bi->hitBank][tableIndices[bi->hitBank]].ctr >= 0;
345 bi->pseudoNewAlloc =
346 abs(2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) <= 1;
347
348 //if the entry is recognized as a newly allocated entry and
349 //useAltPredForNewlyAllocated is positive use the alternate
350 //prediction
351 if ((useAltPredForNewlyAllocated < 0)
352 || abs(2 *
353 gtable[bi->hitBank][tableIndices[bi->hitBank]].ctr + 1) > 1)
351 if ((useAltPredForNewlyAllocated < 0) || ! bi->pseudoNewAlloc) {
354 bi->tagePred = bi->longestMatchPred;
352 bi->tagePred = bi->longestMatchPred;
355 else
353 bi->provider = TAGE_LONGEST_MATCH;
354 } else {
356 bi->tagePred = bi->altTaken;
355 bi->tagePred = bi->altTaken;
356 bi->provider = bi->altBank ? TAGE_ALT_MATCH
357 : BIMODAL_ALT_MATCH;
358 }
357 } else {
358 bi->altTaken = getBimodePred(pc, bi);
359 bi->tagePred = bi->altTaken;
360 bi->longestMatchPred = bi->altTaken;
359 } else {
360 bi->altTaken = getBimodePred(pc, bi);
361 bi->tagePred = bi->altTaken;
362 bi->longestMatchPred = bi->altTaken;
363 bi->provider = BIMODAL_ONLY;
361 }
362 //end TAGE prediction
363
364 pred_taken = (bi->tagePred);
365 DPRINTF(Tage, "Predict for %lx: taken?:%d, tagePred:%d, altPred:%d\n",
366 branch_pc, pred_taken, bi->tagePred, bi->altTaken);
367 }
368 bi->branchPC = branch_pc;

--- 16 unchanged lines hidden (view full) ---

385 squash(tid, taken, bp_history);
386 return;
387 }
388
389 int nrand = random_mt.random<int>(0,3);
390 if (bi->condBranch) {
391 DPRINTF(Tage, "Updating tables for branch:%lx; taken?:%d\n",
392 branch_pc, taken);
364 }
365 //end TAGE prediction
366
367 pred_taken = (bi->tagePred);
368 DPRINTF(Tage, "Predict for %lx: taken?:%d, tagePred:%d, altPred:%d\n",
369 branch_pc, pred_taken, bi->tagePred, bi->altTaken);
370 }
371 bi->branchPC = branch_pc;

--- 16 unchanged lines hidden (view full) ---

388 squash(tid, taken, bp_history);
389 return;
390 }
391
392 int nrand = random_mt.random<int>(0,3);
393 if (bi->condBranch) {
394 DPRINTF(Tage, "Updating tables for branch:%lx; taken?:%d\n",
395 branch_pc, taken);
396 updateStats(taken, bi);
393 condBranchUpdate(branch_pc, taken, bi, nrand);
394 }
395 if (!squashed) {
396 delete bi;
397 }
398}
399
400void

--- 196 unchanged lines hidden (view full) ---

597{
598 DPRINTF(Tage, "UnConditionalBranch: %lx\n", br_pc);
599 predict(tid, br_pc, false, bp_history);
600 updateHistories(tid, br_pc, true, bp_history);
601 assert(threadHistory[tid].gHist ==
602 &threadHistory[tid].globalHistory[threadHistory[tid].ptGhist]);
603}
604
397 condBranchUpdate(branch_pc, taken, bi, nrand);
398 }
399 if (!squashed) {
400 delete bi;
401 }
402}
403
404void

--- 196 unchanged lines hidden (view full) ---

601{
602 DPRINTF(Tage, "UnConditionalBranch: %lx\n", br_pc);
603 predict(tid, br_pc, false, bp_history);
604 updateHistories(tid, br_pc, true, bp_history);
605 assert(threadHistory[tid].gHist ==
606 &threadHistory[tid].globalHistory[threadHistory[tid].ptGhist]);
607}
608
609void
610TAGE::updateStats(bool taken, TageBranchInfo* bi)
611{
612 if (taken == bi->tagePred) {
613 // correct prediction
614 switch (bi->provider) {
615 case BIMODAL_ONLY: tageBimodalProviderCorrect++; break;
616 case TAGE_LONGEST_MATCH: tageLongestMatchProviderCorrect++; break;
617 case BIMODAL_ALT_MATCH: bimodalAltMatchProviderCorrect++; break;
618 case TAGE_ALT_MATCH: tageAltMatchProviderCorrect++; break;
619 }
620 } else {
621 // wrong prediction
622 switch (bi->provider) {
623 case BIMODAL_ONLY: tageBimodalProviderWrong++; break;
624 case TAGE_LONGEST_MATCH:
625 tageLongestMatchProviderWrong++;
626 if (bi->altTaken == taken) {
627 tageAltMatchProviderWouldHaveHit++;
628 }
629 break;
630 case BIMODAL_ALT_MATCH:
631 bimodalAltMatchProviderWrong++;
632 break;
633 case TAGE_ALT_MATCH:
634 tageAltMatchProviderWrong++;
635 break;
636 }
637
638 switch (bi->provider) {
639 case BIMODAL_ALT_MATCH:
640 case TAGE_ALT_MATCH:
641 if (bi->longestMatchPred == taken) {
642 tageLongestMatchProviderWouldHaveHit++;
643 }
644 }
645 }
646
647 switch (bi->provider) {
648 case TAGE_LONGEST_MATCH:
649 case TAGE_ALT_MATCH:
650 tageLongestMatchProvider[bi->hitBank]++;
651 tageAltMatchProvider[bi->altBank]++;
652 break;
653 }
654}
655
656void
657TAGE::regStats()
658{
659 BPredUnit::regStats();
660
661 tageLongestMatchProviderCorrect
662 .name(name() + ".tageLongestMatchProviderCorrect")
663 .desc("Number of times TAGE Longest Match is the provider and "
664 "the prediction is correct");
665
666 tageAltMatchProviderCorrect
667 .name(name() + ".tageAltMatchProviderCorrect")
668 .desc("Number of times TAGE Alt Match is the provider and "
669 "the prediction is correct");
670
671 bimodalAltMatchProviderCorrect
672 .name(name() + ".bimodalAltMatchProviderCorrect")
673 .desc("Number of times TAGE Alt Match is the bimodal and it is the "
674 "provider and the prediction is correct");
675
676 tageBimodalProviderCorrect
677 .name(name() + ".tageBimodalProviderCorrect")
678 .desc("Number of times there are no hits on the TAGE tables "
679 "and the bimodal prediction is correct");
680
681 tageLongestMatchProviderWrong
682 .name(name() + ".tageLongestMatchProviderWrong")
683 .desc("Number of times TAGE Longest Match is the provider and "
684 "the prediction is wrong");
685
686 tageAltMatchProviderWrong
687 .name(name() + ".tageAltMatchProviderWrong")
688 .desc("Number of times TAGE Alt Match is the provider and "
689 "the prediction is wrong");
690
691 bimodalAltMatchProviderWrong
692 .name(name() + ".bimodalAltMatchProviderWrong")
693 .desc("Number of times TAGE Alt Match is the bimodal and it is the "
694 "provider and the prediction is wrong");
695
696 tageBimodalProviderWrong
697 .name(name() + ".tageBimodalProviderWrong")
698 .desc("Number of times there are no hits on the TAGE tables "
699 "and the bimodal prediction is wrong");
700
701 tageAltMatchProviderWouldHaveHit
702 .name(name() + ".tageAltMatchProviderWouldHaveHit")
703 .desc("Number of times TAGE Longest Match is the provider, "
704 "the prediction is wrong and Alt Match prediction was correct");
705
706 tageLongestMatchProviderWouldHaveHit
707 .name(name() + ".tageLongestMatchProviderWouldHaveHit")
708 .desc("Number of times TAGE Alt Match is the provider, the "
709 "prediction is wrong and Longest Match prediction was correct");
710
711 tageLongestMatchProvider
712 .init(nHistoryTables + 1)
713 .name(name() + ".tageLongestMatchProvider")
714 .desc("TAGE provider for longest match");
715
716 tageAltMatchProvider
717 .init(nHistoryTables + 1)
718 .name(name() + ".tageAltMatchProvider")
719 .desc("TAGE provider for alt match");
720}
721
605TAGE*
606TAGEParams::create()
607{
608 return new TAGE(this);
609}
722TAGE*
723TAGEParams::create()
724{
725 return new TAGE(this);
726}