lsq_impl.hh revision 3867
12SN/A/* 21762SN/A * Copyright (c) 2005-2006 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Korey Sewell 292665Ssaidi@eecs.umich.edu */ 302665Ssaidi@eecs.umich.edu 312665Ssaidi@eecs.umich.edu#include <algorithm> 322SN/A#include <list> 332SN/A#include <string> 344265Sgblack@eecs.umich.edu 352SN/A#include "cpu/o3/lsq.hh" 362SN/A 373506Ssaidi@eecs.umich.edutemplate <class Impl> 383506Ssaidi@eecs.umich.eduTick 392SN/ALSQ<Impl>::DcachePort::recvAtomic(PacketPtr pkt) 404266Sgblack@eecs.umich.edu{ 412973Sgblack@eecs.umich.edu panic("O3CPU model does not work with atomic mode!"); 423584Ssaidi@eecs.umich.edu return curTick; 4356SN/A} 444265Sgblack@eecs.umich.edu 453614Sgblack@eecs.umich.edutemplate <class Impl> 461717SN/Avoid 472518SN/ALSQ<Impl>::DcachePort::recvFunctional(PacketPtr pkt) 4856SN/A{ 494762Snate@binkert.org DPRINTF(LSQ, "LSQ doesn't update things on a recvFunctional."); 502518SN/A} 512SN/A 523614Sgblack@eecs.umich.edutemplate <class Impl> 533614Sgblack@eecs.umich.eduvoid 543614Sgblack@eecs.umich.eduLSQ<Impl>::DcachePort::recvStatusChange(Status status) 553614Sgblack@eecs.umich.edu{ 563065Sgblack@eecs.umich.edu if (status == RangeChange) { 573065Sgblack@eecs.umich.edu if (!snoopRangeSent) { 583506Ssaidi@eecs.umich.edu snoopRangeSent = true; 593065Sgblack@eecs.umich.edu sendStatusChange(Port::RangeChange); 602SN/A } 612973Sgblack@eecs.umich.edu return; 622SN/A } 633840Shsul@eecs.umich.edu panic("O3CPU doesn't expect recvStatusChange callback!"); 643825Ssaidi@eecs.umich.edu} 653903Ssaidi@eecs.umich.edu 663840Shsul@eecs.umich.edutemplate <class Impl> 673825Ssaidi@eecs.umich.edubool 683506Ssaidi@eecs.umich.eduLSQ<Impl>::DcachePort::recvTiming(PacketPtr pkt) 693506Ssaidi@eecs.umich.edu{ 704265Sgblack@eecs.umich.edu if (pkt->isResponse()) { 714054Sbinkertn@umich.edu lsq->thread[pkt->req->getThreadNum()].completeDataAccess(pkt); 724054Sbinkertn@umich.edu } 734054Sbinkertn@umich.edu else { 744054Sbinkertn@umich.edu //else it is a coherence request, maybe you need to do something 754054Sbinkertn@umich.edu warn("Recieved a coherence request (Invalidate?), 03CPU doesn't" 764054Sbinkertn@umich.edu "update LSQ for these\n"); 774054Sbinkertn@umich.edu } 784054Sbinkertn@umich.edu return true; 794054Sbinkertn@umich.edu} 804054Sbinkertn@umich.edu 814054Sbinkertn@umich.edutemplate <class Impl> 824054Sbinkertn@umich.eduvoid 834054Sbinkertn@umich.eduLSQ<Impl>::DcachePort::recvRetry() 844054Sbinkertn@umich.edu{ 854054Sbinkertn@umich.edu if (lsq->retryTid == -1) 864054Sbinkertn@umich.edu { 874054Sbinkertn@umich.edu //Squashed, so drop it 884054Sbinkertn@umich.edu return; 894054Sbinkertn@umich.edu } 904054Sbinkertn@umich.edu lsq->thread[lsq->retryTid].recvRetry(); 914054Sbinkertn@umich.edu // Speculatively clear the retry Tid. This will get set again if 923506Ssaidi@eecs.umich.edu // the LSQUnit was unable to complete its access. 933506Ssaidi@eecs.umich.edu lsq->retryTid = -1; 942SN/A} 952SN/A 962SN/Atemplate <class Impl> 972SN/ALSQ<Impl>::LSQ(Params *params) 982SN/A : dcachePort(this), LQEntries(params->LQEntries), 993748Sgblack@eecs.umich.edu SQEntries(params->SQEntries), numThreads(params->numberOfThreads), 1003748Sgblack@eecs.umich.edu retryTid(-1) 1013748Sgblack@eecs.umich.edu{ 1023748Sgblack@eecs.umich.edu DPRINTF(LSQ, "Creating LSQ object.\n"); 1033748Sgblack@eecs.umich.edu 1043748Sgblack@eecs.umich.edu dcachePort.snoopRangeSent = false; 1053748Sgblack@eecs.umich.edu 1063748Sgblack@eecs.umich.edu //**********************************************/ 1073748Sgblack@eecs.umich.edu //************ Handle SMT Parameters ***********/ 1083748Sgblack@eecs.umich.edu //**********************************************/ 1093748Sgblack@eecs.umich.edu std::string policy = params->smtLSQPolicy; 1103748Sgblack@eecs.umich.edu 1113748Sgblack@eecs.umich.edu //Convert string to lowercase 1123748Sgblack@eecs.umich.edu std::transform(policy.begin(), policy.end(), policy.begin(), 1133748Sgblack@eecs.umich.edu (int(*)(int)) tolower); 1143748Sgblack@eecs.umich.edu 1153748Sgblack@eecs.umich.edu //Figure out fetch policy 1163748Sgblack@eecs.umich.edu if (policy == "dynamic") { 1173748Sgblack@eecs.umich.edu lsqPolicy = Dynamic; 1183748Sgblack@eecs.umich.edu 1193748Sgblack@eecs.umich.edu maxLQEntries = LQEntries; 1203748Sgblack@eecs.umich.edu maxSQEntries = SQEntries; 1213748Sgblack@eecs.umich.edu 1223748Sgblack@eecs.umich.edu DPRINTF(LSQ, "LSQ sharing policy set to Dynamic\n"); 1233748Sgblack@eecs.umich.edu 1243748Sgblack@eecs.umich.edu } else if (policy == "partitioned") { 1253748Sgblack@eecs.umich.edu lsqPolicy = Partitioned; 1263748Sgblack@eecs.umich.edu 1273748Sgblack@eecs.umich.edu //@todo:make work if part_amt doesnt divide evenly. 1283748Sgblack@eecs.umich.edu maxLQEntries = LQEntries / numThreads; 1293748Sgblack@eecs.umich.edu maxSQEntries = SQEntries / numThreads; 1303748Sgblack@eecs.umich.edu 1313748Sgblack@eecs.umich.edu DPRINTF(Fetch, "LSQ sharing policy set to Partitioned: " 1323748Sgblack@eecs.umich.edu "%i entries per LQ | %i entries per SQ", 1333748Sgblack@eecs.umich.edu maxLQEntries,maxSQEntries); 1343748Sgblack@eecs.umich.edu 1353748Sgblack@eecs.umich.edu } else if (policy == "threshold") { 1363748Sgblack@eecs.umich.edu lsqPolicy = Threshold; 1373748Sgblack@eecs.umich.edu 1383748Sgblack@eecs.umich.edu assert(params->smtLSQThreshold > LQEntries); 1393748Sgblack@eecs.umich.edu assert(params->smtLSQThreshold > SQEntries); 1403748Sgblack@eecs.umich.edu 1413748Sgblack@eecs.umich.edu //Divide up by threshold amount 1423748Sgblack@eecs.umich.edu //@todo: Should threads check the max and the total 1433748Sgblack@eecs.umich.edu //amount of the LSQ 1443748Sgblack@eecs.umich.edu maxLQEntries = params->smtLSQThreshold; 1453748Sgblack@eecs.umich.edu maxSQEntries = params->smtLSQThreshold; 1463748Sgblack@eecs.umich.edu 1473748Sgblack@eecs.umich.edu DPRINTF(LSQ, "LSQ sharing policy set to Threshold: " 1483748Sgblack@eecs.umich.edu "%i entries per LQ | %i entries per SQ", 1492SN/A maxLQEntries,maxSQEntries); 1502SN/A 1514046Sbinkertn@umich.edu } else { 1522SN/A assert(0 && "Invalid LSQ Sharing Policy.Options Are:{Dynamic," 1534046Sbinkertn@umich.edu "Partitioned, Threshold}"); 1544046Sbinkertn@umich.edu } 1553903Ssaidi@eecs.umich.edu 1564265Sgblack@eecs.umich.edu //Initialize LSQs 1574054Sbinkertn@umich.edu for (int tid=0; tid < numThreads; tid++) { 1582973Sgblack@eecs.umich.edu thread[tid].init(params, this, maxLQEntries, maxSQEntries, tid); 1594265Sgblack@eecs.umich.edu thread[tid].setDcachePort(&dcachePort); 1604265Sgblack@eecs.umich.edu } 1613065Sgblack@eecs.umich.edu} 1624265Sgblack@eecs.umich.edu 1634265Sgblack@eecs.umich.edu 1644265Sgblack@eecs.umich.edutemplate<class Impl> 1654539Sgblack@eecs.umich.edustd::string 1664265Sgblack@eecs.umich.eduLSQ<Impl>::name() const 1674265Sgblack@eecs.umich.edu{ 1684265Sgblack@eecs.umich.edu return iewStage->name() + ".lsq"; 1694265Sgblack@eecs.umich.edu} 1704265Sgblack@eecs.umich.edu 1714265Sgblack@eecs.umich.edutemplate<class Impl> 1724265Sgblack@eecs.umich.eduvoid 1734265Sgblack@eecs.umich.eduLSQ<Impl>::regStats() 1744265Sgblack@eecs.umich.edu{ 1754265Sgblack@eecs.umich.edu //Initialize LSQs 1764265Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 1774265Sgblack@eecs.umich.edu thread[tid].regStats(); 1784265Sgblack@eecs.umich.edu } 1794265Sgblack@eecs.umich.edu} 1804265Sgblack@eecs.umich.edu 1814265Sgblack@eecs.umich.edutemplate<class Impl> 1824265Sgblack@eecs.umich.eduvoid 1834265Sgblack@eecs.umich.eduLSQ<Impl>::setActiveThreads(std::list<unsigned> *at_ptr) 1844265Sgblack@eecs.umich.edu{ 1854265Sgblack@eecs.umich.edu activeThreads = at_ptr; 1864265Sgblack@eecs.umich.edu assert(activeThreads != 0); 1874265Sgblack@eecs.umich.edu} 1884265Sgblack@eecs.umich.edu 1894265Sgblack@eecs.umich.edutemplate<class Impl> 1904265Sgblack@eecs.umich.eduvoid 1914265Sgblack@eecs.umich.eduLSQ<Impl>::setCPU(O3CPU *cpu_ptr) 1924265Sgblack@eecs.umich.edu{ 1934265Sgblack@eecs.umich.edu cpu = cpu_ptr; 1944265Sgblack@eecs.umich.edu 1954265Sgblack@eecs.umich.edu dcachePort.setName(name()); 1964265Sgblack@eecs.umich.edu 1974265Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 1984265Sgblack@eecs.umich.edu thread[tid].setCPU(cpu_ptr); 1994265Sgblack@eecs.umich.edu } 2004265Sgblack@eecs.umich.edu} 2014265Sgblack@eecs.umich.edu 2024265Sgblack@eecs.umich.edutemplate<class Impl> 2034265Sgblack@eecs.umich.eduvoid 2044265Sgblack@eecs.umich.eduLSQ<Impl>::setIEW(IEW *iew_ptr) 2054265Sgblack@eecs.umich.edu{ 2064265Sgblack@eecs.umich.edu iewStage = iew_ptr; 2074265Sgblack@eecs.umich.edu 2084265Sgblack@eecs.umich.edu for (int tid=0; tid < numThreads; tid++) { 2094265Sgblack@eecs.umich.edu thread[tid].setIEW(iew_ptr); 2104265Sgblack@eecs.umich.edu } 2114265Sgblack@eecs.umich.edu} 2124265Sgblack@eecs.umich.edu 2134265Sgblack@eecs.umich.edutemplate <class Impl> 2144265Sgblack@eecs.umich.eduvoid 2154265Sgblack@eecs.umich.eduLSQ<Impl>::switchOut() 2164265Sgblack@eecs.umich.edu{ 2174265Sgblack@eecs.umich.edu for (int tid = 0; tid < numThreads; tid++) { 2184265Sgblack@eecs.umich.edu thread[tid].switchOut(); 2194265Sgblack@eecs.umich.edu } 2204265Sgblack@eecs.umich.edu} 2214265Sgblack@eecs.umich.edu 2224265Sgblack@eecs.umich.edutemplate <class Impl> 2234265Sgblack@eecs.umich.eduvoid 2244265Sgblack@eecs.umich.eduLSQ<Impl>::takeOverFrom() 2254265Sgblack@eecs.umich.edu{ 2264265Sgblack@eecs.umich.edu for (int tid = 0; tid < numThreads; tid++) { 2274265Sgblack@eecs.umich.edu thread[tid].takeOverFrom(); 2284265Sgblack@eecs.umich.edu } 2294265Sgblack@eecs.umich.edu} 2304265Sgblack@eecs.umich.edu 2314265Sgblack@eecs.umich.edutemplate <class Impl> 2324265Sgblack@eecs.umich.eduint 2334265Sgblack@eecs.umich.eduLSQ<Impl>::entryAmount(int num_threads) 2344265Sgblack@eecs.umich.edu{ 2354265Sgblack@eecs.umich.edu if (lsqPolicy == Partitioned) { 2364265Sgblack@eecs.umich.edu return LQEntries / num_threads; 2374265Sgblack@eecs.umich.edu } else { 2384265Sgblack@eecs.umich.edu return 0; 2394265Sgblack@eecs.umich.edu } 2404265Sgblack@eecs.umich.edu} 2414265Sgblack@eecs.umich.edu 2424265Sgblack@eecs.umich.edutemplate <class Impl> 2434265Sgblack@eecs.umich.eduvoid 2444265Sgblack@eecs.umich.eduLSQ<Impl>::resetEntries() 2454265Sgblack@eecs.umich.edu{ 2463380Sgblack@eecs.umich.edu if (lsqPolicy != Dynamic || numThreads > 1) { 2473380Sgblack@eecs.umich.edu int active_threads = activeThreads->size(); 2484539Sgblack@eecs.umich.edu 2493380Sgblack@eecs.umich.edu int maxEntries; 2503380Sgblack@eecs.umich.edu 2513380Sgblack@eecs.umich.edu if (lsqPolicy == Partitioned) { 2523380Sgblack@eecs.umich.edu maxEntries = LQEntries / active_threads; 2533380Sgblack@eecs.umich.edu } else if (lsqPolicy == Threshold && active_threads == 1) { 2543380Sgblack@eecs.umich.edu maxEntries = LQEntries; 2553380Sgblack@eecs.umich.edu } else { 2563380Sgblack@eecs.umich.edu maxEntries = LQEntries; 2573380Sgblack@eecs.umich.edu } 2583380Sgblack@eecs.umich.edu 2593380Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 2603065Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 2613588Sgblack@eecs.umich.edu 2623588Sgblack@eecs.umich.edu while (threads != end) { 2633588Sgblack@eecs.umich.edu unsigned tid = *threads++; 2643790Sgblack@eecs.umich.edu 2654172Ssaidi@eecs.umich.edu resizeEntries(maxEntries, tid); 2663380Sgblack@eecs.umich.edu } 2673059Sgblack@eecs.umich.edu } 2683588Sgblack@eecs.umich.edu} 2693380Sgblack@eecs.umich.edu 2703380Sgblack@eecs.umich.edutemplate<class Impl> 2713790Sgblack@eecs.umich.eduvoid 2724172Ssaidi@eecs.umich.eduLSQ<Impl>::removeEntries(unsigned tid) 2733380Sgblack@eecs.umich.edu{ 2743380Sgblack@eecs.umich.edu thread[tid].clearLQ(); 2753588Sgblack@eecs.umich.edu thread[tid].clearSQ(); 2763380Sgblack@eecs.umich.edu} 2773380Sgblack@eecs.umich.edu 2783380Sgblack@eecs.umich.edutemplate<class Impl> 2793380Sgblack@eecs.umich.eduvoid 2803380Sgblack@eecs.umich.eduLSQ<Impl>::resizeEntries(unsigned size,unsigned tid) 2813059Sgblack@eecs.umich.edu{ 2823380Sgblack@eecs.umich.edu thread[tid].resizeLQ(size); 2833380Sgblack@eecs.umich.edu thread[tid].resizeSQ(size); 2843380Sgblack@eecs.umich.edu} 2853380Sgblack@eecs.umich.edu 2863588Sgblack@eecs.umich.edutemplate<class Impl> 2873380Sgblack@eecs.umich.eduvoid 2883380Sgblack@eecs.umich.eduLSQ<Impl>::tick() 2893059Sgblack@eecs.umich.edu{ 2903059Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 2913380Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 2923380Sgblack@eecs.umich.edu 2933380Sgblack@eecs.umich.edu while (threads != end) { 2943380Sgblack@eecs.umich.edu unsigned tid = *threads++; 2953380Sgblack@eecs.umich.edu 2963588Sgblack@eecs.umich.edu thread[tid].tick(); 2973380Sgblack@eecs.umich.edu } 2983380Sgblack@eecs.umich.edu} 2993380Sgblack@eecs.umich.edu 3003588Sgblack@eecs.umich.edutemplate<class Impl> 3013059Sgblack@eecs.umich.eduvoid 3023065Sgblack@eecs.umich.eduLSQ<Impl>::insertLoad(DynInstPtr &load_inst) 3032973Sgblack@eecs.umich.edu{ 3044265Sgblack@eecs.umich.edu unsigned tid = load_inst->threadNumber; 3054265Sgblack@eecs.umich.edu 3064054Sbinkertn@umich.edu thread[tid].insertLoad(load_inst); 3074054Sbinkertn@umich.edu} 3084054Sbinkertn@umich.edu 3094054Sbinkertn@umich.edutemplate<class Impl> 3104054Sbinkertn@umich.eduvoid 3114054Sbinkertn@umich.eduLSQ<Impl>::insertStore(DynInstPtr &store_inst) 3121904SN/A{ 3134054Sbinkertn@umich.edu unsigned tid = store_inst->threadNumber; 3141904SN/A 3154054Sbinkertn@umich.edu thread[tid].insertStore(store_inst); 3164046Sbinkertn@umich.edu} 317452SN/A 3183064Sgblack@eecs.umich.edutemplate<class Impl> 3192SN/AFault 3204054Sbinkertn@umich.eduLSQ<Impl>::executeLoad(DynInstPtr &inst) 3211904SN/A{ 3222SN/A unsigned tid = inst->threadNumber; 3234054Sbinkertn@umich.edu 3243064Sgblack@eecs.umich.edu return thread[tid].executeLoad(inst); 3252SN/A} 3262SN/A 3271904SN/Atemplate<class Impl> 3281904SN/AFault 3291904SN/ALSQ<Impl>::executeStore(DynInstPtr &inst) 3302299SN/A{ 3314054Sbinkertn@umich.edu unsigned tid = inst->threadNumber; 3321904SN/A 3331904SN/A return thread[tid].executeStore(inst); 3341904SN/A} 3351904SN/A 3361904SN/Atemplate<class Impl> 3371904SN/Avoid 3381904SN/ALSQ<Impl>::writebackStores() 339452SN/A{ 3401904SN/A std::list<unsigned>::iterator threads = activeThreads->begin(); 3411904SN/A std::list<unsigned>::iterator end = activeThreads->end(); 3421904SN/A 3432SN/A while (threads != end) { 3442SN/A unsigned tid = *threads++; 3451904SN/A 3461904SN/A if (numStoresToWB(tid) > 0) { 3471904SN/A DPRINTF(Writeback,"[tid:%i] Writing back stores. %i stores " 3481904SN/A "available for Writeback.\n", tid, numStoresToWB(tid)); 3491904SN/A } 3501904SN/A 3512SN/A thread[tid].writebackStores(); 3521904SN/A } 3532SN/A} 3542SN/A 3551904SN/Atemplate<class Impl> 3562SN/Abool 3574054Sbinkertn@umich.eduLSQ<Impl>::violation() 3584762Snate@binkert.org{ 3591904SN/A /* Answers: Does Anybody Have a Violation?*/ 3601904SN/A std::list<unsigned>::iterator threads = activeThreads->begin(); 3614054Sbinkertn@umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 3621904SN/A 3631904SN/A while (threads != end) { 3641904SN/A unsigned tid = *threads++; 3651904SN/A 3661904SN/A if (thread[tid].violation()) 3671904SN/A return true; 3681904SN/A } 3691904SN/A 3701904SN/A return false; 3711904SN/A} 3721904SN/A 3734054Sbinkertn@umich.edutemplate<class Impl> 3741904SN/Aint 3751904SN/ALSQ<Impl>::getCount() 3764054Sbinkertn@umich.edu{ 3772525SN/A unsigned total = 0; 3781904SN/A 3792525SN/A std::list<unsigned>::iterator threads = activeThreads->begin(); 3802525SN/A std::list<unsigned>::iterator end = activeThreads->end(); 3812525SN/A 3821904SN/A while (threads != end) { 3831904SN/A unsigned tid = *threads++; 3841904SN/A 3854054Sbinkertn@umich.edu total += getCount(tid); 3861904SN/A } 3871904SN/A 3884054Sbinkertn@umich.edu return total; 3891904SN/A} 3901967SN/A 3911967SN/Atemplate<class Impl> 3921967SN/Aint 3931967SN/ALSQ<Impl>::numLoads() 3941967SN/A{ 3952SN/A unsigned total = 0; 3963817Ssaidi@eecs.umich.edu 3974266Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 3983506Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 3994054Sbinkertn@umich.edu 4003506Ssaidi@eecs.umich.edu while (threads != end) { 4013506Ssaidi@eecs.umich.edu unsigned tid = *threads++; 4023506Ssaidi@eecs.umich.edu 4033814Ssaidi@eecs.umich.edu total += numLoads(tid); 4043506Ssaidi@eecs.umich.edu } 4053931Ssaidi@eecs.umich.edu 4063931Ssaidi@eecs.umich.edu return total; 4073748Sgblack@eecs.umich.edu} 4083748Sgblack@eecs.umich.edu 4093748Sgblack@eecs.umich.edutemplate<class Impl> 4103748Sgblack@eecs.umich.eduint 4113748Sgblack@eecs.umich.eduLSQ<Impl>::numStores() 4123748Sgblack@eecs.umich.edu{ 4133748Sgblack@eecs.umich.edu unsigned total = 0; 4143748Sgblack@eecs.umich.edu 4153748Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 4163748Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 4174001Ssaidi@eecs.umich.edu 4183748Sgblack@eecs.umich.edu while (threads != end) { 4193748Sgblack@eecs.umich.edu unsigned tid = *threads++; 4203748Sgblack@eecs.umich.edu 4213748Sgblack@eecs.umich.edu total += thread[tid].numStores(); 4223748Sgblack@eecs.umich.edu } 4233748Sgblack@eecs.umich.edu 4243748Sgblack@eecs.umich.edu return total; 4253748Sgblack@eecs.umich.edu} 4263748Sgblack@eecs.umich.edu 4273748Sgblack@eecs.umich.edutemplate<class Impl> 4283880Ssaidi@eecs.umich.eduint 4293603Ssaidi@eecs.umich.eduLSQ<Impl>::numLoadsReady() 4303603Ssaidi@eecs.umich.edu{ 4314054Sbinkertn@umich.edu unsigned total = 0; 4324054Sbinkertn@umich.edu 4334054Sbinkertn@umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 4343903Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 4354539Sgblack@eecs.umich.edu 4363903Ssaidi@eecs.umich.edu while (threads != end) { 4374046Sbinkertn@umich.edu unsigned tid = *threads++; 4383903Ssaidi@eecs.umich.edu 4393903Ssaidi@eecs.umich.edu total += thread[tid].numLoadsReady(); 4403903Ssaidi@eecs.umich.edu } 4413903Ssaidi@eecs.umich.edu 4423903Ssaidi@eecs.umich.edu return total; 4433903Ssaidi@eecs.umich.edu} 4443903Ssaidi@eecs.umich.edu 4453903Ssaidi@eecs.umich.edutemplate<class Impl> 4463903Ssaidi@eecs.umich.eduunsigned 4474539Sgblack@eecs.umich.eduLSQ<Impl>::numFreeEntries() 4483903Ssaidi@eecs.umich.edu{ 4494539Sgblack@eecs.umich.edu unsigned total = 0; 4503903Ssaidi@eecs.umich.edu 4513903Ssaidi@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 4523506Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 4534539Sgblack@eecs.umich.edu 4543584Ssaidi@eecs.umich.edu while (threads != end) { 4553584Ssaidi@eecs.umich.edu unsigned tid = *threads++; 4563748Sgblack@eecs.umich.edu 4573928Ssaidi@eecs.umich.edu total += thread[tid].numFreeEntries(); 4583928Ssaidi@eecs.umich.edu } 4593928Ssaidi@eecs.umich.edu 4603748Sgblack@eecs.umich.edu return total; 4613603Ssaidi@eecs.umich.edu} 4623584Ssaidi@eecs.umich.edu 4633814Ssaidi@eecs.umich.edutemplate<class Impl> 4643814Ssaidi@eecs.umich.eduunsigned 4653814Ssaidi@eecs.umich.eduLSQ<Impl>::numFreeEntries(unsigned tid) 4663814Ssaidi@eecs.umich.edu{ 4673814Ssaidi@eecs.umich.edu //if( lsqPolicy == Dynamic ) 4683743Sgblack@eecs.umich.edu //return numFreeEntries(); 4693743Sgblack@eecs.umich.edu //else 4703584Ssaidi@eecs.umich.edu return thread[tid].numFreeEntries(); 4713743Sgblack@eecs.umich.edu} 4723989Ssaidi@eecs.umich.edu 4733989Ssaidi@eecs.umich.edutemplate<class Impl> 4743603Ssaidi@eecs.umich.edubool 4753931Ssaidi@eecs.umich.eduLSQ<Impl>::isFull() 4763603Ssaidi@eecs.umich.edu{ 4773584Ssaidi@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 4783931Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 4793945Ssaidi@eecs.umich.edu 4803931Ssaidi@eecs.umich.edu while (threads != end) { 4813931Ssaidi@eecs.umich.edu unsigned tid = *threads++; 4823931Ssaidi@eecs.umich.edu 4834172Ssaidi@eecs.umich.edu if (!(thread[tid].lqFull() || thread[tid].sqFull())) 4843748Sgblack@eecs.umich.edu return false; 4853748Sgblack@eecs.umich.edu } 4863748Sgblack@eecs.umich.edu 4874172Ssaidi@eecs.umich.edu return true; 4884172Ssaidi@eecs.umich.edu} 4893815Ssaidi@eecs.umich.edu 4903748Sgblack@eecs.umich.edutemplate<class Impl> 4914172Ssaidi@eecs.umich.edubool 4923815Ssaidi@eecs.umich.eduLSQ<Impl>::isFull(unsigned tid) 4933748Sgblack@eecs.umich.edu{ 4944172Ssaidi@eecs.umich.edu //@todo: Change to Calculate All Entries for 4953815Ssaidi@eecs.umich.edu //Dynamic Policy 4963748Sgblack@eecs.umich.edu if (lsqPolicy == Dynamic) 4974172Ssaidi@eecs.umich.edu return isFull(); 4983815Ssaidi@eecs.umich.edu else 4993748Sgblack@eecs.umich.edu return thread[tid].lqFull() || thread[tid].sqFull(); 5004172Ssaidi@eecs.umich.edu} 5013815Ssaidi@eecs.umich.edu 5023748Sgblack@eecs.umich.edutemplate<class Impl> 5033748Sgblack@eecs.umich.edubool 5044172Ssaidi@eecs.umich.eduLSQ<Impl>::lqFull() 5053584Ssaidi@eecs.umich.edu{ 5064172Ssaidi@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 5073748Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 5083748Sgblack@eecs.umich.edu 5093748Sgblack@eecs.umich.edu while (threads != end) { 5103748Sgblack@eecs.umich.edu unsigned tid = *threads++; 5113748Sgblack@eecs.umich.edu 5123748Sgblack@eecs.umich.edu if (!thread[tid].lqFull()) 5133748Sgblack@eecs.umich.edu return false; 5144172Ssaidi@eecs.umich.edu } 5153748Sgblack@eecs.umich.edu 5164172Ssaidi@eecs.umich.edu return true; 5173748Sgblack@eecs.umich.edu} 5184172Ssaidi@eecs.umich.edu 5193748Sgblack@eecs.umich.edutemplate<class Impl> 5204172Ssaidi@eecs.umich.edubool 5213790Sgblack@eecs.umich.eduLSQ<Impl>::lqFull(unsigned tid) 5223790Sgblack@eecs.umich.edu{ 5233748Sgblack@eecs.umich.edu //@todo: Change to Calculate All Entries for 5244172Ssaidi@eecs.umich.edu //Dynamic Policy 5254001Ssaidi@eecs.umich.edu if( lsqPolicy == Dynamic ) 5264011Ssaidi@eecs.umich.edu return lqFull(); 5274172Ssaidi@eecs.umich.edu else 5284172Ssaidi@eecs.umich.edu return thread[tid].lqFull(); 5294011Ssaidi@eecs.umich.edu} 5304011Ssaidi@eecs.umich.edu 5314011Ssaidi@eecs.umich.edutemplate<class Impl> 5324172Ssaidi@eecs.umich.edubool 5333790Sgblack@eecs.umich.eduLSQ<Impl>::sqFull() 5343790Sgblack@eecs.umich.edu{ 5353748Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 5364172Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 5373748Sgblack@eecs.umich.edu 5384172Ssaidi@eecs.umich.edu while (threads != end) { 5393748Sgblack@eecs.umich.edu unsigned tid = *threads++; 5404172Ssaidi@eecs.umich.edu 5413748Sgblack@eecs.umich.edu if (!sqFull(tid)) 5424172Ssaidi@eecs.umich.edu return false; 5433748Sgblack@eecs.umich.edu } 5444172Ssaidi@eecs.umich.edu 5453790Sgblack@eecs.umich.edu return true; 5463790Sgblack@eecs.umich.edu} 5473748Sgblack@eecs.umich.edu 5483790Sgblack@eecs.umich.edutemplate<class Impl> 5494172Ssaidi@eecs.umich.edubool 5503748Sgblack@eecs.umich.eduLSQ<Impl>::sqFull(unsigned tid) 5513989Ssaidi@eecs.umich.edu{ 5523748Sgblack@eecs.umich.edu //@todo: Change to Calculate All Entries for 5534172Ssaidi@eecs.umich.edu //Dynamic Policy 5543790Sgblack@eecs.umich.edu if( lsqPolicy == Dynamic ) 5553989Ssaidi@eecs.umich.edu return sqFull(); 5563748Sgblack@eecs.umich.edu else 5574172Ssaidi@eecs.umich.edu return thread[tid].sqFull(); 5583790Sgblack@eecs.umich.edu} 5593989Ssaidi@eecs.umich.edu 5603748Sgblack@eecs.umich.edutemplate<class Impl> 5613748Sgblack@eecs.umich.edubool 5623880Ssaidi@eecs.umich.eduLSQ<Impl>::isStalled() 5633880Ssaidi@eecs.umich.edu{ 5643880Ssaidi@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 5653880Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 5663880Ssaidi@eecs.umich.edu 5673880Ssaidi@eecs.umich.edu while (threads != end) { 5683880Ssaidi@eecs.umich.edu unsigned tid = *threads++; 5694008Ssaidi@eecs.umich.edu 5703931Ssaidi@eecs.umich.edu if (!thread[tid].isStalled()) 5713931Ssaidi@eecs.umich.edu return false; 5724001Ssaidi@eecs.umich.edu } 5734001Ssaidi@eecs.umich.edu 5743931Ssaidi@eecs.umich.edu return true; 5754008Ssaidi@eecs.umich.edu} 5763863Ssaidi@eecs.umich.edu 5773584Ssaidi@eecs.umich.edutemplate<class Impl> 5783584Ssaidi@eecs.umich.edubool 5793584Ssaidi@eecs.umich.eduLSQ<Impl>::isStalled(unsigned tid) 5803814Ssaidi@eecs.umich.edu{ 5813814Ssaidi@eecs.umich.edu if( lsqPolicy == Dynamic ) 5823584Ssaidi@eecs.umich.edu return isStalled(); 5833584Ssaidi@eecs.umich.edu else 5843931Ssaidi@eecs.umich.edu return thread[tid].isStalled(); 5853584Ssaidi@eecs.umich.edu} 5863931Ssaidi@eecs.umich.edu 5873931Ssaidi@eecs.umich.edutemplate<class Impl> 5883748Sgblack@eecs.umich.edubool 5893748Sgblack@eecs.umich.eduLSQ<Impl>::hasStoresToWB() 5903748Sgblack@eecs.umich.edu{ 5913748Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 5923748Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 5933748Sgblack@eecs.umich.edu 5943748Sgblack@eecs.umich.edu if (threads == end) 5953748Sgblack@eecs.umich.edu return false; 5963748Sgblack@eecs.umich.edu 5973748Sgblack@eecs.umich.edu while (threads != end) { 5983748Sgblack@eecs.umich.edu unsigned tid = *threads++; 5993748Sgblack@eecs.umich.edu 6003748Sgblack@eecs.umich.edu if (!hasStoresToWB(tid)) 6013748Sgblack@eecs.umich.edu return false; 6023748Sgblack@eecs.umich.edu } 6033748Sgblack@eecs.umich.edu 6043748Sgblack@eecs.umich.edu return true; 6053748Sgblack@eecs.umich.edu} 6064001Ssaidi@eecs.umich.edu 6074001Ssaidi@eecs.umich.edutemplate<class Impl> 6083748Sgblack@eecs.umich.edubool 6093748Sgblack@eecs.umich.eduLSQ<Impl>::willWB() 6103748Sgblack@eecs.umich.edu{ 6113748Sgblack@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 6123748Sgblack@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 6133748Sgblack@eecs.umich.edu 6143748Sgblack@eecs.umich.edu while (threads != end) { 6153748Sgblack@eecs.umich.edu unsigned tid = *threads++; 6163748Sgblack@eecs.umich.edu 6173748Sgblack@eecs.umich.edu if (!willWB(tid)) 6183748Sgblack@eecs.umich.edu return false; 6193748Sgblack@eecs.umich.edu } 6203748Sgblack@eecs.umich.edu 6213748Sgblack@eecs.umich.edu return true; 6223748Sgblack@eecs.umich.edu} 6233748Sgblack@eecs.umich.edu 6243748Sgblack@eecs.umich.edutemplate<class Impl> 6253748Sgblack@eecs.umich.eduvoid 6263748Sgblack@eecs.umich.eduLSQ<Impl>::dumpInsts() 6273748Sgblack@eecs.umich.edu{ 6283880Ssaidi@eecs.umich.edu std::list<unsigned>::iterator threads = activeThreads->begin(); 6293880Ssaidi@eecs.umich.edu std::list<unsigned>::iterator end = activeThreads->end(); 6303603Ssaidi@eecs.umich.edu 6313584Ssaidi@eecs.umich.edu while (threads != end) { 6323603Ssaidi@eecs.umich.edu unsigned tid = *threads++; 6333584Ssaidi@eecs.umich.edu 6343603Ssaidi@eecs.umich.edu thread[tid].dumpInsts(); 6353584Ssaidi@eecs.umich.edu } 6363584Ssaidi@eecs.umich.edu} 6373603Ssaidi@eecs.umich.edu