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