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