-
Notifications
You must be signed in to change notification settings - Fork 3
/
lru.c
79 lines (62 loc) · 1.67 KB
/
lru.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "lru.h"
PGB_FUNC void lru_init(struct lru_state* lru)
{
var i;
lru->age_current = 1;
for(i = 0; i != lru->slots_count; i++)
{
lru->slots[i].age = 0;
lru->slots[i].token_address = ~0;
lru->slots[i].token_bank = 0;
}
}
PGB_FUNC struct lru_slot* lru_get_read(struct lru_state* lru, word address, word bank)
{
var i;
if(address < 0x4000)
bank = 0;
for(i = 0; i != lru->slots_count; i++)
{
struct lru_slot* slot = &lru->slots[i];
if(slot->token_bank != bank)
continue;
if(slot->token_address != address)
continue;
return slot;
}
return NULL;
}
PGB_FUNC struct lru_slot* lru_get_write(struct lru_state* lru, word address, word bank, var* isnew)
{
var i;
struct lru_slot* slot;
var current_age = lru->age_current;
var oldest_i = 0;
var oldest_age = 0;
if(address < 0x4000)
bank = 0;
for(i = 0; i != lru->slots_count; i++)
{
slot = &lru->slots[i];
if(slot->token_bank != bank || slot->token_address != address)
{
var age_offs = current_age - slot->age; // overflow behavior
if(age_offs > oldest_age)
{
oldest_i = i;
oldest_age = age_offs;
}
continue;
}
if(isnew)
*isnew = 0;
return slot;
}
slot = &lru->slots[oldest_i];
//slot->token_address = address;
//slot->token_bank = bank;
slot->age = (lru->age_current)++;
if(isnew)
*isnew = 1;
return slot;
}