pipe_data.cc revision 11567
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