/* D1 cache simulator, generated by vg_cachegen. * total size = 65536 bytes * line size = 64 bytes * associativity = 2-way associative * * This file should be #include-d into vg_cachesim.c */ static char D1_desc_line[] = "desc: D1 cache: 65536 B, 64 B, 2-way associative\n"; static UInt D1_tags[512][2]; static void cachesim_D1_initcache(void) { UInt set, way; for (set = 0; set < 512; set++) for (way = 0; way < 2; way++) D1_tags[set][way] = 0; } static __inline__ void cachesim_D1_doref(Addr a, UChar size, ULong* m1, ULong *m2) { register UInt set1 = ( a >> 6) & (512-1); register UInt set2 = ((a + size - 1) >> 6) & (512-1); register UInt tag = a >> (6 + 9); if (set1 == set2) { if (tag == D1_tags[set1][0]) { return; } else if (tag == D1_tags[set1][1]) { D1_tags[set1][1] = D1_tags[set1][0]; D1_tags[set1][0] = tag; return; } else { /* A miss */ D1_tags[set1][1] = D1_tags[set1][0]; D1_tags[set1][0] = tag; (*m1)++; cachesim_L2_doref(a, size, m2); } } else if ((set1 + 1) % 512 == set2) { Bool is_D1_miss = False; /* Block one */ if (tag == D1_tags[set1][0]) { } else if (tag == D1_tags[set1][1]) { D1_tags[set1][1] = D1_tags[set1][0]; D1_tags[set1][0] = tag; } else { /* A miss */ D1_tags[set1][1] = D1_tags[set1][0]; D1_tags[set1][0] = tag; is_D1_miss = True; } /* Block two */ if (tag == D1_tags[set2][0]) { } else if (tag == D1_tags[set2][1]) { D1_tags[set2][1] = D1_tags[set2][0]; D1_tags[set2][0] = tag; } else { /* A miss */ D1_tags[set2][1] = D1_tags[set2][0]; D1_tags[set2][0] = tag; is_D1_miss = True; } /* Miss treatment */ if (is_D1_miss) { (*m1)++; cachesim_L2_doref(a, size, m2); } } else { VG_(printf)("\nERROR: Data item 0x%x of size %u bytes is in two non-adjacent\n", a, size); VG_(printf)("sets %d and %d.\n", set1, set2); VG_(panic)("D1 cache set mismatch"); } }