#include "ExistHitPrevUDomain.h" using namespace otawa; namespace lrusecurity { ExistHitPrevUDomain::ExistHitPrevUDomain( const icat3::LBlockCollection& coll, int set, const t *init) : _n(coll[set].count()), _bot(_n), _top(_n, Address(0x0)),//TO CHANGE _set(set), _coll(coll), _A(coll.A()), _init(init ? *init : _top), _tmp(_n) { } bool ExistHitPrevUDomain::equals(const t& acss, const t& bcss) const { for (int i = 0; i < _n; i++) if (acss[i] != bcss[i]) return false; return true; } void ExistHitPrevUDomain::join(t& dcss, const t& scss, icat3::ACS d_eh, icat3::ACS s_eh) { for (int i = 0; i < _n; i++){ if (s_eh[i] < d_eh[i] || (d_eh[i] == -1 && s_eh[i] != -1)){ dcss[i] = scss[i]; } else if (s_eh[i] == d_eh[i]){ int fullsize = (dcss[i]).size()+(scss[i]).size(); Bag
tmp = Bag
(fullsize); for (int j = 0; j < fullsize; j++){ if (j < (dcss[i]).size()) tmp[j] = dcss[i][j] ; else tmp[j] = scss[i][j-dcss[i].size()]; } dcss[i] = tmp; } } } void ExistHitPrevUDomain::fetch(t& acss, const icache::Access& access, lrupreanalysis::eh_em::ACSManager& ehManager) { icat3::LBlock *lb = icat3::LBLOCK(access); int b = lb->index(); for (int i = 0; i < _n; i++){ if (i == b){ Address smol[] = {access.address()}; acss[i] = Bag
(1,smol);} else if (ehManager.existHitAge(lb) == _A) acss[i] = Bag
(); } } void ExistHitPrevUDomain::update(const icache::Access& access, t& a, lrupreanalysis::eh_em::ACSManager& ehManager) { switch(access.kind()) { case icache::FETCH: if(_coll.cache()->set(access.address()) == _set) fetch(a, access, ehManager); break; case icache::PREFETCH: if(_coll.cache()->set(access.address()) == _set) { copy(_tmp, a); fetch(a, access, ehManager); join(a, _tmp, icat3::ACS(), icat3::ACS()); } break; case icache::NONE: break; default: ASSERT(false); } } } // namespace lrusecurity