lsq_impl.hh revision 3639
15647Sgblack@eecs.umich.edu/* 29544Sandreas.hansson@arm.com * Copyright (c) 2005-2006 The Regents of The University of Michigan 38922Swilliam.wang@arm.com * All rights reserved. 48922Swilliam.wang@arm.com * 58922Swilliam.wang@arm.com * Redistribution and use in source and binary forms, with or without 68922Swilliam.wang@arm.com * modification, are permitted provided that the following conditions are 78922Swilliam.wang@arm.com * met: redistributions of source code must retain the above copyright 88922Swilliam.wang@arm.com * notice, this list of conditions and the following disclaimer; 98922Swilliam.wang@arm.com * redistributions in binary form must reproduce the above copyright 108922Swilliam.wang@arm.com * notice, this list of conditions and the following disclaimer in the 118922Swilliam.wang@arm.com * documentation and/or other materials provided with the distribution; 128922Swilliam.wang@arm.com * neither the name of the copyright holders nor the names of its 138922Swilliam.wang@arm.com * contributors may be used to endorse or promote products derived from 145647Sgblack@eecs.umich.edu * this software without specific prior written permission. 155647Sgblack@eecs.umich.edu * 165647Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227087Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247087Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255647Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267087Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277087Snate@binkert.org * 287087Snate@binkert.org * Authors: Korey Sewell 297087Snate@binkert.org */ 307087Snate@binkert.org 317087Snate@binkert.org#include <algorithm> 327087Snate@binkert.org#include <list> 337087Snate@binkert.org#include <string> 345647Sgblack@eecs.umich.edu 357087Snate@binkert.org#include "cpu/o3/lsq.hh" 365647Sgblack@eecs.umich.edu 375647Sgblack@eecs.umich.edutemplate <class Impl> 385647Sgblack@eecs.umich.eduTick 395647Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvAtomic(PacketPtr pkt) 405647Sgblack@eecs.umich.edu{ 415647Sgblack@eecs.umich.edu panic("O3CPU model does not work with atomic mode!"); 425647Sgblack@eecs.umich.edu return curTick; 435647Sgblack@eecs.umich.edu} 445647Sgblack@eecs.umich.edu 455647Sgblack@eecs.umich.edutemplate <class Impl> 465647Sgblack@eecs.umich.eduvoid 475647Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt) 485647Sgblack@eecs.umich.edu{ 495647Sgblack@eecs.umich.edu DPRINTF(LSQ, "LSQ doesn't update things on a recvFunctional."); 505647Sgblack@eecs.umich.edu} 515647Sgblack@eecs.umich.edu 528229Snate@binkert.orgtemplate <class Impl> 535647Sgblack@eecs.umich.eduvoid 545654Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvStatusChange(Status status) 555647Sgblack@eecs.umich.edu{ 568232Snate@binkert.org if (status == RangeChange) 576137Sgblack@eecs.umich.edu return; 586137Sgblack@eecs.umich.edu 596137Sgblack@eecs.umich.edu panic("O3CPU doesn't expect recvStatusChange callback!"); 605654Sgblack@eecs.umich.edu} 616046Sgblack@eecs.umich.edu 628781Sgblack@eecs.umich.edutemplate <class Impl> 635647Sgblack@eecs.umich.edubool 645648Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvTiming(PacketPtr pkt) 655648Sgblack@eecs.umich.edu{ 665647Sgblack@eecs.umich.edu if (pkt->isResponse()) { 675647Sgblack@eecs.umich.edu lsq->thread[pkt->req->getThreadNum()].completeDataAccess(pkt); 685647Sgblack@eecs.umich.edu } 695647Sgblack@eecs.umich.edu else { 705647Sgblack@eecs.umich.edu //else it is a coherence request, maybe you need to do something 715647Sgblack@eecs.umich.edu warn("Recieved a coherence request (Invalidate?), 03CPU doesn't" 725647Sgblack@eecs.umich.edu "update LSQ for these\n"); 735647Sgblack@eecs.umich.edu } 745647Sgblack@eecs.umich.edu return true; 755648Sgblack@eecs.umich.edu} 765647Sgblack@eecs.umich.edu 775648Sgblack@eecs.umich.edutemplate <class Impl> 785648Sgblack@eecs.umich.eduvoid 795648Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvRetry() 805648Sgblack@eecs.umich.edu{ 815648Sgblack@eecs.umich.edu if (lsq->retryTid == -1) 825648Sgblack@eecs.umich.edu { 835648Sgblack@eecs.umich.edu //Squashed, so drop it 845648Sgblack@eecs.umich.edu return; 855648Sgblack@eecs.umich.edu } 865648Sgblack@eecs.umich.edu lsq->thread[lsq->retryTid].recvRetry(); 875648Sgblack@eecs.umich.edu // Speculatively clear the retry Tid. This will get set again if 885648Sgblack@eecs.umich.edu // the LSQUnit was unable to complete its access. 895648Sgblack@eecs.umich.edu lsq->retryTid = -1; 905648Sgblack@eecs.umich.edu} 915648Sgblack@eecs.umich.edu 925648Sgblack@eecs.umich.edutemplate <class Impl> 935648Sgblack@eecs.umich.eduLSQ<Impl>::LSQ(Params *params) 945648Sgblack@eecs.umich.edu : dcachePort(this), LQEntries(params->LQEntries), 955648Sgblack@eecs.umich.edu SQEntries(params->SQEntries), numThreads(params->numberOfThreads), 965648Sgblack@eecs.umich.edu retryTid(-1) 975648Sgblack@eecs.umich.edu{ 985648Sgblack@eecs.umich.edu DPRINTF(LSQ, "Creating LSQ object.\n"); 995648Sgblack@eecs.umich.edu 1005648Sgblack@eecs.umich.edu //**********************************************/ 1015648Sgblack@eecs.umich.edu //************ Handle SMT Parameters ***********/ 1025648Sgblack@eecs.umich.edu //**********************************************/ 1035648Sgblack@eecs.umich.edu std::string policy = params->smtLSQPolicy; 1045648Sgblack@eecs.umich.edu 1055648Sgblack@eecs.umich.edu //Convert string to lowercase 1065648Sgblack@eecs.umich.edu std::transform(policy.begin(), policy.end(), policy.begin(), 1075648Sgblack@eecs.umich.edu (int(*)(int)) tolower); 1085648Sgblack@eecs.umich.edu 1095648Sgblack@eecs.umich.edu //Figure out fetch policy 1105648Sgblack@eecs.umich.edu if (policy == "dynamic") { 1115648Sgblack@eecs.umich.edu lsqPolicy = Dynamic; 1125648Sgblack@eecs.umich.edu 1135648Sgblack@eecs.umich.edu maxLQEntries = LQEntries; 1145648Sgblack@eecs.umich.edu maxSQEntries = SQEntries; 1155648Sgblack@eecs.umich.edu 1165648Sgblack@eecs.umich.edu DPRINTF(LSQ, "LSQ sharing policy set to Dynamic\n"); 1175648Sgblack@eecs.umich.edu 1185648Sgblack@eecs.umich.edu } else if (policy == "partitioned") { 1195648Sgblack@eecs.umich.edu lsqPolicy = Partitioned; 1205648Sgblack@eecs.umich.edu 1215648Sgblack@eecs.umich.edu //@todo:make work if part_amt doesnt divide evenly. 1225648Sgblack@eecs.umich.edu maxLQEntries = LQEntries / numThreads; 1235648Sgblack@eecs.umich.edu maxSQEntries = SQEntries / numThreads; 1245648Sgblack@eecs.umich.edu 1255648Sgblack@eecs.umich.edu DPRINTF(Fetch, "LSQ sharing policy set to Partitioned: " 1265648Sgblack@eecs.umich.edu "%i entries per LQ | %i entries per SQ", 1275648Sgblack@eecs.umich.edu maxLQEntries,maxSQEntries); 1285648Sgblack@eecs.umich.edu 1295648Sgblack@eecs.umich.edu } else if (policy == "threshold") { 1305648Sgblack@eecs.umich.edu lsqPolicy = Threshold; 1315648Sgblack@eecs.umich.edu 1325648Sgblack@eecs.umich.edu assert(params->smtLSQThreshold > LQEntries); 1335648Sgblack@eecs.umich.edu assert(params->smtLSQThreshold > SQEntries); 1345648Sgblack@eecs.umich.edu 1355648Sgblack@eecs.umich.edu //Divide up by threshold amount 1365648Sgblack@eecs.umich.edu //@todo: Should threads check the max and the total 1375648Sgblack@eecs.umich.edu //amount of the LSQ 1385648Sgblack@eecs.umich.edu maxLQEntries = params->smtLSQThreshold; 1395648Sgblack@eecs.umich.edu maxSQEntries = params->smtLSQThreshold; 1405648Sgblack@eecs.umich.edu 1415648Sgblack@eecs.umich.edu DPRINTF(LSQ, "LSQ sharing policy set to Threshold: " 1425648Sgblack@eecs.umich.edu "%i entries per LQ | %i entries per SQ", 1435648Sgblack@eecs.umich.edu maxLQEntries,maxSQEntries); 1445648Sgblack@eecs.umich.edu 1455648Sgblack@eecs.umich.edu } else { 1465648Sgblack@eecs.umich.edu assert(0 && "Invalid LSQ Sharing Policy.Options Are:{Dynamic," 1475648Sgblack@eecs.umich.edu "Partitioned, Threshold}"); 1485648Sgblack@eecs.umich.edu } 1495648Sgblack@eecs.umich.edu 1505648Sgblack@eecs.umich.edu //Initialize LSQs 1515648Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 1525648Sgblack@eecs.umich.edu thread[tid].init(params, this, maxLQEntries, maxSQEntries, tid); 1535648Sgblack@eecs.umich.edu thread[tid].setDcachePort(&dcachePort); 1545648Sgblack@eecs.umich.edu } 1555648Sgblack@eecs.umich.edu} 1565648Sgblack@eecs.umich.edu 1575648Sgblack@eecs.umich.edu 1585648Sgblack@eecs.umich.edutemplate<class Impl> 1595648Sgblack@eecs.umich.edustd::string 1605648Sgblack@eecs.umich.eduLSQ<Impl>::name() const 1615648Sgblack@eecs.umich.edu{ 1625648Sgblack@eecs.umich.edu return iewStage->name() + ".lsq"; 1635648Sgblack@eecs.umich.edu} 1645648Sgblack@eecs.umich.edu 1655648Sgblack@eecs.umich.edutemplate<class Impl> 1665648Sgblack@eecs.umich.eduvoid 1675648Sgblack@eecs.umich.eduLSQ<Impl>::regStats() 1685648Sgblack@eecs.umich.edu{ 1695648Sgblack@eecs.umich.edu //Initialize LSQs 1705648Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 1715648Sgblack@eecs.umich.edu thread[tid].regStats(); 1725648Sgblack@eecs.umich.edu } 1735648Sgblack@eecs.umich.edu} 1745648Sgblack@eecs.umich.edu 1755648Sgblack@eecs.umich.edutemplate<class Impl> 1765648Sgblack@eecs.umich.eduvoid 1775648Sgblack@eecs.umich.eduLSQ<Impl>::setActiveThreads(std::list<unsigned> *at_ptr) 1785648Sgblack@eecs.umich.edu{ 1795648Sgblack@eecs.umich.edu activeThreads = at_ptr; 1805648Sgblack@eecs.umich.edu assert(activeThreads != 0); 1815648Sgblack@eecs.umich.edu} 1825648Sgblack@eecs.umich.edu 1835648Sgblack@eecs.umich.edutemplate<class Impl> 1845648Sgblack@eecs.umich.eduvoid 1855648Sgblack@eecs.umich.eduLSQ<Impl>::setCPU(O3CPU *cpu_ptr) 1865648Sgblack@eecs.umich.edu{ 1875648Sgblack@eecs.umich.edu cpu = cpu_ptr; 1885648Sgblack@eecs.umich.edu 1895648Sgblack@eecs.umich.edu dcachePort.setName(name()); 1905648Sgblack@eecs.umich.edu 1915648Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 1925648Sgblack@eecs.umich.edu thread[tid].setCPU(cpu_ptr); 1935648Sgblack@eecs.umich.edu } 1945648Sgblack@eecs.umich.edu} 1955648Sgblack@eecs.umich.edu 1965648Sgblack@eecs.umich.edutemplate<class Impl> 1975648Sgblack@eecs.umich.eduvoid 1985648Sgblack@eecs.umich.eduLSQ<Impl>::setIEW(IEW *iew_ptr) 1995648Sgblack@eecs.umich.edu{ 2005648Sgblack@eecs.umich.edu iewStage = iew_ptr; 2015648Sgblack@eecs.umich.edu 2025648Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 2035648Sgblack@eecs.umich.edu thread[tid].setIEW(iew_ptr); 2045648Sgblack@eecs.umich.edu } 2055648Sgblack@eecs.umich.edu} 2065648Sgblack@eecs.umich.edu 2075648Sgblack@eecs.umich.edutemplate <class Impl> 2085648Sgblack@eecs.umich.eduvoid 2095648Sgblack@eecs.umich.eduLSQ<Impl>::switchOut() 2105648Sgblack@eecs.umich.edu{ 2115648Sgblack@eecs.umich.edu for (int tid = 0; tid < numThreads; tid++) { 2125648Sgblack@eecs.umich.edu thread[tid].switchOut(); 2135648Sgblack@eecs.umich.edu } 2145648Sgblack@eecs.umich.edu} 2155648Sgblack@eecs.umich.edu 2165648Sgblack@eecs.umich.edutemplate <class Impl> 2175648Sgblack@eecs.umich.eduvoid 2185648Sgblack@eecs.umich.eduLSQ<Impl>::takeOverFrom() 2195648Sgblack@eecs.umich.edu{ 2205649Sgblack@eecs.umich.edu for (int tid = 0; tid < numThreads; tid++) { 2215649Sgblack@eecs.umich.edu thread[tid].takeOverFrom(); 2225649Sgblack@eecs.umich.edu } 2235648Sgblack@eecs.umich.edu} 2245898Sgblack@eecs.umich.edu 2255648Sgblack@eecs.umich.edutemplate <class Impl> 2265648Sgblack@eecs.umich.eduint 2275648Sgblack@eecs.umich.eduLSQ<Impl>::entryAmount(int num_threads) 2285648Sgblack@eecs.umich.edu{ 2295648Sgblack@eecs.umich.edu if (lsqPolicy == Partitioned) { 2305648Sgblack@eecs.umich.edu return LQEntries / num_threads; 2315648Sgblack@eecs.umich.edu } else { 2325648Sgblack@eecs.umich.edu return 0; 2335648Sgblack@eecs.umich.edu } 2345648Sgblack@eecs.umich.edu} 2355648Sgblack@eecs.umich.edu 2365648Sgblack@eecs.umich.edutemplate <class Impl> 2375648Sgblack@eecs.umich.eduvoid 2385649Sgblack@eecs.umich.eduLSQ<Impl>::resetEntries() 2395649Sgblack@eecs.umich.edu{ 2405649Sgblack@eecs.umich.edu if (lsqPolicy != Dynamic || numThreads > 1) { 2415648Sgblack@eecs.umich.edu int active_threads = (*activeThreads).size(); 2425898Sgblack@eecs.umich.edu 2435648Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = (*activeThreads).begin(); 2445647Sgblack@eecs.umich.edu std::list<unsigned>::iterator list_end = (*activeThreads).end(); 2455691Sgblack@eecs.umich.edu 2465691Sgblack@eecs.umich.edu int maxEntries; 2475691Sgblack@eecs.umich.edu 2485691Sgblack@eecs.umich.edu if (lsqPolicy == Partitioned) { 2495691Sgblack@eecs.umich.edu maxEntries = LQEntries / active_threads; 2505691Sgblack@eecs.umich.edu } else if (lsqPolicy == Threshold && active_threads == 1) { 2515691Sgblack@eecs.umich.edu maxEntries = LQEntries; 2525691Sgblack@eecs.umich.edu } else { 2535691Sgblack@eecs.umich.edu maxEntries = LQEntries; 2545691Sgblack@eecs.umich.edu } 2555691Sgblack@eecs.umich.edu 2565691Sgblack@eecs.umich.edu while (threads != list_end) { 2575691Sgblack@eecs.umich.edu resizeEntries(maxEntries,*threads++); 2585691Sgblack@eecs.umich.edu } 2595691Sgblack@eecs.umich.edu } 2605691Sgblack@eecs.umich.edu} 2615691Sgblack@eecs.umich.edu 2625691Sgblack@eecs.umich.edutemplate<class Impl> 2635691Sgblack@eecs.umich.eduvoid 2645691Sgblack@eecs.umich.eduLSQ<Impl>::removeEntries(unsigned tid) 2655691Sgblack@eecs.umich.edu{ 2665691Sgblack@eecs.umich.edu thread[tid].clearLQ(); 2675691Sgblack@eecs.umich.edu thread[tid].clearSQ(); 2685691Sgblack@eecs.umich.edu} 2695691Sgblack@eecs.umich.edu 2705691Sgblack@eecs.umich.edutemplate<class Impl> 2715691Sgblack@eecs.umich.eduvoid 2725691Sgblack@eecs.umich.eduLSQ<Impl>::resizeEntries(unsigned size,unsigned tid) 2735691Sgblack@eecs.umich.edu{ 2745691Sgblack@eecs.umich.edu thread[tid].resizeLQ(size); 2755691Sgblack@eecs.umich.edu thread[tid].resizeSQ(size); 2765691Sgblack@eecs.umich.edu} 2775691Sgblack@eecs.umich.edu 2785691Sgblack@eecs.umich.edutemplate<class Impl> 2795691Sgblack@eecs.umich.eduvoid 2805691Sgblack@eecs.umich.eduLSQ<Impl>::tick() 2815691Sgblack@eecs.umich.edu{ 2825691Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 2835691Sgblack@eecs.umich.edu 2846066Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 2856066Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 2866050Sgblack@eecs.umich.edu 2876050Sgblack@eecs.umich.edu thread[tid].tick(); 2885691Sgblack@eecs.umich.edu } 2898745Sgblack@eecs.umich.edu} 2908781Sgblack@eecs.umich.edu 2918781Sgblack@eecs.umich.edutemplate<class Impl> 2925691Sgblack@eecs.umich.eduvoid 2935647Sgblack@eecs.umich.eduLSQ<Impl>::insertLoad(DynInstPtr &load_inst) 2946041Sgblack@eecs.umich.edu{ 2956041Sgblack@eecs.umich.edu unsigned tid = load_inst->threadNumber; 2966041Sgblack@eecs.umich.edu 2976041Sgblack@eecs.umich.edu thread[tid].insertLoad(load_inst); 2986136Sgblack@eecs.umich.edu} 2996136Sgblack@eecs.umich.edu 3006136Sgblack@eecs.umich.edutemplate<class Impl> 3016136Sgblack@eecs.umich.eduvoid 3026136Sgblack@eecs.umich.eduLSQ<Impl>::insertStore(DynInstPtr &store_inst) 3036041Sgblack@eecs.umich.edu{ 3046136Sgblack@eecs.umich.edu unsigned tid = store_inst->threadNumber; 3056136Sgblack@eecs.umich.edu 3069090Sandreas.hansson@arm.com thread[tid].insertStore(store_inst); 3076041Sgblack@eecs.umich.edu} 3086041Sgblack@eecs.umich.edu 3096041Sgblack@eecs.umich.edutemplate<class Impl> 3106137Sgblack@eecs.umich.eduFault 3116137Sgblack@eecs.umich.eduLSQ<Impl>::executeLoad(DynInstPtr &inst) 3126137Sgblack@eecs.umich.edu{ 3137913SBrad.Beckmann@amd.com unsigned tid = inst->threadNumber; 3147913SBrad.Beckmann@amd.com 3157913SBrad.Beckmann@amd.com return thread[tid].executeLoad(inst); 3167913SBrad.Beckmann@amd.com} 3177913SBrad.Beckmann@amd.com 3186137Sgblack@eecs.umich.edutemplate<class Impl> 3197913SBrad.Beckmann@amd.comFault 3208922Swilliam.wang@arm.comLSQ<Impl>::executeStore(DynInstPtr &inst) 3218922Swilliam.wang@arm.com{ 3228922Swilliam.wang@arm.com unsigned tid = inst->threadNumber; 3236137Sgblack@eecs.umich.edu 3246137Sgblack@eecs.umich.edu return thread[tid].executeStore(inst); 3256137Sgblack@eecs.umich.edu} 3265651Sgblack@eecs.umich.edu 3275651Sgblack@eecs.umich.edutemplate<class Impl> 3285651Sgblack@eecs.umich.eduvoid 3296136Sgblack@eecs.umich.eduLSQ<Impl>::writebackStores() 3305651Sgblack@eecs.umich.edu{ 3315651Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 3325651Sgblack@eecs.umich.edu 3335651Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 3345654Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 3355654Sgblack@eecs.umich.edu 3365654Sgblack@eecs.umich.edu if (numStoresToWB(tid) > 0) { 3375654Sgblack@eecs.umich.edu DPRINTF(Writeback,"[tid:%i] Writing back stores. %i stores " 3385697Snate@binkert.org "available for Writeback.\n", tid, numStoresToWB(tid)); 3395655Sgblack@eecs.umich.edu } 3405691Sgblack@eecs.umich.edu 3415691Sgblack@eecs.umich.edu thread[tid].writebackStores(); 3425654Sgblack@eecs.umich.edu } 3435651Sgblack@eecs.umich.edu} 3445651Sgblack@eecs.umich.edu 3455651Sgblack@eecs.umich.edutemplate<class Impl> 3465651Sgblack@eecs.umich.edubool 3475651Sgblack@eecs.umich.eduLSQ<Impl>::violation() 3485651Sgblack@eecs.umich.edu{ 3496064Sgblack@eecs.umich.edu /* Answers: Does Anybody Have a Violation?*/ 3505651Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 3515651Sgblack@eecs.umich.edu 3525651Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 3535651Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 3546065Sgblack@eecs.umich.edu if (thread[tid].violation()) 3556065Sgblack@eecs.umich.edu return true; 3566065Sgblack@eecs.umich.edu } 3576065Sgblack@eecs.umich.edu 3586065Sgblack@eecs.umich.edu return false; 3596069Sgblack@eecs.umich.edu} 3606069Sgblack@eecs.umich.edu 3616069Sgblack@eecs.umich.edutemplate<class Impl> 3626069Sgblack@eecs.umich.eduint 3636069Sgblack@eecs.umich.eduLSQ<Impl>::getCount() 3646069Sgblack@eecs.umich.edu{ 3656065Sgblack@eecs.umich.edu unsigned total = 0; 3666065Sgblack@eecs.umich.edu 3676065Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 3686065Sgblack@eecs.umich.edu 3696065Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 3708711Sandreas.hansson@arm.com unsigned tid = *active_threads++; 3719090Sandreas.hansson@arm.com total += getCount(tid); 3726041Sgblack@eecs.umich.edu } 3738711Sandreas.hansson@arm.com 3749235Sandreas.hansson@arm.com return total; 3759235Sandreas.hansson@arm.com} 3769235Sandreas.hansson@arm.com 3778711Sandreas.hansson@arm.comtemplate<class Impl> 3788711Sandreas.hansson@arm.comint 3796041Sgblack@eecs.umich.eduLSQ<Impl>::numLoads() 3806041Sgblack@eecs.umich.edu{ 3816041Sgblack@eecs.umich.edu unsigned total = 0; 3828711Sandreas.hansson@arm.com 3839090Sandreas.hansson@arm.com std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 3846041Sgblack@eecs.umich.edu 3858711Sandreas.hansson@arm.com while (active_threads != (*activeThreads).end()) { 3868711Sandreas.hansson@arm.com unsigned tid = *active_threads++; 3878711Sandreas.hansson@arm.com total += numLoads(tid); 3888711Sandreas.hansson@arm.com } 3898711Sandreas.hansson@arm.com 3906041Sgblack@eecs.umich.edu return total; 3916041Sgblack@eecs.umich.edu} 3926041Sgblack@eecs.umich.edu 3935647Sgblack@eecs.umich.edutemplate<class Impl> 3945648Sgblack@eecs.umich.eduint 3955647Sgblack@eecs.umich.eduLSQ<Impl>::numStores() 3965647Sgblack@eecs.umich.edu{ 3975647Sgblack@eecs.umich.edu unsigned total = 0; 3985647Sgblack@eecs.umich.edu 3995647Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 4005647Sgblack@eecs.umich.edu 4015647Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 4025647Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 4035647Sgblack@eecs.umich.edu total += thread[tid].numStores(); 4045647Sgblack@eecs.umich.edu } 4055647Sgblack@eecs.umich.edu 4065647Sgblack@eecs.umich.edu return total; 4075647Sgblack@eecs.umich.edu} 4085647Sgblack@eecs.umich.edu 4095647Sgblack@eecs.umich.edutemplate<class Impl> 4105647Sgblack@eecs.umich.eduint 4115647Sgblack@eecs.umich.eduLSQ<Impl>::numLoadsReady() 4125848Sgblack@eecs.umich.edu{ 4135848Sgblack@eecs.umich.edu unsigned total = 0; 4149544Sandreas.hansson@arm.com 4155848Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 4165848Sgblack@eecs.umich.edu 4177823Ssteve.reinhardt@amd.com while (active_threads != (*activeThreads).end()) { 4185848Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 4195848Sgblack@eecs.umich.edu total += thread[tid].numLoadsReady(); 4205848Sgblack@eecs.umich.edu } 4215848Sgblack@eecs.umich.edu 4225848Sgblack@eecs.umich.edu return total; 4235848Sgblack@eecs.umich.edu} 4245647Sgblack@eecs.umich.edu 4255647Sgblack@eecs.umich.edutemplate<class Impl> 4265647Sgblack@eecs.umich.eduunsigned 4275647Sgblack@eecs.umich.eduLSQ<Impl>::numFreeEntries() 4285648Sgblack@eecs.umich.edu{ 4295647Sgblack@eecs.umich.edu unsigned total = 0; 4305647Sgblack@eecs.umich.edu 4315647Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 4325648Sgblack@eecs.umich.edu 4335647Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 4345647Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 4355647Sgblack@eecs.umich.edu total += thread[tid].numFreeEntries(); 4365647Sgblack@eecs.umich.edu } 4375647Sgblack@eecs.umich.edu 4385647Sgblack@eecs.umich.edu return total; 4395647Sgblack@eecs.umich.edu} 4405647Sgblack@eecs.umich.edu 4415647Sgblack@eecs.umich.edutemplate<class Impl> 4425647Sgblack@eecs.umich.eduunsigned 4435647Sgblack@eecs.umich.eduLSQ<Impl>::numFreeEntries(unsigned tid) 4445647Sgblack@eecs.umich.edu{ 4455647Sgblack@eecs.umich.edu //if( lsqPolicy == Dynamic ) 4465647Sgblack@eecs.umich.edu //return numFreeEntries(); 4475647Sgblack@eecs.umich.edu //else 4485647Sgblack@eecs.umich.edu return thread[tid].numFreeEntries(); 4495647Sgblack@eecs.umich.edu} 4505647Sgblack@eecs.umich.edu 4515647Sgblack@eecs.umich.edutemplate<class Impl> 4525647Sgblack@eecs.umich.edubool 4535647Sgblack@eecs.umich.eduLSQ<Impl>::isFull() 4545647Sgblack@eecs.umich.edu{ 4555647Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 4565647Sgblack@eecs.umich.edu 4575647Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 4585647Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 4595647Sgblack@eecs.umich.edu if (! (thread[tid].lqFull() || thread[tid].sqFull()) ) 4605647Sgblack@eecs.umich.edu return false; 4615647Sgblack@eecs.umich.edu } 4625647Sgblack@eecs.umich.edu 4635647Sgblack@eecs.umich.edu return true; 4645647Sgblack@eecs.umich.edu} 4655690Sgblack@eecs.umich.edu 4665690Sgblack@eecs.umich.edutemplate<class Impl> 4675690Sgblack@eecs.umich.edubool 4685690Sgblack@eecs.umich.eduLSQ<Impl>::isFull(unsigned tid) 4695647Sgblack@eecs.umich.edu{ 4705647Sgblack@eecs.umich.edu //@todo: Change to Calculate All Entries for 4715647Sgblack@eecs.umich.edu //Dynamic Policy 4725647Sgblack@eecs.umich.edu if( lsqPolicy == Dynamic ) 4735647Sgblack@eecs.umich.edu return isFull(); 4745647Sgblack@eecs.umich.edu else 4755647Sgblack@eecs.umich.edu return thread[tid].lqFull() || thread[tid].sqFull(); 4765647Sgblack@eecs.umich.edu} 4775647Sgblack@eecs.umich.edu 4785647Sgblack@eecs.umich.edutemplate<class Impl> 4795647Sgblack@eecs.umich.edubool 4805647Sgblack@eecs.umich.eduLSQ<Impl>::lqFull() 4815647Sgblack@eecs.umich.edu{ 4825647Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 4835647Sgblack@eecs.umich.edu 4845647Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 4855647Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 4865647Sgblack@eecs.umich.edu if (!thread[tid].lqFull()) 4875647Sgblack@eecs.umich.edu return false; 4885647Sgblack@eecs.umich.edu } 4895647Sgblack@eecs.umich.edu 4905647Sgblack@eecs.umich.edu return true; 4915647Sgblack@eecs.umich.edu} 4925647Sgblack@eecs.umich.edu 4935647Sgblack@eecs.umich.edutemplate<class Impl> 4946046Sgblack@eecs.umich.edubool 4956046Sgblack@eecs.umich.eduLSQ<Impl>::lqFull(unsigned tid) 4966046Sgblack@eecs.umich.edu{ 4976046Sgblack@eecs.umich.edu //@todo: Change to Calculate All Entries for 4986046Sgblack@eecs.umich.edu //Dynamic Policy 4996046Sgblack@eecs.umich.edu if( lsqPolicy == Dynamic ) 5006046Sgblack@eecs.umich.edu return lqFull(); 5016046Sgblack@eecs.umich.edu else 5026046Sgblack@eecs.umich.edu return thread[tid].lqFull(); 5036046Sgblack@eecs.umich.edu} 5046046Sgblack@eecs.umich.edu 5056712Snate@binkert.orgtemplate<class Impl> 5066046Sgblack@eecs.umich.edubool 5076046Sgblack@eecs.umich.eduLSQ<Impl>::sqFull() 5086046Sgblack@eecs.umich.edu{ 5096046Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 5106046Sgblack@eecs.umich.edu 5116046Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 5129524SAndreas.Sandberg@ARM.com unsigned tid = *active_threads++; 5136065Sgblack@eecs.umich.edu if (!sqFull(tid)) 5146065Sgblack@eecs.umich.edu return false; 5156138Sgblack@eecs.umich.edu } 5166138Sgblack@eecs.umich.edu 5176046Sgblack@eecs.umich.edu return true; 5186046Sgblack@eecs.umich.edu} 5196138Sgblack@eecs.umich.edu 5206138Sgblack@eecs.umich.edutemplate<class Impl> 5216138Sgblack@eecs.umich.edubool 5226138Sgblack@eecs.umich.eduLSQ<Impl>::sqFull(unsigned tid) 5236138Sgblack@eecs.umich.edu{ 5246138Sgblack@eecs.umich.edu //@todo: Change to Calculate All Entries for 5256138Sgblack@eecs.umich.edu //Dynamic Policy 5266138Sgblack@eecs.umich.edu if( lsqPolicy == Dynamic ) 5276138Sgblack@eecs.umich.edu return sqFull(); 5286138Sgblack@eecs.umich.edu else 5296138Sgblack@eecs.umich.edu return thread[tid].sqFull(); 5306138Sgblack@eecs.umich.edu} 5316138Sgblack@eecs.umich.edu 5326138Sgblack@eecs.umich.edutemplate<class Impl> 5336138Sgblack@eecs.umich.edubool 5346138Sgblack@eecs.umich.eduLSQ<Impl>::isStalled() 5356138Sgblack@eecs.umich.edu{ 5366138Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 5376138Sgblack@eecs.umich.edu 5386138Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 5396138Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 5406138Sgblack@eecs.umich.edu if (!thread[tid].isStalled()) 5416138Sgblack@eecs.umich.edu return false; 5426138Sgblack@eecs.umich.edu } 5436138Sgblack@eecs.umich.edu 5446138Sgblack@eecs.umich.edu return true; 5456138Sgblack@eecs.umich.edu} 5466138Sgblack@eecs.umich.edu 5476138Sgblack@eecs.umich.edutemplate<class Impl> 5486138Sgblack@eecs.umich.edubool 5496138Sgblack@eecs.umich.eduLSQ<Impl>::isStalled(unsigned tid) 5506046Sgblack@eecs.umich.edu{ 5516046Sgblack@eecs.umich.edu if( lsqPolicy == Dynamic ) 5526069Sgblack@eecs.umich.edu return isStalled(); 5536069Sgblack@eecs.umich.edu else 5546069Sgblack@eecs.umich.edu return thread[tid].isStalled(); 5556046Sgblack@eecs.umich.edu} 5566046Sgblack@eecs.umich.edu 5576069Sgblack@eecs.umich.edutemplate<class Impl> 5586069Sgblack@eecs.umich.edubool 5596069Sgblack@eecs.umich.eduLSQ<Impl>::hasStoresToWB() 5606046Sgblack@eecs.umich.edu{ 5616069Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 5626069Sgblack@eecs.umich.edu 5636138Sgblack@eecs.umich.edu if ((*activeThreads).empty()) 5646138Sgblack@eecs.umich.edu return false; 5656069Sgblack@eecs.umich.edu 5666069Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 5676069Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 5686046Sgblack@eecs.umich.edu if (!hasStoresToWB(tid)) 5696046Sgblack@eecs.umich.edu return false; 5706138Sgblack@eecs.umich.edu } 5718922Swilliam.wang@arm.com 5726138Sgblack@eecs.umich.edu return true; 5736046Sgblack@eecs.umich.edu} 5745647Sgblack@eecs.umich.edu 5755647Sgblack@eecs.umich.edutemplate<class Impl> 5765647Sgblack@eecs.umich.edubool 5775647Sgblack@eecs.umich.eduLSQ<Impl>::willWB() 5785647Sgblack@eecs.umich.edu{ 5795647Sgblack@eecs.umich.edu std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 5805647Sgblack@eecs.umich.edu 5815647Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 5825647Sgblack@eecs.umich.edu unsigned tid = *active_threads++; 5835647Sgblack@eecs.umich.edu if (!willWB(tid)) 5845647Sgblack@eecs.umich.edu return false; 5855647Sgblack@eecs.umich.edu } 5865647Sgblack@eecs.umich.edu 5875647Sgblack@eecs.umich.edu return true; 5885648Sgblack@eecs.umich.edu} 5895648Sgblack@eecs.umich.edu 5905848Sgblack@eecs.umich.edutemplate<class Impl> 5915848Sgblack@eecs.umich.eduvoid 5925848Sgblack@eecs.umich.eduLSQ<Impl>::dumpInsts() 5935648Sgblack@eecs.umich.edu{ 5949544Sandreas.hansson@arm.com std::list<unsigned>::iterator active_threads = (*activeThreads).begin(); 5955648Sgblack@eecs.umich.edu 5965648Sgblack@eecs.umich.edu while (active_threads != (*activeThreads).end()) { 5979544Sandreas.hansson@arm.com unsigned tid = *active_threads++; 5989544Sandreas.hansson@arm.com thread[tid].dumpInsts(); 5995648Sgblack@eecs.umich.edu } 6005648Sgblack@eecs.umich.edu} 6019544Sandreas.hansson@arm.com