#include <RegisterFreeList.h>
Onikiri::RegisterFreeListに対する継承グラフ
Public メソッド | |
int | Allocate (int segment) |
int | GetFreeEntryCount (int segment) |
int | GetSegmentCount () |
void | Initialize (InitPhase phase) |
RegisterFreeList () | |
void | Release (int segment, int phyRegNum) |
virtual | ~RegisterFreeList () |
RegisterFreeList.h の 43 行で定義されています。
RegisterFreeList::RegisterFreeList | ( | ) |
RegisterFreeList::~RegisterFreeList | ( | ) | [virtual] |
RegisterFreeList.cpp の 45 行で定義されています。
参照先 Onikiri::PhysicalResourceNode::ReleaseParam().
00046 { 00047 ReleaseParam(); 00048 }
関数の呼び出しグラフ:
int RegisterFreeList::Allocate | ( | int | segment | ) |
RegisterFreeList.cpp の 133 行で定義されています。
参照先 ASSERT.
参照元 Onikiri::RMT::AllocateRegBody()・Onikiri::RMT::Initialize().
00134 { 00135 ASSERT( m_freeList[segment].size() > 0, "cannot allocate register."); 00136 00137 int phyRegNo = m_freeList[segment].front(); 00138 m_freeList[segment].pop_front(); 00139 00140 return phyRegNo; 00141 }
Here is the caller graph for this function:
int RegisterFreeList::GetFreeEntryCount | ( | int | segment | ) |
RegisterFreeList.cpp の 148 行で定義されています。
参照元 Onikiri::RMT::CanAllocate()・Initialize().
Here is the caller graph for this function:
int RegisterFreeList::GetSegmentCount | ( | ) |
void RegisterFreeList::Initialize | ( | InitPhase | phase | ) |
RegisterFreeList.cpp の 50 行で定義されています。
参照先 ASSERT・GetFreeEntryCount()・Onikiri::ISAInfoIF::GetRegisterCount()・Onikiri::ISAInfoIF::GetRegisterSegmentID()・Onikiri::PhysicalResourceNode::INIT_POST_CONNECTION・Onikiri::PhysicalResourceNode::INIT_PRE_CONNECTION・Onikiri::ParamExchange::LoadParam()・THROW_RUNTIME_ERROR.
00051 { 00052 if(phase == INIT_PRE_CONNECTION){ 00053 LoadParam(); 00054 } 00055 else if(phase == INIT_POST_CONNECTION){ 00056 // o`FbN 00057 if( m_registerFile.GetSize() == 0 ) { 00058 THROW_RUNTIME_ERROR("registerFile not set."); 00059 } 00060 if( m_emulator.GetSize() == 0 ) { 00061 THROW_RUNTIME_ERROR("emulator not set."); 00062 } 00063 00064 ISAInfoIF* isaInfo = m_emulator[0]->GetISAInfo(); 00065 00066 int numLogicalReg = isaInfo->GetRegisterCount(); 00067 00068 00069 // segment Xgset 00070 set<int> segmentSet; 00071 for (int i = 0; i < numLogicalReg; ++i) { 00072 int segment = isaInfo->GetRegisterSegmentID(i); 00073 segmentSet.insert(segment); 00074 } 00075 00076 // freeList 00077 m_freeList.resize(segmentSet.size()); 00078 00079 // freeList segment \z 00080 int phyRegNo = 0; 00081 for(set<int>::iterator iter = segmentSet.begin(); 00082 iter != segmentSet.end(); 00083 ++iter) 00084 { 00085 int segment = *iter; 00086 int capacity = m_registerFile[0]->GetCapacity(segment); 00087 // freeList o^ 00088 for (int i = 0; i < capacity; i++) { 00089 m_freeList[segment].push_back(phyRegNo); 00090 ++phyRegNo; 00091 } 00092 } 00093 00094 ASSERT( 00095 phyRegNo == m_registerFile[0]->GetTotalCapacity(), 00096 "phyreg count unmatch" 00097 ); 00098 00099 00100 // t[XgGg`FbN 00101 00102 vector<int> logicalRegNumList(segmentSet.size(), 0); 00103 for (int i = 0; i < numLogicalReg; i++) { 00104 int segment = isaInfo->GetRegisterSegmentID(i); 00105 logicalRegNumList[segment]++; 00106 } 00107 00108 int threadCount = m_core[0]->GetThreadCount(); 00109 for( size_t i = 0; i < segmentSet.size(); i++ ){ 00110 int requiredRegCount = logicalRegNumList[i] * threadCount + 1; 00111 if( GetFreeEntryCount((int)i) < requiredRegCount ){ 00112 THROW_RUNTIME_ERROR( 00113 "The number of the physical register is too small.\n" 00114 "segment: %d\n" 00115 "phy reg num: %d\n" 00116 "requried num: %d (log reg num:%d x thread num:%d + 1)\n", 00117 i, 00118 m_registerFile[0]->GetCapacity((int)i), 00119 requiredRegCount, 00120 logicalRegNumList[i], 00121 threadCount 00122 ); 00123 } 00124 } 00125 } 00126 }
関数の呼び出しグラフ:
void RegisterFreeList::Release | ( | int | segment, | |
int | phyRegNum | |||
) |
RegisterFreeList.cpp の 128 行で定義されています。
参照元 Onikiri::RMT::DeallocateRegBody()・Onikiri::RMT::ReleaseRegBody().
Here is the caller graph for this function: