use crate::soc::cache::prefetch::Prefetcher;
use crate::soc::cache::prefetch::StreamPrefetcher;
const LINE: u64 = 64;
#[test]
fn no_prefetch_on_first_access() {
let mut pf = StreamPrefetcher::new(64, 1);
let addrs = pf.observe(0x1000, None, false);
assert!(addrs.is_empty());
}
#[test]
fn no_prefetch_at_confidence_1() {
let mut pf = StreamPrefetcher::new(64, 1);
pf.observe(0x1000, None, false);
let addrs = pf.observe(0x1000 + LINE, None, false);
assert!(addrs.is_empty(), "Confidence 1 is not enough");
}
#[test]
fn ascending_stream_triggers_prefetch() {
let mut pf = StreamPrefetcher::new(64, 1);
pf.observe(0x1000, None, false); pf.observe(0x1000 + LINE, None, false); let addrs = pf.observe(0x1000 + 2 * LINE, None, false); assert_eq!(addrs.len(), 1);
let expected = (0x1000 + 2 * LINE) + LINE;
assert_eq!(addrs[0], expected);
}
#[test]
fn ascending_degree_2() {
let mut pf = StreamPrefetcher::new(64, 2);
pf.observe(0x2000, None, false);
pf.observe(0x2000 + LINE, None, false);
let addrs = pf.observe(0x2000 + 2 * LINE, None, false);
assert_eq!(addrs.len(), 2);
assert_eq!(addrs[0], 0x2000 + 3 * LINE);
assert_eq!(addrs[1], 0x2000 + 4 * LINE);
}
#[test]
fn descending_stream_triggers_prefetch() {
let mut pf = StreamPrefetcher::new(64, 1);
pf.observe(0x2000, None, false);
pf.observe(0x2000 - LINE, None, false); let addrs = pf.observe(0x2000 - 2 * LINE, None, false); assert_eq!(addrs.len(), 1);
let current = 0x2000 - 2 * LINE;
let expected = current.wrapping_sub(LINE);
assert_eq!(addrs[0], expected);
}
#[test]
fn non_sequential_decays_confidence() {
let mut pf = StreamPrefetcher::new(64, 1);
pf.observe(0x1000, None, false);
pf.observe(0x1000 + LINE, None, false); let addrs = pf.observe(0x5000, None, false);
assert!(addrs.is_empty(), "Non-sequential should not prefetch");
}
#[test]
fn direction_switch_resets_confidence() {
let mut pf = StreamPrefetcher::new(64, 1);
pf.observe(0x1000, None, false);
pf.observe(0x1000 + LINE, None, false); pf.observe(0x1000 + 2 * LINE, None, false);
let current = 0x1000 + 2 * LINE;
pf.observe(current - LINE, None, false); let addrs = pf.observe(current - 2 * LINE, None, false); assert_eq!(addrs.len(), 1, "Descending should prefetch after rebuilding confidence");
}