110259SAndrew.Bardsley@arm.com/*
210259SAndrew.Bardsley@arm.com * Copyright (c) 2013-2014 ARM Limited
310259SAndrew.Bardsley@arm.com * All rights reserved
410259SAndrew.Bardsley@arm.com *
510259SAndrew.Bardsley@arm.com * The license below extends only to copyright in the software and shall
610259SAndrew.Bardsley@arm.com * not be construed as granting a license to any other intellectual
710259SAndrew.Bardsley@arm.com * property including but not limited to intellectual property relating
810259SAndrew.Bardsley@arm.com * to a hardware implementation of the functionality of the software
910259SAndrew.Bardsley@arm.com * licensed hereunder.  You may use the software subject to the license
1010259SAndrew.Bardsley@arm.com * terms below provided that you ensure that this notice is replicated
1110259SAndrew.Bardsley@arm.com * unmodified and in its entirety in all distributions of the software,
1210259SAndrew.Bardsley@arm.com * modified or unmodified, in source code or in binary form.
1310259SAndrew.Bardsley@arm.com *
1410259SAndrew.Bardsley@arm.com * Redistribution and use in source and binary forms, with or without
1510259SAndrew.Bardsley@arm.com * modification, are permitted provided that the following conditions are
1610259SAndrew.Bardsley@arm.com * met: redistributions of source code must retain the above copyright
1710259SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer;
1810259SAndrew.Bardsley@arm.com * redistributions in binary form must reproduce the above copyright
1910259SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer in the
2010259SAndrew.Bardsley@arm.com * documentation and/or other materials provided with the distribution;
2110259SAndrew.Bardsley@arm.com * neither the name of the copyright holders nor the names of its
2210259SAndrew.Bardsley@arm.com * contributors may be used to endorse or promote products derived from
2310259SAndrew.Bardsley@arm.com * this software without specific prior written permission.
2410259SAndrew.Bardsley@arm.com *
2510259SAndrew.Bardsley@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610259SAndrew.Bardsley@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710259SAndrew.Bardsley@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810259SAndrew.Bardsley@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910259SAndrew.Bardsley@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010259SAndrew.Bardsley@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110259SAndrew.Bardsley@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210259SAndrew.Bardsley@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310259SAndrew.Bardsley@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410259SAndrew.Bardsley@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510259SAndrew.Bardsley@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610259SAndrew.Bardsley@arm.com *
3710259SAndrew.Bardsley@arm.com * Authors: Andrew Bardsley
3810259SAndrew.Bardsley@arm.com */
3910259SAndrew.Bardsley@arm.com
4010259SAndrew.Bardsley@arm.com#include "cpu/minor/pipe_data.hh"
4110259SAndrew.Bardsley@arm.com
4210259SAndrew.Bardsley@arm.comnamespace Minor
4310259SAndrew.Bardsley@arm.com{
4410259SAndrew.Bardsley@arm.com
4510259SAndrew.Bardsley@arm.comstd::ostream &
4610259SAndrew.Bardsley@arm.comoperator <<(std::ostream &os, BranchData::Reason reason)
4710259SAndrew.Bardsley@arm.com{
4810259SAndrew.Bardsley@arm.com    switch (reason)
4910259SAndrew.Bardsley@arm.com    {
5010259SAndrew.Bardsley@arm.com      case BranchData::NoBranch:
5110259SAndrew.Bardsley@arm.com        os << "NoBranch";
5210259SAndrew.Bardsley@arm.com        break;
5310259SAndrew.Bardsley@arm.com      case BranchData::UnpredictedBranch:
5410259SAndrew.Bardsley@arm.com        os << "UnpredictedBranch";
5510259SAndrew.Bardsley@arm.com        break;
5610259SAndrew.Bardsley@arm.com      case BranchData::BranchPrediction:
5710259SAndrew.Bardsley@arm.com        os << "BranchPrediction";
5810259SAndrew.Bardsley@arm.com        break;
5910259SAndrew.Bardsley@arm.com      case BranchData::CorrectlyPredictedBranch:
6010259SAndrew.Bardsley@arm.com        os << "CorrectlyPredictedBranch";
6110259SAndrew.Bardsley@arm.com        break;
6210259SAndrew.Bardsley@arm.com      case BranchData::BadlyPredictedBranch:
6310259SAndrew.Bardsley@arm.com        os << "BadlyPredictedBranch";
6410259SAndrew.Bardsley@arm.com        break;
6510259SAndrew.Bardsley@arm.com      case BranchData::BadlyPredictedBranchTarget:
6610259SAndrew.Bardsley@arm.com        os << "BadlyPredictedBranchTarget";
6710259SAndrew.Bardsley@arm.com        break;
6810259SAndrew.Bardsley@arm.com      case BranchData::Interrupt:
6910259SAndrew.Bardsley@arm.com        os << "Interrupt";
7010259SAndrew.Bardsley@arm.com        break;
7110259SAndrew.Bardsley@arm.com      case BranchData::SuspendThread:
7210259SAndrew.Bardsley@arm.com        os << "SuspendThread";
7310259SAndrew.Bardsley@arm.com        break;
7410259SAndrew.Bardsley@arm.com      case BranchData::HaltFetch:
7510259SAndrew.Bardsley@arm.com        os << "HaltFetch";
7610259SAndrew.Bardsley@arm.com        break;
7710259SAndrew.Bardsley@arm.com    }
7810259SAndrew.Bardsley@arm.com
7910259SAndrew.Bardsley@arm.com    return os;
8010259SAndrew.Bardsley@arm.com}
8110259SAndrew.Bardsley@arm.com
8210259SAndrew.Bardsley@arm.combool
8310259SAndrew.Bardsley@arm.comBranchData::isStreamChange(const BranchData::Reason reason)
8410259SAndrew.Bardsley@arm.com{
8510259SAndrew.Bardsley@arm.com    bool ret = false;
8610259SAndrew.Bardsley@arm.com
8710259SAndrew.Bardsley@arm.com    switch (reason)
8810259SAndrew.Bardsley@arm.com    {
8910259SAndrew.Bardsley@arm.com        /* No change of stream (see the enum comment in pipe_data.hh) */
9010259SAndrew.Bardsley@arm.com      case NoBranch:
9110259SAndrew.Bardsley@arm.com      case CorrectlyPredictedBranch:
9210259SAndrew.Bardsley@arm.com        ret = false;
9310259SAndrew.Bardsley@arm.com        break;
9410259SAndrew.Bardsley@arm.com
9510259SAndrew.Bardsley@arm.com        /* Change of stream (Fetch1 should act on) */
9610259SAndrew.Bardsley@arm.com      case UnpredictedBranch:
9710259SAndrew.Bardsley@arm.com      case BranchPrediction:
9810259SAndrew.Bardsley@arm.com      case BadlyPredictedBranchTarget:
9910259SAndrew.Bardsley@arm.com      case BadlyPredictedBranch:
10010259SAndrew.Bardsley@arm.com      case SuspendThread:
10110259SAndrew.Bardsley@arm.com      case Interrupt:
10210259SAndrew.Bardsley@arm.com      case HaltFetch:
10310259SAndrew.Bardsley@arm.com        ret = true;
10410259SAndrew.Bardsley@arm.com        break;
10510259SAndrew.Bardsley@arm.com    }
10610259SAndrew.Bardsley@arm.com
10710259SAndrew.Bardsley@arm.com    return ret;
10810259SAndrew.Bardsley@arm.com}
10910259SAndrew.Bardsley@arm.com
11010259SAndrew.Bardsley@arm.combool
11110259SAndrew.Bardsley@arm.comBranchData::isBranch(const BranchData::Reason reason)
11210259SAndrew.Bardsley@arm.com{
11310259SAndrew.Bardsley@arm.com    bool ret = false;
11410259SAndrew.Bardsley@arm.com
11510259SAndrew.Bardsley@arm.com    switch (reason)
11610259SAndrew.Bardsley@arm.com    {
11710259SAndrew.Bardsley@arm.com        /* No change of stream (see the enum comment in pipe_data.hh) */
11810259SAndrew.Bardsley@arm.com      case NoBranch:
11910259SAndrew.Bardsley@arm.com      case CorrectlyPredictedBranch:
12010259SAndrew.Bardsley@arm.com      case SuspendThread:
12110259SAndrew.Bardsley@arm.com      case Interrupt:
12210259SAndrew.Bardsley@arm.com      case HaltFetch:
12310259SAndrew.Bardsley@arm.com        ret = false;
12410259SAndrew.Bardsley@arm.com        break;
12510259SAndrew.Bardsley@arm.com
12610259SAndrew.Bardsley@arm.com        /* Change of stream (Fetch1 should act on) */
12710259SAndrew.Bardsley@arm.com      case UnpredictedBranch:
12810259SAndrew.Bardsley@arm.com      case BranchPrediction:
12910259SAndrew.Bardsley@arm.com      case BadlyPredictedBranchTarget:
13010259SAndrew.Bardsley@arm.com      case BadlyPredictedBranch:
13110259SAndrew.Bardsley@arm.com        ret = true;
13210259SAndrew.Bardsley@arm.com        break;
13310259SAndrew.Bardsley@arm.com    }
13410259SAndrew.Bardsley@arm.com
13510259SAndrew.Bardsley@arm.com    return ret;
13610259SAndrew.Bardsley@arm.com}
13710259SAndrew.Bardsley@arm.com
13810259SAndrew.Bardsley@arm.comvoid
13910259SAndrew.Bardsley@arm.comBranchData::reportData(std::ostream &os) const
14010259SAndrew.Bardsley@arm.com{
14110259SAndrew.Bardsley@arm.com    if (isBubble()) {
14210259SAndrew.Bardsley@arm.com        os << '-';
14310259SAndrew.Bardsley@arm.com    } else {
14410259SAndrew.Bardsley@arm.com        os << reason
14510259SAndrew.Bardsley@arm.com            << ';' << newStreamSeqNum << '.' << newPredictionSeqNum
14610259SAndrew.Bardsley@arm.com            << ";0x" << std::hex << target.instAddr() << std::dec
14710259SAndrew.Bardsley@arm.com            << ';';
14810259SAndrew.Bardsley@arm.com        inst->reportData(os);
14910259SAndrew.Bardsley@arm.com    }
15010259SAndrew.Bardsley@arm.com}
15110259SAndrew.Bardsley@arm.com
15210259SAndrew.Bardsley@arm.comstd::ostream &
15310259SAndrew.Bardsley@arm.comoperator <<(std::ostream &os, const BranchData &branch)
15410259SAndrew.Bardsley@arm.com{
15510259SAndrew.Bardsley@arm.com    os << branch.reason << " target: 0x"
15610259SAndrew.Bardsley@arm.com        << std::hex << branch.target.instAddr() << std::dec
15710259SAndrew.Bardsley@arm.com        << ' ' << *branch.inst
15810259SAndrew.Bardsley@arm.com        << ' ' << branch.newStreamSeqNum << "(stream)."
15910259SAndrew.Bardsley@arm.com        << branch.newPredictionSeqNum << "(pred)";
16010259SAndrew.Bardsley@arm.com
16110259SAndrew.Bardsley@arm.com    return os;
16210259SAndrew.Bardsley@arm.com}
16310259SAndrew.Bardsley@arm.com
16410259SAndrew.Bardsley@arm.comvoid
16510259SAndrew.Bardsley@arm.comForwardLineData::setFault(Fault fault_)
16610259SAndrew.Bardsley@arm.com{
16710259SAndrew.Bardsley@arm.com    fault = fault_;
16810259SAndrew.Bardsley@arm.com    if (isFault())
16910259SAndrew.Bardsley@arm.com        bubbleFlag = false;
17010259SAndrew.Bardsley@arm.com}
17110259SAndrew.Bardsley@arm.com
17210259SAndrew.Bardsley@arm.comvoid
17310259SAndrew.Bardsley@arm.comForwardLineData::allocateLine(unsigned int width_)
17410259SAndrew.Bardsley@arm.com{
17510259SAndrew.Bardsley@arm.com    lineWidth = width_;
17610259SAndrew.Bardsley@arm.com    bubbleFlag = false;
17710259SAndrew.Bardsley@arm.com
17810259SAndrew.Bardsley@arm.com    assert(!isFault());
17910259SAndrew.Bardsley@arm.com    assert(!line);
18010259SAndrew.Bardsley@arm.com
18110259SAndrew.Bardsley@arm.com    line = new uint8_t[width_];
18210259SAndrew.Bardsley@arm.com}
18310259SAndrew.Bardsley@arm.com
18410259SAndrew.Bardsley@arm.comvoid
18510259SAndrew.Bardsley@arm.comForwardLineData::adoptPacketData(Packet *packet)
18610259SAndrew.Bardsley@arm.com{
18710259SAndrew.Bardsley@arm.com    this->packet = packet;
18810259SAndrew.Bardsley@arm.com    lineWidth = packet->req->getSize();
18910259SAndrew.Bardsley@arm.com    bubbleFlag = false;
19010259SAndrew.Bardsley@arm.com
19110259SAndrew.Bardsley@arm.com    assert(!isFault());
19210259SAndrew.Bardsley@arm.com    assert(!line);
19310259SAndrew.Bardsley@arm.com
19410259SAndrew.Bardsley@arm.com    line = packet->getPtr<uint8_t>();
19510259SAndrew.Bardsley@arm.com}
19610259SAndrew.Bardsley@arm.com
19710259SAndrew.Bardsley@arm.comvoid
19810259SAndrew.Bardsley@arm.comForwardLineData::freeLine()
19910259SAndrew.Bardsley@arm.com{
20010259SAndrew.Bardsley@arm.com    /* Only free lines in non-faulting, non-bubble lines */
20110259SAndrew.Bardsley@arm.com    if (!isFault() && !isBubble()) {
20210259SAndrew.Bardsley@arm.com        assert(line);
20310259SAndrew.Bardsley@arm.com        /* If packet is not NULL then the line must belong to the packet so
20410259SAndrew.Bardsley@arm.com         *  we don't need to separately deallocate the line */
20510259SAndrew.Bardsley@arm.com        if (packet) {
20610259SAndrew.Bardsley@arm.com            delete packet;
20710259SAndrew.Bardsley@arm.com        } else {
20810259SAndrew.Bardsley@arm.com            delete [] line;
20910259SAndrew.Bardsley@arm.com        }
21010259SAndrew.Bardsley@arm.com        line = NULL;
21110259SAndrew.Bardsley@arm.com        bubbleFlag = true;
21210259SAndrew.Bardsley@arm.com    }
21310259SAndrew.Bardsley@arm.com}
21410259SAndrew.Bardsley@arm.com
21510259SAndrew.Bardsley@arm.comvoid
21610259SAndrew.Bardsley@arm.comForwardLineData::reportData(std::ostream &os) const
21710259SAndrew.Bardsley@arm.com{
21810259SAndrew.Bardsley@arm.com    if (isBubble())
21910259SAndrew.Bardsley@arm.com        os << '-';
22010259SAndrew.Bardsley@arm.com    else if (fault != NoFault)
22110259SAndrew.Bardsley@arm.com        os << "F;" << id;
22210259SAndrew.Bardsley@arm.com    else
22310259SAndrew.Bardsley@arm.com        os << id;
22410259SAndrew.Bardsley@arm.com}
22510259SAndrew.Bardsley@arm.com
22611567Smitch.hayenga@arm.comForwardInstData::ForwardInstData(unsigned int width, ThreadID tid) :
22711567Smitch.hayenga@arm.com    numInsts(width), threadId(tid)
22810259SAndrew.Bardsley@arm.com{
22910259SAndrew.Bardsley@arm.com    bubbleFill();
23010259SAndrew.Bardsley@arm.com}
23110259SAndrew.Bardsley@arm.com
23210259SAndrew.Bardsley@arm.comForwardInstData::ForwardInstData(const ForwardInstData &src)
23310259SAndrew.Bardsley@arm.com{
23410259SAndrew.Bardsley@arm.com    *this = src;
23510259SAndrew.Bardsley@arm.com}
23610259SAndrew.Bardsley@arm.com
23710259SAndrew.Bardsley@arm.comForwardInstData &
23810259SAndrew.Bardsley@arm.comForwardInstData::operator =(const ForwardInstData &src)
23910259SAndrew.Bardsley@arm.com{
24010259SAndrew.Bardsley@arm.com    numInsts = src.numInsts;
24110259SAndrew.Bardsley@arm.com
24210259SAndrew.Bardsley@arm.com    for (unsigned int i = 0; i < src.numInsts; i++)
24310259SAndrew.Bardsley@arm.com        insts[i] = src.insts[i];
24410259SAndrew.Bardsley@arm.com
24510259SAndrew.Bardsley@arm.com    return *this;
24610259SAndrew.Bardsley@arm.com}
24710259SAndrew.Bardsley@arm.com
24810259SAndrew.Bardsley@arm.combool
24910259SAndrew.Bardsley@arm.comForwardInstData::isBubble() const
25010259SAndrew.Bardsley@arm.com{
25110259SAndrew.Bardsley@arm.com    return numInsts == 0 || insts[0]->isBubble();
25210259SAndrew.Bardsley@arm.com}
25310259SAndrew.Bardsley@arm.com
25410259SAndrew.Bardsley@arm.comvoid
25510259SAndrew.Bardsley@arm.comForwardInstData::bubbleFill()
25610259SAndrew.Bardsley@arm.com{
25710259SAndrew.Bardsley@arm.com    for (unsigned int i = 0; i < numInsts; i++)
25810259SAndrew.Bardsley@arm.com        insts[i] = MinorDynInst::bubble();
25910259SAndrew.Bardsley@arm.com}
26010259SAndrew.Bardsley@arm.com
26110259SAndrew.Bardsley@arm.comvoid
26210259SAndrew.Bardsley@arm.comForwardInstData::resize(unsigned int width)
26310259SAndrew.Bardsley@arm.com{
26410259SAndrew.Bardsley@arm.com    assert(width < MAX_FORWARD_INSTS);
26510259SAndrew.Bardsley@arm.com    numInsts = width;
26610259SAndrew.Bardsley@arm.com
26710259SAndrew.Bardsley@arm.com    bubbleFill();
26810259SAndrew.Bardsley@arm.com}
26910259SAndrew.Bardsley@arm.com
27010259SAndrew.Bardsley@arm.comvoid
27110259SAndrew.Bardsley@arm.comForwardInstData::reportData(std::ostream &os) const
27210259SAndrew.Bardsley@arm.com{
27310259SAndrew.Bardsley@arm.com    if (isBubble()) {
27410259SAndrew.Bardsley@arm.com        os << '-';
27510259SAndrew.Bardsley@arm.com    } else {
27610259SAndrew.Bardsley@arm.com        unsigned int i = 0;
27710259SAndrew.Bardsley@arm.com
27810259SAndrew.Bardsley@arm.com        os << '(';
27910259SAndrew.Bardsley@arm.com        while (i != numInsts) {
28010259SAndrew.Bardsley@arm.com            insts[i]->reportData(os);
28110259SAndrew.Bardsley@arm.com            i++;
28210259SAndrew.Bardsley@arm.com            if (i != numInsts)
28310259SAndrew.Bardsley@arm.com                os << ',';
28410259SAndrew.Bardsley@arm.com        }
28510259SAndrew.Bardsley@arm.com        os << ')';
28610259SAndrew.Bardsley@arm.com    }
28710259SAndrew.Bardsley@arm.com}
28810259SAndrew.Bardsley@arm.com
28910259SAndrew.Bardsley@arm.com}
290