# HG changeset patch # Parent b7b46e77ed2f01bf34182ff25f18e1240903b47c diff -r b7b46e77ed2f src/mem/cache/prefetch/stride.cc --- a/src/mem/cache/prefetch/stride.cc Fri Sep 06 10:51:27 2013 -0500 +++ b/src/mem/cache/prefetch/stride.cc Fri Sep 06 10:55:13 2013 -0500 @@ -67,12 +67,17 @@ bool stride_match = (new_stride == (*iter)->stride); if (stride_match && new_stride != 0) { + (*iter)->tolerance = true; if ((*iter)->confidence < Max_Conf) (*iter)->confidence++; } else { - (*iter)->stride = new_stride; - if ((*iter)->confidence > Min_Conf) - (*iter)->confidence = 0; + if (!((*iter)->tolerance)) { + (*iter)->stride = new_stride; + if ((*iter)->confidence > Min_Conf) + (*iter)->confidence = 0; + } else { + (*iter)->tolerance = false; + } } DPRINTF(HWPrefetch, "hit: PC %x data_addr %x stride %d (%s), conf %d\n", @@ -85,7 +90,7 @@ return; for (int d = 1; d <= degree; d++) { - Addr new_addr = data_addr + d * new_stride; + Addr new_addr = data_addr + d * (*iter)->stride; if (pageStop && !samePage(data_addr, new_addr)) { // Spanned the page, so now stop pfSpanPage += degree - d + 1; @@ -124,6 +129,7 @@ new_entry->missAddr = data_addr; new_entry->stride = 0; new_entry->confidence = 0; + new_entry->tolerance = false; tab.push_back(new_entry); } } diff -r b7b46e77ed2f src/mem/cache/prefetch/stride.hh --- a/src/mem/cache/prefetch/stride.hh Fri Sep 06 10:51:27 2013 -0500 +++ b/src/mem/cache/prefetch/stride.hh Fri Sep 06 10:55:13 2013 -0500 @@ -59,6 +59,7 @@ Addr missAddr; int stride; int confidence; + bool tolerance; }; Addr *lastMissAddr[Max_Contexts];