36 #include "debug/StoreSet.hh"
39 : clearPeriod(clear_period), SSITSize(_SSIT_size), LFSTSize(_LFST_size)
46 fatal(
"Invalid SSIT size!\n");
57 fatal(
"Invalid LFST size!\n");
123 bool valid_load_SSID =
validSSIT[load_index];
124 bool valid_store_SSID =
validSSIT[store_index];
126 if (!valid_load_SSID && !valid_store_SSID) {
132 SSIT[load_index] = new_set;
136 SSIT[store_index] = new_set;
141 "storeset, creating a new one: %i for load %#x, store %#x\n",
142 new_set, load_PC, store_PC);
143 }
else if (valid_load_SSID && !valid_store_SSID) {
148 SSIT[store_index] = load_SSID;
153 "store to that set: %i for load %#x, store %#x\n",
154 load_SSID, load_PC, store_PC);
155 }
else if (!valid_load_SSID && valid_store_SSID) {
156 SSID store_SSID =
SSIT[store_index];
160 SSIT[load_index] = store_SSID;
163 "load %#x, store %#x\n",
164 store_SSID, load_PC, store_PC);
167 SSID store_SSID =
SSIT[store_index];
172 if (store_SSID > load_SSID) {
173 SSIT[store_index] = load_SSID;
176 "for load %#x, store %#x\n",
177 load_SSID, load_PC, store_PC);
179 SSIT[load_index] = store_SSID;
182 "for load %#x, store %#x\n",
183 store_SSID, load_PC, store_PC);
193 DPRINTF(
StoreSet,
"Wiping predictor state beacuse %d ld/st executed\n",
227 LFST[store_SSID] = store_seq_num;
234 store_PC, store_SSID);
261 "dependency\n", PC, index, inst_SSID);
266 "inum of %i\n", PC, index, inst_SSID,
LFST[inst_SSID]);
268 return LFST[inst_SSID];
304 if (
validLFST[store_SSID] &&
LFST[store_SSID] == issued_seq_num) {
321 idx = (*store_list_it).second;
323 if ((*store_list_it).first <= squashed_num) {
327 bool younger =
LFST[idx] > squashed_num;
362 while (store_list_it !=
storeList.end()) {
363 cprintf(
"%i: [sn:%lli] SSID:%i\n",
364 num, (*store_list_it).first, (*store_list_it).second);
Implements a store set predictor for determining if memory instructions are dependent upon each other...
SSID calcSSID(Addr PC)
Calculates a Store Set ID based on the PC.
void insertLoad(Addr load_PC, InstSeqNum load_seq_num)
Inserts a load into the store set predictor.
~StoreSet()
Default destructor.
std::vector< bool > validSSIT
Bit vector to tell if the SSIT has a valid entry.
int calcIndex(Addr PC)
Calculates the index into the SSIT based on the PC.
std::map< InstSeqNum, int, ltseqnum >::iterator SeqNumMapIt
int indexMask
Mask to obtain the index.
void init(uint64_t clear_period, int SSIT_size, int LFST_size)
Initializes the store set predictor with the given table sizes.
std::vector< InstSeqNum > LFST
Last Fetched Store Table.
InstSeqNum checkInst(Addr PC)
Checks if the instruction with the given PC is dependent upon any store.
StoreSet()
Default constructor.
void squash(InstSeqNum squashed_num, ThreadID tid)
Squashes for a specific thread until the given sequence number.
uint64_t clearPeriod
Number of loads/stores to process before wiping predictor so all entries don't get saturated...
void clear()
Resets all tables.
bool isPowerOf2(const T &n)
int LFSTSize
Last Fetched Store Table size, in entries.
std::map< InstSeqNum, int, ltseqnum > storeList
Map of stores that have been inserted into the store set, but not yet issued or squashed.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
void violation(Addr store_PC, Addr load_PC)
Records a memory ordering violation between the younger load and the older store. ...
int memOpsPred
Number of memory operations predicted since last clear of predictor.
void checkClear()
Clears the store set predictor every so often so that all the entries aren't used and stores are cons...
int SSITSize
Store Set ID Table size, in entries.
int16_t ThreadID
Thread index/ID type.
void issued(Addr issued_PC, InstSeqNum issued_seq_num, bool is_store)
Records this PC/sequence number as issued.
std::vector< SSID > SSIT
The Store Set ID Table.
std::vector< bool > validLFST
Bit vector to tell if the LFST has a valid entry.
void insertStore(Addr store_PC, InstSeqNum store_seq_num, ThreadID tid)
Inserts a store into the store set predictor.
void dump()
Debug function to dump the contents of the store list.
void cprintf(const char *format, const Args &...args)