lsq_impl.hh revision 7823
112268Sradhika.jagtap@arm.com/* 212268Sradhika.jagtap@arm.com * Copyright (c) 2005-2006 The Regents of The University of Michigan 312268Sradhika.jagtap@arm.com * All rights reserved. 412268Sradhika.jagtap@arm.com * 512268Sradhika.jagtap@arm.com * Redistribution and use in source and binary forms, with or without 612268Sradhika.jagtap@arm.com * modification, are permitted provided that the following conditions are 712268Sradhika.jagtap@arm.com * met: redistributions of source code must retain the above copyright 812268Sradhika.jagtap@arm.com * notice, this list of conditions and the following disclaimer; 912268Sradhika.jagtap@arm.com * redistributions in binary form must reproduce the above copyright 1012268Sradhika.jagtap@arm.com * notice, this list of conditions and the following disclaimer in the 1112268Sradhika.jagtap@arm.com * documentation and/or other materials provided with the distribution; 1212268Sradhika.jagtap@arm.com * neither the name of the copyright holders nor the names of its 1312268Sradhika.jagtap@arm.com * contributors may be used to endorse or promote products derived from 1412268Sradhika.jagtap@arm.com * this software without specific prior written permission. 1512268Sradhika.jagtap@arm.com * 1612268Sradhika.jagtap@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712268Sradhika.jagtap@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812268Sradhika.jagtap@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912268Sradhika.jagtap@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012268Sradhika.jagtap@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112268Sradhika.jagtap@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212268Sradhika.jagtap@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312268Sradhika.jagtap@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412268Sradhika.jagtap@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512268Sradhika.jagtap@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612268Sradhika.jagtap@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712268Sradhika.jagtap@arm.com * 2812268Sradhika.jagtap@arm.com * Authors: Korey Sewell 2912268Sradhika.jagtap@arm.com */ 3012268Sradhika.jagtap@arm.com 3112268Sradhika.jagtap@arm.com#include <algorithm> 3212268Sradhika.jagtap@arm.com#include <list> 3312268Sradhika.jagtap@arm.com#include <string> 3412268Sradhika.jagtap@arm.com 3512268Sradhika.jagtap@arm.com#include "cpu/o3/lsq.hh" 3612268Sradhika.jagtap@arm.com#include "params/DerivO3CPU.hh" 3712268Sradhika.jagtap@arm.com 3812268Sradhika.jagtap@arm.comusing namespace std; 3912268Sradhika.jagtap@arm.com 4012268Sradhika.jagtap@arm.comtemplate<class Impl> 4112268Sradhika.jagtap@arm.comvoid 4212268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::setPeer(Port *port) 4312268Sradhika.jagtap@arm.com{ 4412268Sradhika.jagtap@arm.com Port::setPeer(port); 4512268Sradhika.jagtap@arm.com 4612268Sradhika.jagtap@arm.com#if FULL_SYSTEM 4712268Sradhika.jagtap@arm.com // Update the ThreadContext's memory ports (Functional/Virtual 4812268Sradhika.jagtap@arm.com // Ports) 4912268Sradhika.jagtap@arm.com lsq->updateMemPorts(); 5012268Sradhika.jagtap@arm.com#endif 5112268Sradhika.jagtap@arm.com} 5212268Sradhika.jagtap@arm.com 5312268Sradhika.jagtap@arm.comtemplate <class Impl> 5412268Sradhika.jagtap@arm.comTick 5512268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::recvAtomic(PacketPtr pkt) 5612268Sradhika.jagtap@arm.com{ 5712268Sradhika.jagtap@arm.com panic("O3CPU model does not work with atomic mode!"); 5812268Sradhika.jagtap@arm.com return curTick(); 5912268Sradhika.jagtap@arm.com} 6012268Sradhika.jagtap@arm.com 6112268Sradhika.jagtap@arm.comtemplate <class Impl> 6212268Sradhika.jagtap@arm.comvoid 6312268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt) 6412268Sradhika.jagtap@arm.com{ 6512268Sradhika.jagtap@arm.com DPRINTF(LSQ, "LSQ doesn't update things on a recvFunctional."); 6612268Sradhika.jagtap@arm.com} 6712268Sradhika.jagtap@arm.com 6812268Sradhika.jagtap@arm.comtemplate <class Impl> 6912268Sradhika.jagtap@arm.comvoid 7012268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::recvStatusChange(Status status) 7112268Sradhika.jagtap@arm.com{ 7212268Sradhika.jagtap@arm.com if (status == RangeChange) { 7312268Sradhika.jagtap@arm.com if (!snoopRangeSent) { 7412268Sradhika.jagtap@arm.com snoopRangeSent = true; 7512268Sradhika.jagtap@arm.com sendStatusChange(Port::RangeChange); 7612268Sradhika.jagtap@arm.com } 7712268Sradhika.jagtap@arm.com return; 7812268Sradhika.jagtap@arm.com } 7912268Sradhika.jagtap@arm.com panic("O3CPU doesn't expect recvStatusChange callback!"); 8012268Sradhika.jagtap@arm.com} 8112268Sradhika.jagtap@arm.com 8212268Sradhika.jagtap@arm.comtemplate <class Impl> 8312268Sradhika.jagtap@arm.combool 8412268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::recvTiming(PacketPtr pkt) 8512268Sradhika.jagtap@arm.com{ 8612268Sradhika.jagtap@arm.com if (pkt->isError()) 8712268Sradhika.jagtap@arm.com DPRINTF(LSQ, "Got error packet back for address: %#X\n", pkt->getAddr()); 8812268Sradhika.jagtap@arm.com if (pkt->isResponse()) { 8912268Sradhika.jagtap@arm.com lsq->thread[pkt->req->threadId()].completeDataAccess(pkt); 9012268Sradhika.jagtap@arm.com } 9112268Sradhika.jagtap@arm.com else { 9212268Sradhika.jagtap@arm.com // must be a snoop 9312268Sradhika.jagtap@arm.com 9412268Sradhika.jagtap@arm.com // @TODO someday may need to process invalidations in LSQ here 9512268Sradhika.jagtap@arm.com // to provide stronger consistency model 9612268Sradhika.jagtap@arm.com } 9712268Sradhika.jagtap@arm.com return true; 9812268Sradhika.jagtap@arm.com} 9912268Sradhika.jagtap@arm.com 10012268Sradhika.jagtap@arm.comtemplate <class Impl> 10112268Sradhika.jagtap@arm.comvoid 10212268Sradhika.jagtap@arm.comLSQ<Impl>::DcachePort::recvRetry() 10312268Sradhika.jagtap@arm.com{ 10412268Sradhika.jagtap@arm.com if (lsq->retryTid == -1) 10512268Sradhika.jagtap@arm.com { 10612268Sradhika.jagtap@arm.com //Squashed, so drop it 10712268Sradhika.jagtap@arm.com return; 10812268Sradhika.jagtap@arm.com } 10912268Sradhika.jagtap@arm.com int curr_retry_tid = lsq->retryTid; 11012268Sradhika.jagtap@arm.com // Speculatively clear the retry Tid. This will get set again if 11112268Sradhika.jagtap@arm.com // the LSQUnit was unable to complete its access. 11212268Sradhika.jagtap@arm.com lsq->retryTid = -1; 11312268Sradhika.jagtap@arm.com lsq->thread[curr_retry_tid].recvRetry(); 11412268Sradhika.jagtap@arm.com} 11512268Sradhika.jagtap@arm.com 11612268Sradhika.jagtap@arm.comtemplate <class Impl> 11712268Sradhika.jagtap@arm.comLSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, DerivO3CPUParams *params) 11812268Sradhika.jagtap@arm.com : cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this), 11912268Sradhika.jagtap@arm.com LQEntries(params->LQEntries), 12012268Sradhika.jagtap@arm.com SQEntries(params->SQEntries), 12112268Sradhika.jagtap@arm.com numThreads(params->numThreads), 12212268Sradhika.jagtap@arm.com retryTid(-1) 12312268Sradhika.jagtap@arm.com{ 12412268Sradhika.jagtap@arm.com dcachePort.snoopRangeSent = false; 12512268Sradhika.jagtap@arm.com 12612268Sradhika.jagtap@arm.com //**********************************************/ 12712268Sradhika.jagtap@arm.com //************ Handle SMT Parameters ***********/ 12812268Sradhika.jagtap@arm.com //**********************************************/ 12912268Sradhika.jagtap@arm.com std::string policy = params->smtLSQPolicy; 13012268Sradhika.jagtap@arm.com 13112268Sradhika.jagtap@arm.com //Convert string to lowercase 13212268Sradhika.jagtap@arm.com std::transform(policy.begin(), policy.end(), policy.begin(), 13312268Sradhika.jagtap@arm.com (int(*)(int)) tolower); 13412268Sradhika.jagtap@arm.com 13512268Sradhika.jagtap@arm.com //Figure out fetch policy 13612268Sradhika.jagtap@arm.com if (policy == "dynamic") { 13712268Sradhika.jagtap@arm.com lsqPolicy = Dynamic; 13812268Sradhika.jagtap@arm.com 13912268Sradhika.jagtap@arm.com maxLQEntries = LQEntries; 14012268Sradhika.jagtap@arm.com maxSQEntries = SQEntries; 14112268Sradhika.jagtap@arm.com 14212268Sradhika.jagtap@arm.com DPRINTF(LSQ, "LSQ sharing policy set to Dynamic\n"); 14312268Sradhika.jagtap@arm.com } else if (policy == "partitioned") { 14412268Sradhika.jagtap@arm.com lsqPolicy = Partitioned; 14512268Sradhika.jagtap@arm.com 14612268Sradhika.jagtap@arm.com //@todo:make work if part_amt doesnt divide evenly. 14712268Sradhika.jagtap@arm.com maxLQEntries = LQEntries / numThreads; 14812268Sradhika.jagtap@arm.com maxSQEntries = SQEntries / numThreads; 14912268Sradhika.jagtap@arm.com 15012268Sradhika.jagtap@arm.com DPRINTF(Fetch, "LSQ sharing policy set to Partitioned: " 15112268Sradhika.jagtap@arm.com "%i entries per LQ | %i entries per SQ", 15212268Sradhika.jagtap@arm.com maxLQEntries,maxSQEntries); 15312268Sradhika.jagtap@arm.com } else if (policy == "threshold") { 15412268Sradhika.jagtap@arm.com lsqPolicy = Threshold; 15512268Sradhika.jagtap@arm.com 15612268Sradhika.jagtap@arm.com assert(params->smtLSQThreshold > LQEntries); 15712268Sradhika.jagtap@arm.com assert(params->smtLSQThreshold > SQEntries); 15812268Sradhika.jagtap@arm.com 15912268Sradhika.jagtap@arm.com //Divide up by threshold amount 16012268Sradhika.jagtap@arm.com //@todo: Should threads check the max and the total 16112268Sradhika.jagtap@arm.com //amount of the LSQ 16212268Sradhika.jagtap@arm.com maxLQEntries = params->smtLSQThreshold; 16312268Sradhika.jagtap@arm.com maxSQEntries = params->smtLSQThreshold; 16412268Sradhika.jagtap@arm.com 16512268Sradhika.jagtap@arm.com DPRINTF(LSQ, "LSQ sharing policy set to Threshold: " 16612268Sradhika.jagtap@arm.com "%i entries per LQ | %i entries per SQ", 16712268Sradhika.jagtap@arm.com maxLQEntries,maxSQEntries); 16812268Sradhika.jagtap@arm.com } else { 16912268Sradhika.jagtap@arm.com assert(0 && "Invalid LSQ Sharing Policy.Options Are:{Dynamic," 17012268Sradhika.jagtap@arm.com "Partitioned, Threshold}"); 17112268Sradhika.jagtap@arm.com } 17212268Sradhika.jagtap@arm.com 17312268Sradhika.jagtap@arm.com //Initialize LSQs 17412268Sradhika.jagtap@arm.com for (ThreadID tid = 0; tid < numThreads; tid++) { 17512268Sradhika.jagtap@arm.com thread[tid].init(cpu, iew_ptr, params, this, 17612268Sradhika.jagtap@arm.com maxLQEntries, maxSQEntries, tid); 17712268Sradhika.jagtap@arm.com thread[tid].setDcachePort(&dcachePort); 17812268Sradhika.jagtap@arm.com } 17912268Sradhika.jagtap@arm.com} 18012268Sradhika.jagtap@arm.com 18112268Sradhika.jagtap@arm.com 18212268Sradhika.jagtap@arm.comtemplate<class Impl> 18312268Sradhika.jagtap@arm.comstd::string 18412268Sradhika.jagtap@arm.comLSQ<Impl>::name() const 18512268Sradhika.jagtap@arm.com{ 18612268Sradhika.jagtap@arm.com return iewStage->name() + ".lsq"; 18712268Sradhika.jagtap@arm.com} 18812268Sradhika.jagtap@arm.com 18912268Sradhika.jagtap@arm.comtemplate<class Impl> 19012268Sradhika.jagtap@arm.comvoid 19112268Sradhika.jagtap@arm.comLSQ<Impl>::regStats() 19212268Sradhika.jagtap@arm.com{ 19312268Sradhika.jagtap@arm.com //Initialize LSQs 19412268Sradhika.jagtap@arm.com for (ThreadID tid = 0; tid < numThreads; tid++) { 19512268Sradhika.jagtap@arm.com thread[tid].regStats(); 19612268Sradhika.jagtap@arm.com } 19712268Sradhika.jagtap@arm.com} 19812268Sradhika.jagtap@arm.com 19912268Sradhika.jagtap@arm.comtemplate<class Impl> 20012268Sradhika.jagtap@arm.comvoid 20112268Sradhika.jagtap@arm.comLSQ<Impl>::setActiveThreads(list<ThreadID> *at_ptr) 20212268Sradhika.jagtap@arm.com{ 20312268Sradhika.jagtap@arm.com activeThreads = at_ptr; 20412268Sradhika.jagtap@arm.com assert(activeThreads != 0); 20512268Sradhika.jagtap@arm.com} 20612268Sradhika.jagtap@arm.com 20712268Sradhika.jagtap@arm.comtemplate <class Impl> 20812268Sradhika.jagtap@arm.comvoid 20912268Sradhika.jagtap@arm.comLSQ<Impl>::switchOut() 21012268Sradhika.jagtap@arm.com{ 21112268Sradhika.jagtap@arm.com for (ThreadID tid = 0; tid < numThreads; tid++) { 21212268Sradhika.jagtap@arm.com thread[tid].switchOut(); 21312268Sradhika.jagtap@arm.com } 21412268Sradhika.jagtap@arm.com} 21512268Sradhika.jagtap@arm.com 21612268Sradhika.jagtap@arm.comtemplate <class Impl> 21712268Sradhika.jagtap@arm.comvoid 21812268Sradhika.jagtap@arm.comLSQ<Impl>::takeOverFrom() 21912268Sradhika.jagtap@arm.com{ 22012268Sradhika.jagtap@arm.com for (ThreadID tid = 0; tid < numThreads; tid++) { 22112268Sradhika.jagtap@arm.com thread[tid].takeOverFrom(); 22212268Sradhika.jagtap@arm.com } 22312268Sradhika.jagtap@arm.com} 22412268Sradhika.jagtap@arm.com 22512268Sradhika.jagtap@arm.comtemplate <class Impl> 22612268Sradhika.jagtap@arm.comint 22712268Sradhika.jagtap@arm.comLSQ<Impl>::entryAmount(ThreadID num_threads) 22812268Sradhika.jagtap@arm.com{ 22912268Sradhika.jagtap@arm.com if (lsqPolicy == Partitioned) { 23012268Sradhika.jagtap@arm.com return LQEntries / num_threads; 23112268Sradhika.jagtap@arm.com } else { 23212268Sradhika.jagtap@arm.com return 0; 23312268Sradhika.jagtap@arm.com } 23412268Sradhika.jagtap@arm.com} 23512268Sradhika.jagtap@arm.com 23612268Sradhika.jagtap@arm.comtemplate <class Impl> 23712268Sradhika.jagtap@arm.comvoid 23812268Sradhika.jagtap@arm.comLSQ<Impl>::resetEntries() 23912268Sradhika.jagtap@arm.com{ 24012268Sradhika.jagtap@arm.com if (lsqPolicy != Dynamic || numThreads > 1) { 24112268Sradhika.jagtap@arm.com int active_threads = activeThreads->size(); 24212268Sradhika.jagtap@arm.com 24312268Sradhika.jagtap@arm.com int maxEntries; 24412268Sradhika.jagtap@arm.com 24512268Sradhika.jagtap@arm.com if (lsqPolicy == Partitioned) { 24612268Sradhika.jagtap@arm.com maxEntries = LQEntries / active_threads; 24712268Sradhika.jagtap@arm.com } else if (lsqPolicy == Threshold && active_threads == 1) { 24812268Sradhika.jagtap@arm.com maxEntries = LQEntries; 24912268Sradhika.jagtap@arm.com } else { 25012268Sradhika.jagtap@arm.com maxEntries = LQEntries; 25112268Sradhika.jagtap@arm.com } 25212268Sradhika.jagtap@arm.com 25312268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 25412268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 25512268Sradhika.jagtap@arm.com 25612268Sradhika.jagtap@arm.com while (threads != end) { 25712268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 25812268Sradhika.jagtap@arm.com 25912268Sradhika.jagtap@arm.com resizeEntries(maxEntries, tid); 26012268Sradhika.jagtap@arm.com } 26112268Sradhika.jagtap@arm.com } 26212268Sradhika.jagtap@arm.com} 26312268Sradhika.jagtap@arm.com 26412268Sradhika.jagtap@arm.comtemplate<class Impl> 26512268Sradhika.jagtap@arm.comvoid 26612268Sradhika.jagtap@arm.comLSQ<Impl>::removeEntries(ThreadID tid) 26712268Sradhika.jagtap@arm.com{ 26812268Sradhika.jagtap@arm.com thread[tid].clearLQ(); 26912268Sradhika.jagtap@arm.com thread[tid].clearSQ(); 27012268Sradhika.jagtap@arm.com} 27112268Sradhika.jagtap@arm.com 27212268Sradhika.jagtap@arm.comtemplate<class Impl> 27312268Sradhika.jagtap@arm.comvoid 27412268Sradhika.jagtap@arm.comLSQ<Impl>::resizeEntries(unsigned size, ThreadID tid) 27512268Sradhika.jagtap@arm.com{ 27612268Sradhika.jagtap@arm.com thread[tid].resizeLQ(size); 27712268Sradhika.jagtap@arm.com thread[tid].resizeSQ(size); 27812268Sradhika.jagtap@arm.com} 27912268Sradhika.jagtap@arm.com 28012268Sradhika.jagtap@arm.comtemplate<class Impl> 28112268Sradhika.jagtap@arm.comvoid 28212268Sradhika.jagtap@arm.comLSQ<Impl>::tick() 28312268Sradhika.jagtap@arm.com{ 28412268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 28512268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 28612268Sradhika.jagtap@arm.com 28712268Sradhika.jagtap@arm.com while (threads != end) { 28812268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 28912268Sradhika.jagtap@arm.com 29012268Sradhika.jagtap@arm.com thread[tid].tick(); 29112268Sradhika.jagtap@arm.com } 29212268Sradhika.jagtap@arm.com} 29312268Sradhika.jagtap@arm.com 29412268Sradhika.jagtap@arm.comtemplate<class Impl> 29512268Sradhika.jagtap@arm.comvoid 29612268Sradhika.jagtap@arm.comLSQ<Impl>::insertLoad(DynInstPtr &load_inst) 29712268Sradhika.jagtap@arm.com{ 29812268Sradhika.jagtap@arm.com ThreadID tid = load_inst->threadNumber; 29912268Sradhika.jagtap@arm.com 30012268Sradhika.jagtap@arm.com thread[tid].insertLoad(load_inst); 30112268Sradhika.jagtap@arm.com} 30212268Sradhika.jagtap@arm.com 30312268Sradhika.jagtap@arm.comtemplate<class Impl> 30412268Sradhika.jagtap@arm.comvoid 30512268Sradhika.jagtap@arm.comLSQ<Impl>::insertStore(DynInstPtr &store_inst) 30612268Sradhika.jagtap@arm.com{ 30712268Sradhika.jagtap@arm.com ThreadID tid = store_inst->threadNumber; 30812268Sradhika.jagtap@arm.com 30912268Sradhika.jagtap@arm.com thread[tid].insertStore(store_inst); 31012268Sradhika.jagtap@arm.com} 31112268Sradhika.jagtap@arm.com 31212268Sradhika.jagtap@arm.comtemplate<class Impl> 31312268Sradhika.jagtap@arm.comFault 31412268Sradhika.jagtap@arm.comLSQ<Impl>::executeLoad(DynInstPtr &inst) 31512268Sradhika.jagtap@arm.com{ 31612268Sradhika.jagtap@arm.com ThreadID tid = inst->threadNumber; 31712268Sradhika.jagtap@arm.com 31812268Sradhika.jagtap@arm.com return thread[tid].executeLoad(inst); 31912268Sradhika.jagtap@arm.com} 32012268Sradhika.jagtap@arm.com 32112268Sradhika.jagtap@arm.comtemplate<class Impl> 32212268Sradhika.jagtap@arm.comFault 32312268Sradhika.jagtap@arm.comLSQ<Impl>::executeStore(DynInstPtr &inst) 32412268Sradhika.jagtap@arm.com{ 32512268Sradhika.jagtap@arm.com ThreadID tid = inst->threadNumber; 32612268Sradhika.jagtap@arm.com 32712268Sradhika.jagtap@arm.com return thread[tid].executeStore(inst); 32812268Sradhika.jagtap@arm.com} 32912268Sradhika.jagtap@arm.com 33012268Sradhika.jagtap@arm.comtemplate<class Impl> 33112268Sradhika.jagtap@arm.comvoid 33212268Sradhika.jagtap@arm.comLSQ<Impl>::writebackStores() 33312268Sradhika.jagtap@arm.com{ 33412268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 33512268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 33612268Sradhika.jagtap@arm.com 33712268Sradhika.jagtap@arm.com while (threads != end) { 33812268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 33912268Sradhika.jagtap@arm.com 34012268Sradhika.jagtap@arm.com if (numStoresToWB(tid) > 0) { 34112268Sradhika.jagtap@arm.com DPRINTF(Writeback,"[tid:%i] Writing back stores. %i stores " 34212268Sradhika.jagtap@arm.com "available for Writeback.\n", tid, numStoresToWB(tid)); 34312268Sradhika.jagtap@arm.com } 34412268Sradhika.jagtap@arm.com 34512268Sradhika.jagtap@arm.com thread[tid].writebackStores(); 34612268Sradhika.jagtap@arm.com } 34712268Sradhika.jagtap@arm.com} 34812268Sradhika.jagtap@arm.com 34912268Sradhika.jagtap@arm.comtemplate<class Impl> 35012268Sradhika.jagtap@arm.combool 35112268Sradhika.jagtap@arm.comLSQ<Impl>::violation() 35212268Sradhika.jagtap@arm.com{ 35312268Sradhika.jagtap@arm.com /* Answers: Does Anybody Have a Violation?*/ 35412268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 35512268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 35612268Sradhika.jagtap@arm.com 35712268Sradhika.jagtap@arm.com while (threads != end) { 35812268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 35912268Sradhika.jagtap@arm.com 36012268Sradhika.jagtap@arm.com if (thread[tid].violation()) 36112268Sradhika.jagtap@arm.com return true; 36212268Sradhika.jagtap@arm.com } 36312268Sradhika.jagtap@arm.com 36412268Sradhika.jagtap@arm.com return false; 36512268Sradhika.jagtap@arm.com} 36612268Sradhika.jagtap@arm.com 36712268Sradhika.jagtap@arm.comtemplate<class Impl> 36812268Sradhika.jagtap@arm.comint 36912268Sradhika.jagtap@arm.comLSQ<Impl>::getCount() 37012268Sradhika.jagtap@arm.com{ 37112268Sradhika.jagtap@arm.com unsigned total = 0; 37212268Sradhika.jagtap@arm.com 37312268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 37412268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 37512268Sradhika.jagtap@arm.com 37612268Sradhika.jagtap@arm.com while (threads != end) { 37712268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 37812268Sradhika.jagtap@arm.com 37912268Sradhika.jagtap@arm.com total += getCount(tid); 38012268Sradhika.jagtap@arm.com } 38112268Sradhika.jagtap@arm.com 38212268Sradhika.jagtap@arm.com return total; 38312268Sradhika.jagtap@arm.com} 38412268Sradhika.jagtap@arm.com 38512268Sradhika.jagtap@arm.comtemplate<class Impl> 38612268Sradhika.jagtap@arm.comint 38712268Sradhika.jagtap@arm.comLSQ<Impl>::numLoads() 38812268Sradhika.jagtap@arm.com{ 38912268Sradhika.jagtap@arm.com unsigned total = 0; 39012268Sradhika.jagtap@arm.com 39112268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 39212268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 39312268Sradhika.jagtap@arm.com 39412268Sradhika.jagtap@arm.com while (threads != end) { 39512268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 39612268Sradhika.jagtap@arm.com 39712268Sradhika.jagtap@arm.com total += numLoads(tid); 39812268Sradhika.jagtap@arm.com } 39912268Sradhika.jagtap@arm.com 40012268Sradhika.jagtap@arm.com return total; 40112268Sradhika.jagtap@arm.com} 40212268Sradhika.jagtap@arm.com 40312268Sradhika.jagtap@arm.comtemplate<class Impl> 40412268Sradhika.jagtap@arm.comint 40512268Sradhika.jagtap@arm.comLSQ<Impl>::numStores() 40612268Sradhika.jagtap@arm.com{ 40712268Sradhika.jagtap@arm.com unsigned total = 0; 40812268Sradhika.jagtap@arm.com 40912268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 41012268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 41112268Sradhika.jagtap@arm.com 41212268Sradhika.jagtap@arm.com while (threads != end) { 41312268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 41412268Sradhika.jagtap@arm.com 41512268Sradhika.jagtap@arm.com total += thread[tid].numStores(); 41612268Sradhika.jagtap@arm.com } 41712268Sradhika.jagtap@arm.com 41812268Sradhika.jagtap@arm.com return total; 41912268Sradhika.jagtap@arm.com} 42012268Sradhika.jagtap@arm.com 42112268Sradhika.jagtap@arm.comtemplate<class Impl> 42212268Sradhika.jagtap@arm.comint 42312268Sradhika.jagtap@arm.comLSQ<Impl>::numLoadsReady() 42412268Sradhika.jagtap@arm.com{ 42512268Sradhika.jagtap@arm.com unsigned total = 0; 42612268Sradhika.jagtap@arm.com 42712268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 42812268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 42912268Sradhika.jagtap@arm.com 43012268Sradhika.jagtap@arm.com while (threads != end) { 43112268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 43212268Sradhika.jagtap@arm.com 43312268Sradhika.jagtap@arm.com total += thread[tid].numLoadsReady(); 43412268Sradhika.jagtap@arm.com } 43512268Sradhika.jagtap@arm.com 43612268Sradhika.jagtap@arm.com return total; 43712268Sradhika.jagtap@arm.com} 43812268Sradhika.jagtap@arm.com 43912268Sradhika.jagtap@arm.comtemplate<class Impl> 44012268Sradhika.jagtap@arm.comunsigned 44112268Sradhika.jagtap@arm.comLSQ<Impl>::numFreeEntries() 44212268Sradhika.jagtap@arm.com{ 44312268Sradhika.jagtap@arm.com unsigned total = 0; 44412268Sradhika.jagtap@arm.com 44512268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 44612268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 44712268Sradhika.jagtap@arm.com 44812268Sradhika.jagtap@arm.com while (threads != end) { 44912268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 45012268Sradhika.jagtap@arm.com 45112268Sradhika.jagtap@arm.com total += thread[tid].numFreeEntries(); 45212268Sradhika.jagtap@arm.com } 45312268Sradhika.jagtap@arm.com 45412268Sradhika.jagtap@arm.com return total; 45512268Sradhika.jagtap@arm.com} 45612268Sradhika.jagtap@arm.com 45712268Sradhika.jagtap@arm.comtemplate<class Impl> 45812268Sradhika.jagtap@arm.comunsigned 45912268Sradhika.jagtap@arm.comLSQ<Impl>::numFreeEntries(ThreadID tid) 46012268Sradhika.jagtap@arm.com{ 46112268Sradhika.jagtap@arm.com //if (lsqPolicy == Dynamic) 46212268Sradhika.jagtap@arm.com //return numFreeEntries(); 46312268Sradhika.jagtap@arm.com //else 46412268Sradhika.jagtap@arm.com return thread[tid].numFreeEntries(); 46512268Sradhika.jagtap@arm.com} 46612268Sradhika.jagtap@arm.com 46712268Sradhika.jagtap@arm.comtemplate<class Impl> 46812268Sradhika.jagtap@arm.combool 46912268Sradhika.jagtap@arm.comLSQ<Impl>::isFull() 47012268Sradhika.jagtap@arm.com{ 47112268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 47212268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 47312268Sradhika.jagtap@arm.com 47412268Sradhika.jagtap@arm.com while (threads != end) { 47512268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 47612268Sradhika.jagtap@arm.com 47712268Sradhika.jagtap@arm.com if (!(thread[tid].lqFull() || thread[tid].sqFull())) 47812268Sradhika.jagtap@arm.com return false; 47912268Sradhika.jagtap@arm.com } 48012268Sradhika.jagtap@arm.com 48112268Sradhika.jagtap@arm.com return true; 48212268Sradhika.jagtap@arm.com} 48312268Sradhika.jagtap@arm.com 48412268Sradhika.jagtap@arm.comtemplate<class Impl> 48512268Sradhika.jagtap@arm.combool 48612268Sradhika.jagtap@arm.comLSQ<Impl>::isFull(ThreadID tid) 48712268Sradhika.jagtap@arm.com{ 48812268Sradhika.jagtap@arm.com //@todo: Change to Calculate All Entries for 48912268Sradhika.jagtap@arm.com //Dynamic Policy 49012268Sradhika.jagtap@arm.com if (lsqPolicy == Dynamic) 49112268Sradhika.jagtap@arm.com return isFull(); 49212268Sradhika.jagtap@arm.com else 49312268Sradhika.jagtap@arm.com return thread[tid].lqFull() || thread[tid].sqFull(); 49412268Sradhika.jagtap@arm.com} 49512268Sradhika.jagtap@arm.com 49612268Sradhika.jagtap@arm.comtemplate<class Impl> 49712268Sradhika.jagtap@arm.combool 49812268Sradhika.jagtap@arm.comLSQ<Impl>::lqFull() 49912268Sradhika.jagtap@arm.com{ 50012268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 50112268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 50212268Sradhika.jagtap@arm.com 50312268Sradhika.jagtap@arm.com while (threads != end) { 50412268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 50512268Sradhika.jagtap@arm.com 50612268Sradhika.jagtap@arm.com if (!thread[tid].lqFull()) 50712268Sradhika.jagtap@arm.com return false; 50812268Sradhika.jagtap@arm.com } 50912268Sradhika.jagtap@arm.com 51012268Sradhika.jagtap@arm.com return true; 51112268Sradhika.jagtap@arm.com} 51212268Sradhika.jagtap@arm.com 51312268Sradhika.jagtap@arm.comtemplate<class Impl> 51412268Sradhika.jagtap@arm.combool 51512268Sradhika.jagtap@arm.comLSQ<Impl>::lqFull(ThreadID tid) 51612268Sradhika.jagtap@arm.com{ 51712268Sradhika.jagtap@arm.com //@todo: Change to Calculate All Entries for 51812268Sradhika.jagtap@arm.com //Dynamic Policy 51912268Sradhika.jagtap@arm.com if (lsqPolicy == Dynamic) 52012268Sradhika.jagtap@arm.com return lqFull(); 52112268Sradhika.jagtap@arm.com else 52212268Sradhika.jagtap@arm.com return thread[tid].lqFull(); 52312268Sradhika.jagtap@arm.com} 52412268Sradhika.jagtap@arm.com 52512268Sradhika.jagtap@arm.comtemplate<class Impl> 52612268Sradhika.jagtap@arm.combool 52712268Sradhika.jagtap@arm.comLSQ<Impl>::sqFull() 52812268Sradhika.jagtap@arm.com{ 52912268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 53012268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 53112268Sradhika.jagtap@arm.com 53212268Sradhika.jagtap@arm.com while (threads != end) { 53312268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 53412268Sradhika.jagtap@arm.com 53512268Sradhika.jagtap@arm.com if (!sqFull(tid)) 53612268Sradhika.jagtap@arm.com return false; 53712268Sradhika.jagtap@arm.com } 53812268Sradhika.jagtap@arm.com 53912268Sradhika.jagtap@arm.com return true; 54012268Sradhika.jagtap@arm.com} 54112268Sradhika.jagtap@arm.com 54212268Sradhika.jagtap@arm.comtemplate<class Impl> 54312268Sradhika.jagtap@arm.combool 54412268Sradhika.jagtap@arm.comLSQ<Impl>::sqFull(ThreadID tid) 54512268Sradhika.jagtap@arm.com{ 54612268Sradhika.jagtap@arm.com //@todo: Change to Calculate All Entries for 54712268Sradhika.jagtap@arm.com //Dynamic Policy 54812268Sradhika.jagtap@arm.com if (lsqPolicy == Dynamic) 54912268Sradhika.jagtap@arm.com return sqFull(); 55012268Sradhika.jagtap@arm.com else 55112268Sradhika.jagtap@arm.com return thread[tid].sqFull(); 55212268Sradhika.jagtap@arm.com} 55312268Sradhika.jagtap@arm.com 55412268Sradhika.jagtap@arm.comtemplate<class Impl> 55512268Sradhika.jagtap@arm.combool 55612268Sradhika.jagtap@arm.comLSQ<Impl>::isStalled() 55712268Sradhika.jagtap@arm.com{ 55812268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 55912268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 56012268Sradhika.jagtap@arm.com 56112268Sradhika.jagtap@arm.com while (threads != end) { 56212268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 56312268Sradhika.jagtap@arm.com 56412268Sradhika.jagtap@arm.com if (!thread[tid].isStalled()) 56512268Sradhika.jagtap@arm.com return false; 56612268Sradhika.jagtap@arm.com } 56712268Sradhika.jagtap@arm.com 56812268Sradhika.jagtap@arm.com return true; 56912268Sradhika.jagtap@arm.com} 57012268Sradhika.jagtap@arm.com 57112268Sradhika.jagtap@arm.comtemplate<class Impl> 57212268Sradhika.jagtap@arm.combool 57312268Sradhika.jagtap@arm.comLSQ<Impl>::isStalled(ThreadID tid) 57412268Sradhika.jagtap@arm.com{ 57512268Sradhika.jagtap@arm.com if (lsqPolicy == Dynamic) 57612268Sradhika.jagtap@arm.com return isStalled(); 57712268Sradhika.jagtap@arm.com else 57812268Sradhika.jagtap@arm.com return thread[tid].isStalled(); 57912268Sradhika.jagtap@arm.com} 58012268Sradhika.jagtap@arm.com 58112268Sradhika.jagtap@arm.comtemplate<class Impl> 58212268Sradhika.jagtap@arm.combool 58312268Sradhika.jagtap@arm.comLSQ<Impl>::hasStoresToWB() 58412268Sradhika.jagtap@arm.com{ 58512268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 58612268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 58712268Sradhika.jagtap@arm.com 58812268Sradhika.jagtap@arm.com while (threads != end) { 58912268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 59012268Sradhika.jagtap@arm.com 59112268Sradhika.jagtap@arm.com if (hasStoresToWB(tid)) 59212268Sradhika.jagtap@arm.com return true; 59312268Sradhika.jagtap@arm.com } 59412268Sradhika.jagtap@arm.com 59512268Sradhika.jagtap@arm.com return false; 59612268Sradhika.jagtap@arm.com} 59712268Sradhika.jagtap@arm.com 59812268Sradhika.jagtap@arm.comtemplate<class Impl> 59912268Sradhika.jagtap@arm.combool 60012268Sradhika.jagtap@arm.comLSQ<Impl>::willWB() 60112268Sradhika.jagtap@arm.com{ 60212268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 60312268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 60412268Sradhika.jagtap@arm.com 60512268Sradhika.jagtap@arm.com while (threads != end) { 60612268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 60712268Sradhika.jagtap@arm.com 60812268Sradhika.jagtap@arm.com if (willWB(tid)) 60912268Sradhika.jagtap@arm.com return true; 61012268Sradhika.jagtap@arm.com } 61112268Sradhika.jagtap@arm.com 61212268Sradhika.jagtap@arm.com return false; 61312268Sradhika.jagtap@arm.com} 61412268Sradhika.jagtap@arm.com 61512268Sradhika.jagtap@arm.comtemplate<class Impl> 61612268Sradhika.jagtap@arm.comvoid 61712268Sradhika.jagtap@arm.comLSQ<Impl>::dumpInsts() 61812268Sradhika.jagtap@arm.com{ 61912268Sradhika.jagtap@arm.com list<ThreadID>::iterator threads = activeThreads->begin(); 62012268Sradhika.jagtap@arm.com list<ThreadID>::iterator end = activeThreads->end(); 62112268Sradhika.jagtap@arm.com 62212268Sradhika.jagtap@arm.com while (threads != end) { 62312268Sradhika.jagtap@arm.com ThreadID tid = *threads++; 62412268Sradhika.jagtap@arm.com 62512268Sradhika.jagtap@arm.com thread[tid].dumpInsts(); 62612268Sradhika.jagtap@arm.com } 62712268Sradhika.jagtap@arm.com} 62812268Sradhika.jagtap@arm.com