クラス Onikiri::MemOrderManager

#include <MemOrderManager.h>

Onikiri::MemOrderManagerに対する継承グラフ

Inheritance graph
[凡例]
Onikiri::MemOrderManagerのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public 型

typedef HookPoint< MemOrderManager,
MemImageAccessParam
MemImageAccessHook

Public メソッド

void Allocate (OpIterator op)
 BEGIN_PARAM_PATH (GetParamPath()) BEGIN_PARAM_PATH(GetResultPath()) MemOrderManager()
bool CanAllocate (OpIterator *infoArray, int numOp)
void Commit (OpIterator op)
virtual void Finalize ()
void Finished (OpIterator op)
void Flush (OpIterator op)
OpIterator GetConsumerLoad (OpIterator producer, const MemAccess &access, int index)
CoreGetCore () const
MemIFGetMemImage () const
OpIterator GetProducerStore (OpIterator op, const MemAccess &access) const
virtual void Initialize (InitPhase phase)
bool IsIdealPatialLoadEnabled () const
void Read (OpIterator op, MemAccess *access)
void Retire (OpIterator op)
void Write (OpIterator op, MemAccess *access)
virtual ~MemOrderManager ()

Static Public 変数

static MemImageAccessHook s_readMemImageHook
static MemImageAccessHook s_writeMemImageHook

Protected 型

typedef DataPredMissRecovery Recovery

Protected メソッド

void Delete (OpIterator op)
void DetectAccessOrderViolation (OpIterator store)
bool DetectPartialLoadViolation (OpIterator op)
void ReadMemImage (OpIterator op, MemAccess *access)
void WriteMemImage (OpIterator op, MemAccess *access)

Protected 変数

Cachem_cache
int m_cacheLatency
CacheSystemm_cacheSystem
Corem_core
EmulatorIFm_emulator
bool m_idealPartialLoad
int m_loadCapacity
OpList m_loadList
MemOrderOperations m_memOperations
s64 m_numExecutedLoadAccess
s64 m_numExecutedStoreForwarding
s64 m_numRetiredLoadAccess
s64 m_numRetiredStoreForwarding
bool m_removeOpsOnCommit
int m_storeCapacity
OpList m_storeList
bool m_unified
int m_unifiedCapacity

構成

struct  MemImageAccessParam

説明

MemOrderManager.h51 行で定義されています。


型定義

typedef HookPoint<MemOrderManager, MemImageAccessParam> Onikiri::MemOrderManager::MemImageAccessHook

MemOrderManager.h134 行で定義されています。

typedef DataPredMissRecovery Onikiri::MemOrderManager::Recovery [protected]

MemOrderManager.h140 行で定義されています。


コンストラクタとデストラクタ

MemOrderManager::~MemOrderManager (  )  [virtual]

MemOrderManager.cpp82 行で定義されています。

00083 {
00084 }


関数

void MemOrderManager::Allocate ( OpIterator  op  ) 

MemOrderManager.cpp221 行で定義されています。

参照先 ASSERTOnikiri::OpClass::IsLoad()Onikiri::OpClass::IsMem()m_loadListm_storeListOnikiri::OpList::push_back().

参照元 Onikiri::InorderSystem::Run().

00222 {
00223     const OpClass& opClass = op->GetOpClass();
00224     ASSERT( opClass.IsMem() );
00225     if( opClass.IsLoad() ){
00226         m_loadList.push_back( op );
00227     }
00228     else{
00229         m_storeList.push_back( op );
00230     }
00231 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

Onikiri::MemOrderManager::BEGIN_PARAM_PATH ( GetParamPath()   ) 

bool MemOrderManager::CanAllocate ( OpIterator infoArray,
int  numOp 
)

MemOrderManager.cpp199 行で定義されています。

参照先 Onikiri::OpClassCode::IsLoad()Onikiri::OpClassCode::IsStore()m_loadCapacitym_loadListm_storeCapacitym_storeListm_unifiedm_unifiedCapacityOnikiri::OpList::size().

00200 {
00201     if( m_unified ){
00202         return m_unifiedCapacity >= (int)m_storeList.size() + (int)m_loadList.size() + numOp;
00203     }
00204     else{
00205         int loads  = 0;
00206         int stores = 0;
00207         for( int i = 0; i < numOp; ++i ){
00208             if( infoArray[i]->GetOpClass().IsStore() ){
00209                 stores++;
00210             }
00211             if( infoArray[i]->GetOpClass().IsLoad() ){
00212                 loads++;
00213             }
00214         }
00215         return 
00216             ( m_loadCapacity  >= ((int)m_loadList.size() + loads) ) &&
00217             ( m_storeCapacity >= ((int)m_storeList.size() + stores) );
00218     }
00219 }

関数の呼び出しグラフ:

void MemOrderManager::Commit ( OpIterator  op  ) 

MemOrderManager.cpp324 行で定義されています。

参照先 Delete()Onikiri::OpClass::IsLoad()Onikiri::OpClass::IsStore()m_cachem_numRetiredLoadAccessm_numRetiredStoreForwardingm_removeOpsOnCommitOnikiri::MemAccess::MAR_SUCCESSOnikiri::CacheAccess::OT_WRITERUNTIME_WARNINGOnikiri::Cache::Write()WriteMemImage().

参照元 Onikiri::InorderList::NotifyCommit()Onikiri::InorderSystem::Run().

00325 {
00326     // O
00327     const OpClass& opClass = op->GetOpClass();
00328     if( opClass.IsStore() ){
00329 
00330         // G~[^C[W
00331         MemAccess writeAccess = op->GetMemAccess();
00332         WriteMemImage( op, &writeAccess );
00333 
00334         if( writeAccess.result != MemAccess::MAR_SUCCESS ){
00335             RUNTIME_WARNING( 
00336                 "An access violation occurs.\n%s\n%s",
00337                 writeAccess.ToString().c_str(), op->ToString().c_str() 
00338             );
00339         }
00340 
00341         if( m_cache )   {
00342             CacheAccess access( op->GetMemAccess(), op, CacheAccess::OT_WRITE );
00343             CacheAccessResult result = 
00344                 m_cache->Write( access, NULL ); // LbV
00345             op->SetCacheAccessResult( result );
00346         }
00347     }
00348 
00349     if( opClass.IsLoad() ){
00350         const MemAccess& readAccess = op->GetMemAccess();
00351         if( readAccess.result != MemAccess::MAR_SUCCESS ){
00352             RUNTIME_WARNING( 
00353                 "An access violation occurs.\n%s\n%s",
00354                 readAccess.ToString().c_str(), op->ToString().c_str() 
00355             );
00356         }
00357 
00358         // Update dispersion of load accesses
00359         const CacheAccessResult& result = op->GetCacheAccessResult();
00360         if( result.cache == NULL ){ // NULL is store forwarding.
00361             m_numRetiredStoreForwarding++;
00362         }
00363         m_numRetiredLoadAccess++;
00364     }
00365 
00366     if( m_removeOpsOnCommit ){
00367         Delete( op );
00368     }
00369 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Delete ( OpIterator  op  )  [protected]

MemOrderManager.cpp383 行で定義されています。

参照先 Onikiri::OpList::erase()Onikiri::OpClass::IsLoad()Onikiri::OpClass::IsStore()m_loadListm_storeListOnikiri::OpStatus::OS_FETCH.

参照元 Commit()Flush()Retire().

00384 {
00385     if( op->GetStatus() == OpStatus::OS_FETCH ){
00386         return;
00387     }
00388 
00389     const OpClass& opClass = op->GetOpClass();
00390     if( opClass.IsLoad() ) {
00391         m_loadList.erase(op);
00392     }
00393     else if( opClass.IsStore() ){
00394         m_storeList.erase(op);
00395     }
00396 
00397 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::DetectAccessOrderViolation ( OpIterator  store  )  [protected]

MemOrderManager.cpp129 行で定義されています。

参照先 ASSERTOnikiri::OpList::count()Onikiri::DS_ADDRESS_PREDICTION_MISSOnikiri::Dumper::Dump()Onikiri::g_dumperGetConsumerLoad()m_storeListOnikiri::Recoverer::RecoverDataPredMiss()THROW_RUNTIME_ERROROnikiri::DataPredMissRecovery::TYPE_ADDRESS_MATCH.

参照元 Finished().

00130 {
00131     /*
00132     F
00133     vOI[_
00134 
00135     store1   [A] = Y --- op
00136     load1    U   = [A]
00137     store2   [A] = Z
00138     load2    V   = [A]
00139     
00140      store1 XPW[OAload1, load2XPW[O
00141     Aload1store1タsAload1, load2XPW[O
00142     */
00143 
00144     // store G[
00145     ASSERT( store->GetOpClass().IsStore(), "Not store op." );
00146 
00147     // m store G[
00148     ASSERT( m_storeList.count(store) == 1, "unknown op." );
00149 
00150     OpIterator conflictedConsumer = GetConsumerLoad( store, store->GetMemAccess(), 0 );
00151 
00152     if( !conflictedConsumer.IsNull() ){
00153         
00154         if( store->GetSerialID() >= conflictedConsumer->GetSerialID() ) {
00155             THROW_RUNTIME_ERROR("memory order is not inorder.");
00156         }
00157         
00158         g_dumper.Dump( DS_ADDRESS_PREDICTION_MISS, conflictedConsumer );
00159         
00160         // MemDepPred m
00161         store->GetThread()->GetMemDepPred()->OrderConflicted( store, conflictedConsumer );
00162 
00163         // 
00164         Recoverer* recoverer = store->GetThread()->GetRecoverer();
00165         recoverer->RecoverDataPredMiss( 
00166             store, 
00167             conflictedConsumer, 
00168             Recovery::TYPE_ADDRESS_MATCH 
00169         );
00170 
00171     }
00172 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

bool MemOrderManager::DetectPartialLoadViolation ( OpIterator  op  )  [protected]

MemOrderManager.cpp176 行で定義されています。

参照先 GetProducerStore()Onikiri::MemAccess::MAR_READ_INVALID_PARTIAL_READOnikiri::Recoverer::RecoverDataPredMiss()Onikiri::DataPredMissRecovery::TYPE_PARTIAL_LOAD.

参照元 Finished().

00177 {
00178     if( op->GetOpClass().IsLoad() ){
00179         // Validate whether invalid partial read occurs or not.
00180         // If invalid partial read occurs, MAR_READ_INVALID_PARTIAL_READ is 
00181         // set to a result and need to recover.
00182         const MemAccess& mem = op->GetMemAccess();
00183         if( mem.result == MemAccess::MAR_READ_INVALID_PARTIAL_READ ){
00184             OpIterator producer = 
00185                 GetProducerStore( op, mem );
00186             Recoverer* recoverer = op->GetThread()->GetRecoverer();
00187 
00188             recoverer->RecoverDataPredMiss( 
00189                 producer, 
00190                 op, 
00191                 DataPredMissRecovery::TYPE_PARTIAL_LOAD 
00192             );
00193             return true;
00194         }
00195     }
00196     return false;
00197 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Finalize (  )  [virtual]

Onikiri::PhysicalResourceNodeを再定義しています。

MemOrderManager.cpp121 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::ReleaseParam().

00122 {
00123     ReleaseParam();
00124 }

関数の呼び出しグラフ:

void MemOrderManager::Finished ( OpIterator  op  ) 

MemOrderManager.cpp234 行で定義されています。

参照先 ASSERTOnikiri::OpList::count()DetectAccessOrderViolation()DetectPartialLoadViolation()Onikiri::OpClass::IsLoad()Onikiri::OpClass::IsStore()m_loadListm_storeList.

参照元 Onikiri::OpFinishEvent::Update().

00235 {
00236     const OpClass& opClass = op->GetOpClass();
00237     // Detect access order violation.
00238     if( opClass.IsStore() ){
00239         ASSERT( m_storeList.count(op) == 1, "unknown op." );
00240         DetectAccessOrderViolation( op );
00241     }
00242 
00243     if( opClass.IsLoad() ){
00244         ASSERT( m_loadList.count(op) == 1, "unknown op." );
00245         DetectPartialLoadViolation( op );
00246     }
00247 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Flush ( OpIterator  op  ) 

MemOrderManager.cpp378 行で定義されています。

参照先 Delete().

参照元 Onikiri::InorderList::NotifyFlush().

00379 {
00380     Delete( op );
00381 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

OpIterator MemOrderManager::GetConsumerLoad ( OpIterator  producer,
const MemAccess access,
int  index 
)

MemOrderManager.cpp287 行で定義されています。

参照先 ASSERTOnikiri::OpList::begin()Onikiri::OpList::count()Onikiri::OpList::end()Onikiri::OpClass::IsLoad()Onikiri::MemOrderOperations::IsOverlapped()m_loadListm_memOperationsm_storeListOnikiri::OpStatus::OS_EXECUTING.

参照元 DetectAccessOrderViolation()Onikiri::Op::GetFirstConsumer().

00288 {
00289     ASSERT( producer->GetOpClass().IsStore(), "Not store op." );
00290     ASSERT( m_storeList.count( producer ) == 1, "unknown op." );
00291 
00292     OpIterator consumer;
00293 
00294     int num = 0;
00295     for( OpList::iterator i = m_loadList.begin(); i != m_loadList.end(); ++i ){
00296         
00297         OpIterator op = *i;
00298         if( op->GetGlobalSerialID() < producer->GetGlobalSerialID() ){
00299             continue;
00300         }
00301 
00302         if( op->GetStatus() < OpStatus::OS_EXECUTING ){
00303             continue;
00304         }
00305 
00306         OpClass opClass = op->GetOpClass();
00307         if( !opClass.IsLoad() ){
00308             continue;
00309         }
00310 
00311         if( m_memOperations.IsOverlapped( producerAccess, op->GetMemAccess() ) ){
00312             if( num == index ){
00313                 consumer = op;
00314                 break;
00315             }
00316             num++;
00317         }
00318     }
00319 
00320     return consumer;
00321 
00322 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

Core* Onikiri::MemOrderManager::GetCore (  )  const [inline]

MemOrderManager.h125 行で定義されています。

参照先 m_core.

参照元 Initialize().

00125 { return m_core;                        }

Here is the caller graph for this function:

MemIF* Onikiri::MemOrderManager::GetMemImage (  )  const [inline]

MemOrderManager.h124 行で定義されています。

参照先 Onikiri::EmulatorIF::GetMemImage()m_emulator.

参照元 ReadMemImage()WriteMemImage().

00124 { return m_emulator->GetMemImage(); }

関数の呼び出しグラフ:

Here is the caller graph for this function:

OpIterator MemOrderManager::GetProducerStore ( OpIterator  op,
const MemAccess access 
) const

MemOrderManager.cpp251 行で定義されています。

参照先 Onikiri::MemAccess::addressASSERTOnikiri::OpList::begin()Onikiri::OpList::count()Onikiri::OpList::end()Onikiri::MemOrderOperations::IsOverlapped()m_loadListm_memOperationsm_storeListOnikiri::OpStatus::OS_EXECUTINGOnikiri::LogicalData::pid.

参照元 DetectPartialLoadViolation()Onikiri::MemExecUnit::GetProducerStore()Read().

00252 {
00253     ASSERT( access.address.pid != PID_INVALID );
00254 
00255     // AhXvsstoreMemOrderManagerAMemOrderManagerReads
00256     // m_listopuOT
00257     ASSERT( m_loadList.count(consumer) == 1, "unknown load:\n%s", consumer->ToString().c_str() );
00258 
00259     OpIterator producer = OpIterator(0);
00260 
00261     OpList::const_iterator i = m_storeList.end();
00262     while( i != m_storeList.begin() ) {
00263         --i;
00264 
00265         OpIterator op = *i;
00266 
00267         if( op->GetGlobalSerialID() > consumer->GetGlobalSerialID() ){
00268             continue;
00269         }
00270 
00271         if( op->GetStatus() < OpStatus::OS_EXECUTING ){
00272             continue;
00273         }
00274 
00275         // Gg[OpXgAAhXd
00276         if( op->GetOpClass().IsStore() &&
00277             m_memOperations.IsOverlapped( access, op->GetMemAccess() ) 
00278         ){
00279             producer = op;
00280             break;
00281         }
00282     };
00283 
00284     return producer;
00285 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Initialize ( InitPhase  phase  )  [virtual]

MemOrderManager.cpp86 行で定義されています。

参照先 Onikiri::PhysicalResourceNode::CheckNodeInitialized()GetCore()Onikiri::Core::GetFetcher()Onikiri::Fetcher::GetFetchWidth()Onikiri::CacheSystem::GetFirstLevelDataCache()Onikiri::EmulatorIF::GetISAInfo()Onikiri::Core::GetOpArray()Onikiri::Cache::GetStaticLatency()Onikiri::PhysicalResourceNode::INIT_POST_CONNECTIONOnikiri::PhysicalResourceNode::INIT_PRE_CONNECTIONOnikiri::ISAInfoIF::IsLittleEndian()Onikiri::ParamExchange::LoadParam()m_cachem_cacheLatencym_cacheSystemm_corem_emulatorm_loadCapacitym_loadListm_memOperationsm_storeCapacitym_storeListm_unifiedm_unifiedCapacityOnikiri::OpList::resize()Onikiri::MemOrderOperations::SetTargetEndian()THROW_RUNTIME_ERROR.

00087 {
00088     if( phase == INIT_PRE_CONNECTION ){
00089         LoadParam();
00090     }
00091     else if( phase == INIT_POST_CONNECTION ){
00092 
00093         // oZbg`FbN
00094         CheckNodeInitialized( "core", m_core );
00095         CheckNodeInitialized( "emulator", m_emulator );
00096         CheckNodeInitialized( "cacheSystem", m_cacheSystem );
00097 
00098         m_cache = m_cacheSystem->GetFirstLevelDataCache();
00099         m_cacheLatency = m_cache->GetStaticLatency();
00100 
00101         // List
00102         m_loadList.resize(*m_core->GetOpArray());
00103         m_storeList.resize(*m_core->GetOpArray());
00104         m_memOperations.SetTargetEndian( m_emulator->GetISAInfo()->IsLittleEndian() );
00105 
00106         int fetchWidth = GetCore()->GetFetcher()->GetFetchWidth();
00107         if( m_unified ){
00108             if( fetchWidth > m_unifiedCapacity ){
00109                 THROW_RUNTIME_ERROR( "The capacity of MemOrderManager is too small. It must be larger than fetch width." );
00110             }
00111         }
00112         else{
00113             if( fetchWidth > m_loadCapacity || fetchWidth > m_storeCapacity ){
00114                 THROW_RUNTIME_ERROR( "The capacity of MemOrderManager is too small. It must be larger than fetch width." );
00115             }
00116         }
00117     }
00118 
00119 }

関数の呼び出しグラフ:

bool Onikiri::MemOrderManager::IsIdealPatialLoadEnabled (  )  const [inline]

MemOrderManager.h126 行で定義されています。

参照先 m_idealPartialLoad.

00126 { return m_idealPartialLoad; }

void MemOrderManager::Read ( OpIterator  op,
MemAccess access 
)

MemOrderManager.cpp399 行で定義されています。

参照先 Onikiri::OpList::begin()Onikiri::OpList::end()GetProducerStore()Onikiri::MemOrderOperations::IsInnerAccess()Onikiri::OpIterator::IsNull()Onikiri::MemOrderOperations::IsOverlapped()m_idealPartialLoadm_memOperationsm_numExecutedLoadAccessm_numExecutedStoreForwardingm_storeListOnikiri::MemAccess::MAR_READ_INVALID_PARTIAL_READOnikiri::MemOrderOperations::MergePartialAccess()ReadMemImage()Onikiri::MemOrderOperations::ReadPreviousAccess()Onikiri::MemAccess::resultOnikiri::MemAccess::value.

参照元 Onikiri::Op::Read().

00400 {
00401     OpIterator producer = GetProducerStore( op, *access );
00402 
00403     m_numExecutedLoadAccess++;
00404 
00405     if( !producer.IsNull() ){
00406 
00407         // AhXvsstoreMemOrderManagerAMemOrderManagerReads
00408         const MemAccess& producerAccess = producer->GetMemAccess();
00409         if( m_memOperations.IsInnerAccess( *access, producerAccess ) ){
00410             // Normal forwarding
00411             access->value = m_memOperations.ReadPreviousAccess( *access, producerAccess );
00412             m_numExecutedStoreForwarding++;
00413         }
00414         else{
00415             // Partial load forwarding
00416             if( !m_idealPartialLoad ){
00417                 // Partial load is treated as exception.
00418                 access->result = MemAccess::MAR_READ_INVALID_PARTIAL_READ;
00419             }
00420             else{
00421                 // Ideal mode.
00422                 // Store data is forwarded ideally.
00423                 ReadMemImage( op, access );
00424 
00425                 for( OpList::iterator i = m_storeList.begin(); i != m_storeList.end(); ++i ){
00426                     if( (*i)->GetGlobalSerialID() > op->GetGlobalSerialID() ){
00427                         break;
00428                     }
00429                     // Merge a store access to 'access'.
00430                     const MemAccess& storeAccess = (*i)->GetMemAccess();
00431                     if( m_memOperations.IsOverlapped( *access, storeAccess ) ){
00432                         access->value = 
00433                             m_memOperations.MergePartialAccess( *access, storeAccess );
00434                     }
00435                 }
00436             }
00437         }
00438     }
00439     else{
00440 
00441         // AhXvsstoreAemulator C[W
00442         ReadMemImage( op, access );
00443     }
00444 
00445     op->SetMemAccess( *access );
00446 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::ReadMemImage ( OpIterator  op,
MemAccess access 
) [protected]

MemOrderManager.cpp454 行で定義されています。

参照先 GetMemImage()HOOK_SECTION_OP_PARAMOnikiri::MemOrderManager::MemImageAccessParam::memAccessOnikiri::MemOrderManager::MemImageAccessParam::memImageOnikiri::MemIF::Read()s_readMemImageHook.

参照元 Read().

00455 {
00456     MemImageAccessParam param = { GetMemImage(), access };
00457 
00458     HOOK_SECTION_OP_PARAM( s_readMemImageHook, op, param )  
00459     {
00460         MemIF* memImage = param.memImage;
00461         memImage->Read( param.memAccess );
00462     }
00463 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Retire ( OpIterator  op  ) 

MemOrderManager.cpp371 行で定義されています。

参照先 Delete()m_removeOpsOnCommit.

参照元 Onikiri::InorderList::NotifyRetire()Onikiri::InorderSystem::Run().

00372 {
00373     if( !m_removeOpsOnCommit ){
00374         Delete( op );
00375     }
00376 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void MemOrderManager::Write ( OpIterator  op,
MemAccess access 
)

MemOrderManager.cpp448 行で定義されています。

参照元 Onikiri::Op::Write().

00449 {
00450     op->SetMemAccess( *access );
00451 }

Here is the caller graph for this function:

void MemOrderManager::WriteMemImage ( OpIterator  op,
MemAccess access 
) [protected]

MemOrderManager.cpp465 行で定義されています。

参照先 GetMemImage()HOOK_SECTION_OP_PARAMOnikiri::MemOrderManager::MemImageAccessParam::memAccessOnikiri::MemOrderManager::MemImageAccessParam::memImages_writeMemImageHookOnikiri::MemIF::Write().

参照元 Commit().

00466 {
00467     MemImageAccessParam param = { GetMemImage(), access };
00468 
00469     HOOK_SECTION_OP_PARAM( s_writeMemImageHook, op, param ) 
00470     {
00471         MemIF* memImage = param.memImage;
00472         memImage->Write( param.memAccess );
00473     }
00474 }

関数の呼び出しグラフ:

Here is the caller graph for this function:


変数

Cache* Onikiri::MemOrderManager::m_cache [protected]

MemOrderManager.h160 行で定義されています。

参照元 Commit()Initialize().

int Onikiri::MemOrderManager::m_cacheLatency [protected]

MemOrderManager.h150 行で定義されています。

参照元 Initialize().

CacheSystem* Onikiri::MemOrderManager::m_cacheSystem [protected]

MemOrderManager.h161 行で定義されています。

参照元 Initialize().

Core* Onikiri::MemOrderManager::m_core [protected]

MemOrderManager.h167 行で定義されています。

参照元 GetCore()Initialize().

EmulatorIF* Onikiri::MemOrderManager::m_emulator [protected]

MemOrderManager.h168 行で定義されています。

参照元 GetMemImage()Initialize().

bool Onikiri::MemOrderManager::m_idealPartialLoad [protected]

MemOrderManager.h146 行で定義されています。

参照元 IsIdealPatialLoadEnabled()Read().

int Onikiri::MemOrderManager::m_loadCapacity [protected]

MemOrderManager.h144 行で定義されています。

参照元 CanAllocate()Initialize().

OpList Onikiri::MemOrderManager::m_loadList [protected]

MemOrderManager.h164 行で定義されています。

参照元 Allocate()CanAllocate()Delete()Finished()GetConsumerLoad()GetProducerStore()Initialize().

MemOrderOperations Onikiri::MemOrderManager::m_memOperations [protected]

MemOrderManager.h171 行で定義されています。

参照元 GetConsumerLoad()GetProducerStore()Initialize()Read().

s64 Onikiri::MemOrderManager::m_numExecutedLoadAccess [protected]

MemOrderManager.h156 行で定義されています。

参照元 Read().

s64 Onikiri::MemOrderManager::m_numExecutedStoreForwarding [protected]

MemOrderManager.h153 行で定義されています。

参照元 Read().

s64 Onikiri::MemOrderManager::m_numRetiredLoadAccess [protected]

MemOrderManager.h157 行で定義されています。

参照元 Commit().

s64 Onikiri::MemOrderManager::m_numRetiredStoreForwarding [protected]

MemOrderManager.h154 行で定義されています。

参照元 Commit().

bool Onikiri::MemOrderManager::m_removeOpsOnCommit [protected]

MemOrderManager.h147 行で定義されています。

参照元 Commit()Retire().

int Onikiri::MemOrderManager::m_storeCapacity [protected]

MemOrderManager.h145 行で定義されています。

参照元 CanAllocate()Initialize().

OpList Onikiri::MemOrderManager::m_storeList [protected]

MemOrderManager.h165 行で定義されています。

参照元 Allocate()CanAllocate()Delete()DetectAccessOrderViolation()Finished()GetConsumerLoad()GetProducerStore()Initialize()Read().

bool Onikiri::MemOrderManager::m_unified [protected]

MemOrderManager.h142 行で定義されています。

参照元 CanAllocate()Initialize().

int Onikiri::MemOrderManager::m_unifiedCapacity [protected]

MemOrderManager.h143 行で定義されています。

参照元 CanAllocate()Initialize().

MemOrderManager::MemImageAccessHook Onikiri::MemOrderManager::s_readMemImageHook [static]

MemOrderManager.h136 行で定義されています。

参照元 ReadMemImage().

MemOrderManager::MemImageAccessHook Onikiri::MemOrderManager::s_writeMemImageHook [static]

MemOrderManager.h135 行で定義されています。

参照元 WriteMemImage().


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 15:04:56 2013に生成されました。  doxygen 1.4.7