From ec29b81418af4a41e87925e0eb549cf273e234dd Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 29 Apr 2016 17:57:02 -0400 Subject: [PATCH] Slightly reorganized cache_access. Moved set re-linking to new function update_set. --- csim.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/csim.c b/csim.c index 0662f18..5cbffdf 100644 --- a/csim.c +++ b/csim.c @@ -73,6 +73,7 @@ void print_set(linked_line* line); /* Cache access functions */ char cache_access(linked_line** cache, long address, int set_bits, int block_offset_bits, long num_lines); linked_line* find_line(linked_line* set_head, long tag); +linked_line* update_set(linked_line* old_head, linked_line* new_head); //linked_line* move_to_head(linked_line* new_head, linked_line* old_head); @@ -403,30 +404,21 @@ char cache_access(linked_line** cache, long address, linked_line* line = find_line(set_head, tag); if (!line->validity) { - out = 'M'; + operation = 'M'; } else if (line->tag == tag) { - out = 'H'; + operation = 'H'; } else { - out = 'E'; - } - - if(!(line == set_head)) { - line->newer->older = line->older; - if(line->older) { - line->older->newer = line->newer; - } - line->newer = NULL; - line->older = set_head; - set_head->newer = line; - cache[set] = line; + operation = 'E'; } line->tag = tag; line->validity = 1; - return out; + cache[set] = update_set(set_head, line); + + return operation; } /** @@ -448,4 +440,24 @@ linked_line* find_line(linked_line* line, long tag) } } +/** + Updates the use order of a set by moving the line being accessed in front of + the previously-accessed line and linking the neighbors of the new head. + @param old_head The previous most-recently modified line of the set. + @param new_head The line of the set being accessed. + @return new_head + */ +linked_line* update_set(linked_line* old_head, linked_line* new_head) { + if(!(new_head == old_head)) { + new_head->newer->older = new_head->older; + if(new_head->older) { + new_head->older->newer = new_head->newer; + } + new_head->newer = NULL; + new_head->older = old_head; + old_head->newer = new_head; + } + return new_head; +} +