Code cleanup.
cpu/base_dyn_inst.hh:
Code cleanup
--HG--
extra : convert_revision : 501c03f8e4346ffbcb545ddeee30c1f8ded9baa7
This commit is contained in:
@@ -447,13 +447,10 @@ class BaseDynInst : public FastAlloc, public RefCounted
|
||||
instResult.integer = val;
|
||||
}
|
||||
|
||||
//Push to .cc file.
|
||||
/** Records that one of the source registers is ready. */
|
||||
void markSrcRegReady();
|
||||
|
||||
/** Marks a specific register as ready.
|
||||
* @todo: Move this to .cc file.
|
||||
*/
|
||||
/** Marks a specific register as ready. */
|
||||
void markSrcRegReady(RegIndex src_idx);
|
||||
|
||||
/** Returns if a source register is ready. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2005-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -52,8 +52,6 @@ class OzoneDynInst : public BaseDynInst<Impl>
|
||||
// Typedef for DynInstPtr. This is really just a RefCountingPtr<OoODynInst>.
|
||||
typedef typename Impl::DynInstPtr DynInstPtr;
|
||||
|
||||
// typedef typename Impl::BranchPred::BPredInfo BPredInfo;
|
||||
|
||||
typedef TheISA::ExtMachInst ExtMachInst;
|
||||
typedef TheISA::MachInst MachInst;
|
||||
typedef TheISA::MiscReg MiscReg;
|
||||
@@ -107,12 +105,6 @@ class OzoneDynInst : public BaseDynInst<Impl>
|
||||
// up. In the future, you only really need a counter.
|
||||
bool memDepReady() { return srcMemInsts.empty(); }
|
||||
|
||||
// void setBPredInfo(const BPredInfo &bp_info) { bpInfo = bp_info; }
|
||||
|
||||
// BPredInfo &getBPredInfo() { return bpInfo; }
|
||||
|
||||
// OzoneXC *thread;
|
||||
|
||||
private:
|
||||
void initInstPtrs();
|
||||
|
||||
@@ -133,20 +125,12 @@ class OzoneDynInst : public BaseDynInst<Impl>
|
||||
*/
|
||||
DynInstPtr prevDestInst[MaxInstSrcRegs];
|
||||
|
||||
// BPredInfo bpInfo;
|
||||
|
||||
public:
|
||||
|
||||
Fault initiateAcc();
|
||||
|
||||
Fault completeAcc();
|
||||
/*
|
||||
template <class T>
|
||||
Fault read(Addr addr, T &data, unsigned flags);
|
||||
|
||||
template <class T>
|
||||
Fault write(T data, Addr addr, unsigned flags, uint64_t *res);
|
||||
*/
|
||||
// The register accessor methods provide the index of the
|
||||
// instruction's operand (e.g., 0 or 1), not the architectural
|
||||
// register index, to simplify the implementation of register
|
||||
@@ -244,38 +228,4 @@ class OzoneDynInst : public BaseDynInst<Impl>
|
||||
bool iqItValid;
|
||||
};
|
||||
|
||||
/*
|
||||
template<class Impl>
|
||||
template<class T>
|
||||
inline Fault
|
||||
OzoneDynInst<Impl>::read(Addr addr, T &data, unsigned flags)
|
||||
{
|
||||
Fault fault = this->cpu->read(addr, data, flags, this);
|
||||
|
||||
if (this->traceData) {
|
||||
this->traceData->setAddr(addr);
|
||||
this->traceData->setData(data);
|
||||
}
|
||||
|
||||
return fault;
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
template<class T>
|
||||
inline Fault
|
||||
OzoneDynInst<Impl>::write(T data, Addr addr, unsigned flags, uint64_t *res)
|
||||
{
|
||||
Fault fault = this->cpu->write(data, addr, flags, res, this);
|
||||
|
||||
this->storeSize = sizeof(T);
|
||||
this->storeData = data;
|
||||
|
||||
if (this->traceData) {
|
||||
this->traceData->setAddr(addr);
|
||||
this->traceData->setData(data);
|
||||
}
|
||||
|
||||
return fault;
|
||||
}
|
||||
*/
|
||||
#endif // __CPU_OZONE_DYN_INST_HH__
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2005-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -266,12 +266,7 @@ OzoneDynInst<Impl>::hwrei()
|
||||
this->setNextPC(this->thread->readMiscReg(AlphaISA::IPR_EXC_ADDR));
|
||||
|
||||
this->cpu->hwrei();
|
||||
/*
|
||||
this->cpu->kernelStats->hwrei();
|
||||
|
||||
this->cpu->checkInterrupts = true;
|
||||
this->cpu->lockFlag = false;
|
||||
*/
|
||||
// FIXME: XXX check for interrupts? XXX
|
||||
return NoFault;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CPU_OZONE_FRONT_END_HH__
|
||||
#define __CPU_OZONE_FRONT_END_HH__
|
||||
|
||||
#include <deque>
|
||||
|
||||
//#include "cpu/ozone/cpu.hh"
|
||||
#include "cpu/inst_seq.hh"
|
||||
#include "cpu/o3/bpred_unit.hh"
|
||||
#include "cpu/ozone/rename_table.hh"
|
||||
//#include "cpu/ozone/thread_state.hh"
|
||||
#include "mem/mem_req.hh"
|
||||
#include "sim/eventq.hh"
|
||||
#include "sim/stats.hh"
|
||||
@@ -132,11 +157,6 @@ class FrontEnd
|
||||
|
||||
typedef typename Impl::BranchPred BranchPred;
|
||||
|
||||
// Typedef for semi-opaque type that holds any information the branch
|
||||
// predictor needs to update itself. Only two fields are used outside of
|
||||
// branch predictor, nextPC and isTaken.
|
||||
// typedef typename BranchPred::BPredInfo BPredInfo;
|
||||
|
||||
BranchPred branchPred;
|
||||
|
||||
class ICacheCompletionEvent : public Event
|
||||
|
||||
@@ -1,3 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "arch/faults.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
@@ -26,14 +53,6 @@ FrontEnd<Impl>::FrontEnd(Params *params)
|
||||
|
||||
status = Idle;
|
||||
|
||||
// Setup branch predictor.
|
||||
|
||||
// Setup Memory Request
|
||||
/*
|
||||
memReq = new MemReq();
|
||||
memReq->asid = 0;
|
||||
memReq->data = new uint8_t[64];
|
||||
*/
|
||||
memReq = NULL;
|
||||
// Size of cache block.
|
||||
cacheBlkSize = icacheInterface ? icacheInterface->getBlockSize() : 64;
|
||||
@@ -77,7 +96,6 @@ void
|
||||
FrontEnd<Impl>::setXC(ExecContext *xc_ptr)
|
||||
{
|
||||
xc = xc_ptr;
|
||||
// memReq->xc = xc;
|
||||
}
|
||||
|
||||
template <class Impl>
|
||||
@@ -321,7 +339,6 @@ FrontEnd<Impl>::tick()
|
||||
break;
|
||||
}
|
||||
|
||||
// if (generalizeFetch) {
|
||||
processInst(inst);
|
||||
|
||||
if (status == SerializeBlocked) {
|
||||
@@ -333,11 +350,6 @@ FrontEnd<Impl>::tick()
|
||||
instBuffer.push_back(inst);
|
||||
++instBufferSize;
|
||||
++num_inst;
|
||||
// } else {
|
||||
// fetch(num_inst);
|
||||
// decode(num_inst);
|
||||
// rename(num_inst);
|
||||
// }
|
||||
|
||||
#if FULL_SYSTEM
|
||||
if (inst->isQuiesce()) {
|
||||
@@ -402,10 +414,6 @@ FrontEnd<Impl>::fetchCacheLine()
|
||||
// Translate the instruction request.
|
||||
fault = cpu->translateInstReq(memReq);
|
||||
|
||||
// In the case of faults, the fetch stage may need to stall and wait
|
||||
// on what caused the fetch (ITB or Icache miss).
|
||||
// assert(fault == NoFault);
|
||||
|
||||
// Now do the timing access to see whether or not the instruction
|
||||
// exists within the cache.
|
||||
if (icacheInterface && fault == NoFault) {
|
||||
@@ -466,7 +474,6 @@ FrontEnd<Impl>::processInst(DynInstPtr &inst)
|
||||
|
||||
Addr inst_PC = inst->readPC();
|
||||
|
||||
// BPredInfo bp_info = branchPred.lookup(inst_PC);
|
||||
if (!inst->isControl()) {
|
||||
inst->setPredTarg(inst->readNextPC());
|
||||
} else {
|
||||
@@ -482,7 +489,6 @@ FrontEnd<Impl>::processInst(DynInstPtr &inst)
|
||||
"%#x\n", inst->seqNum, inst_PC, next_PC);
|
||||
|
||||
// inst->setNextPC(next_PC);
|
||||
// inst->setBPredInfo(bp_info);
|
||||
|
||||
// Not sure where I should set this
|
||||
PC = next_PC;
|
||||
@@ -535,7 +541,7 @@ void
|
||||
FrontEnd<Impl>::handleFault(Fault &fault)
|
||||
{
|
||||
DPRINTF(FE, "Fault at fetch, telling commit\n");
|
||||
// backEnd->fetchFault(fault);
|
||||
|
||||
// We're blocked on the back end until it handles this fault.
|
||||
status = TrapPending;
|
||||
|
||||
@@ -586,9 +592,6 @@ FrontEnd<Impl>::squash(const InstSeqNum &squash_num, const Addr &next_PC,
|
||||
instBuffer.pop_back();
|
||||
--instBufferSize;
|
||||
|
||||
// Fix up branch predictor if necessary.
|
||||
// branchPred.undo(inst->getBPredInfo());
|
||||
|
||||
freeRegs+= inst->numDestRegs();
|
||||
}
|
||||
|
||||
@@ -607,7 +610,6 @@ FrontEnd<Impl>::squash(const InstSeqNum &squash_num, const Addr &next_PC,
|
||||
// Clear the icache miss if it's outstanding.
|
||||
if (status == IcacheMissStall && icacheInterface) {
|
||||
DPRINTF(FE, "Squashing outstanding Icache miss.\n");
|
||||
// icacheInterface->squash(0);
|
||||
memReq = NULL;
|
||||
}
|
||||
|
||||
@@ -693,17 +695,9 @@ template <class Impl>
|
||||
bool
|
||||
FrontEnd<Impl>::updateStatus()
|
||||
{
|
||||
// bool rename_block = freeRegs <= 0;
|
||||
bool serialize_block = !backEnd->robEmpty() || instBufferSize;
|
||||
bool be_block = cpu->decoupledFrontEnd ? false : backEnd->isBlocked();
|
||||
bool ret_val = false;
|
||||
/*
|
||||
// Should already be handled through addFreeRegs function
|
||||
if (status == RenameBlocked && !rename_block) {
|
||||
status = Running;
|
||||
ret_val = true;
|
||||
}
|
||||
*/
|
||||
|
||||
if (status == SerializeBlocked && !serialize_block) {
|
||||
status = SerializeComplete;
|
||||
@@ -753,10 +747,6 @@ FrontEnd<Impl>::getInstFromCacheline()
|
||||
|
||||
// PC of inst is not in this cache block
|
||||
if (PC >= (cacheBlkPC + cacheBlkSize) || PC < cacheBlkPC || !cacheBlkValid) {
|
||||
// DPRINTF(OoOCPU, "OoOCPU: PC is not in this cache block\n");
|
||||
// DPRINTF(OoOCPU, "OoOCPU: PC: %#x, cacheBlkPC: %#x, cacheBlkValid: %i",
|
||||
// PC, cacheBlkPC, cacheBlkValid);
|
||||
// panic("Instruction not in cache line or cache line invalid!");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CPU_OZONE_LW_BACK_END_HH__
|
||||
#define __CPU_OZONE_LW_BACK_END_HH__
|
||||
@@ -238,10 +265,6 @@ class LWBackEnd
|
||||
Counter funcExeInst;
|
||||
|
||||
private:
|
||||
// typedef typename Impl::InstQueue InstQueue;
|
||||
|
||||
// InstQueue IQ;
|
||||
|
||||
typedef typename Impl::LdstQueue LdstQueue;
|
||||
|
||||
LdstQueue LSQ;
|
||||
@@ -342,8 +365,6 @@ class LWBackEnd
|
||||
|
||||
bool exactFullStall;
|
||||
|
||||
// bool fetchRedirect[Impl::MaxThreads];
|
||||
|
||||
// number of cycles stalled for D-cache misses
|
||||
/* Stats::Scalar<> dcacheStallCycles;
|
||||
Counter lastDcacheStall;
|
||||
@@ -438,43 +459,6 @@ template <class T>
|
||||
Fault
|
||||
LWBackEnd<Impl>::read(MemReqPtr &req, T &data, int load_idx)
|
||||
{
|
||||
/* memReq->reset(addr, sizeof(T), flags);
|
||||
|
||||
// translate to physical address
|
||||
Fault fault = cpu->translateDataReadReq(memReq);
|
||||
|
||||
// if we have a cache, do cache access too
|
||||
if (fault == NoFault && dcacheInterface) {
|
||||
memReq->cmd = Read;
|
||||
memReq->completionEvent = NULL;
|
||||
memReq->time = curTick;
|
||||
memReq->flags &= ~INST_READ;
|
||||
MemAccessResult result = dcacheInterface->access(memReq);
|
||||
|
||||
// Ugly hack to get an event scheduled *only* if the access is
|
||||
// a miss. We really should add first-class support for this
|
||||
// at some point.
|
||||
if (result != MA_HIT && dcacheInterface->doEvents()) {
|
||||
// Fix this hack for keeping funcExeInst correct with loads that
|
||||
// are executed twice.
|
||||
--funcExeInst;
|
||||
|
||||
memReq->completionEvent = &cacheCompletionEvent;
|
||||
lastDcacheStall = curTick;
|
||||
// unscheduleTickEvent();
|
||||
// status = DcacheMissStall;
|
||||
DPRINTF(OzoneCPU, "Dcache miss stall!\n");
|
||||
} else {
|
||||
// do functional access
|
||||
fault = thread->mem->read(memReq, data);
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*
|
||||
if (!dcacheInterface && (memReq->flags & UNCACHEABLE))
|
||||
recordEvent("Uncached Read");
|
||||
*/
|
||||
return LSQ.read(req, data, load_idx);
|
||||
}
|
||||
|
||||
@@ -483,39 +467,6 @@ template <class T>
|
||||
Fault
|
||||
LWBackEnd<Impl>::write(MemReqPtr &req, T &data, int store_idx)
|
||||
{
|
||||
/*
|
||||
memReq->reset(addr, sizeof(T), flags);
|
||||
|
||||
// translate to physical address
|
||||
Fault fault = cpu->translateDataWriteReq(memReq);
|
||||
|
||||
if (fault == NoFault && dcacheInterface) {
|
||||
memReq->cmd = Write;
|
||||
memcpy(memReq->data,(uint8_t *)&data,memReq->size);
|
||||
memReq->completionEvent = NULL;
|
||||
memReq->time = curTick;
|
||||
memReq->flags &= ~INST_READ;
|
||||
MemAccessResult result = dcacheInterface->access(memReq);
|
||||
|
||||
// Ugly hack to get an event scheduled *only* if the access is
|
||||
// a miss. We really should add first-class support for this
|
||||
// at some point.
|
||||
if (result != MA_HIT && dcacheInterface->doEvents()) {
|
||||
memReq->completionEvent = &cacheCompletionEvent;
|
||||
lastDcacheStall = curTick;
|
||||
// unscheduleTickEvent();
|
||||
// status = DcacheMissStall;
|
||||
DPRINTF(OzoneCPU, "Dcache miss stall!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (res && (fault == NoFault))
|
||||
*res = memReq->result;
|
||||
*/
|
||||
/*
|
||||
if (!dcacheInterface && (memReq->flags & UNCACHEABLE))
|
||||
recordEvent("Uncached Write");
|
||||
*/
|
||||
return LSQ.write(req, data, store_idx);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,34 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "encumbered/cpu/full/op_class.hh"
|
||||
#include "cpu/checker/cpu.hh"
|
||||
#include "cpu/ozone/lw_back_end.hh"
|
||||
#include "encumbered/cpu/full/op_class.hh"
|
||||
|
||||
template <class Impl>
|
||||
void
|
||||
@@ -194,7 +221,6 @@ LWBackEnd<Impl>::LWBackEnd(Params *params)
|
||||
switchedOut = false;
|
||||
switchPending = false;
|
||||
|
||||
// IQ.setBE(this);
|
||||
LSQ.setBE(this);
|
||||
|
||||
// Setup IQ and LSQ with their parameters here.
|
||||
@@ -202,8 +228,6 @@ LWBackEnd<Impl>::LWBackEnd(Params *params)
|
||||
|
||||
instsToExecute = i2e.getWire(-1);
|
||||
|
||||
// IQ.setIssueExecQueue(&i2e);
|
||||
|
||||
dispatchWidth = params->dispatchWidth ? params->dispatchWidth : width;
|
||||
issueWidth = params->issueWidth ? params->issueWidth : width;
|
||||
wbWidth = params->wbWidth ? params->wbWidth : width;
|
||||
@@ -538,8 +562,6 @@ LWBackEnd<Impl>::regStats()
|
||||
.desc("ROB Occupancy per cycle")
|
||||
.flags(total | cdf)
|
||||
;
|
||||
|
||||
// IQ.regStats();
|
||||
}
|
||||
|
||||
template <class Impl>
|
||||
@@ -652,17 +674,7 @@ LWBackEnd<Impl>::tick()
|
||||
squashFromTrap();
|
||||
} else if (xcSquash) {
|
||||
squashFromXC();
|
||||
} /*else if (fetchHasFault && robEmpty() && frontEnd->isEmpty() && !LSQ.hasStoresToWB()) {
|
||||
DPRINTF(BE, "ROB and front end empty, handling fetch fault\n");
|
||||
Fault fetch_fault = frontEnd->getFault();
|
||||
if (fetch_fault == NoFault) {
|
||||
DPRINTF(BE, "Fetch no longer has a fault, cancelling out.\n");
|
||||
fetchHasFault = false;
|
||||
} else {
|
||||
handleFault(fetch_fault);
|
||||
fetchHasFault = false;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dispatchStatus != Blocked) {
|
||||
@@ -773,7 +785,8 @@ LWBackEnd<Impl>::dispatchInsts()
|
||||
inst->iqItValid = true;
|
||||
waitingInsts++;
|
||||
} else {
|
||||
DPRINTF(BE, "Instruction [sn:%lli] ready, addding to exeList.\n",
|
||||
DPRINTF(BE, "Instruction [sn:%lli] ready, addding to "
|
||||
"exeList.\n",
|
||||
inst->seqNum);
|
||||
exeList.push(inst);
|
||||
}
|
||||
@@ -784,7 +797,8 @@ LWBackEnd<Impl>::dispatchInsts()
|
||||
inst->setExecuted();
|
||||
inst->setCanCommit();
|
||||
} else {
|
||||
DPRINTF(BE, "Instruction [sn:%lli] ready, addding to exeList.\n",
|
||||
DPRINTF(BE, "Instruction [sn:%lli] ready, addding to "
|
||||
"exeList.\n",
|
||||
inst->seqNum);
|
||||
exeList.push(inst);
|
||||
}
|
||||
@@ -993,7 +1007,7 @@ LWBackEnd<Impl>::instToCommit(DynInstPtr &inst)
|
||||
|
||||
writeback_count[0]++;
|
||||
}
|
||||
|
||||
#if 0
|
||||
template <class Impl>
|
||||
void
|
||||
LWBackEnd<Impl>::writebackInsts()
|
||||
@@ -1040,7 +1054,7 @@ LWBackEnd<Impl>::writebackInsts()
|
||||
consumer_inst[0]+= consumer_insts;
|
||||
writeback_count[0]+= inst_num;
|
||||
}
|
||||
|
||||
#endif
|
||||
template <class Impl>
|
||||
bool
|
||||
LWBackEnd<Impl>::commitInst(int inst_num)
|
||||
@@ -1219,15 +1233,15 @@ LWBackEnd<Impl>::commitInst(int inst_num)
|
||||
|
||||
--numInsts;
|
||||
++thread->funcExeInst;
|
||||
// Maybe move this to where the fault is handled; if the fault is handled,
|
||||
// don't try to set this myself as the fault will set it. If not, then
|
||||
// I set thread->PC = thread->nextPC and thread->nextPC = thread->nextPC + 4.
|
||||
// Maybe move this to where the fault is handled; if the fault is
|
||||
// handled, don't try to set this myself as the fault will set it.
|
||||
// If not, then I set thread->PC = thread->nextPC and
|
||||
// thread->nextPC = thread->nextPC + 4.
|
||||
thread->setPC(thread->readNextPC());
|
||||
thread->setNextPC(thread->readNextPC() + sizeof(TheISA::MachInst));
|
||||
updateComInstStats(inst);
|
||||
|
||||
// Write the done sequence number here.
|
||||
// LSQ.commitLoads(inst->seqNum);
|
||||
toIEW->doneSeqNum = inst->seqNum;
|
||||
lastCommitCycle = curTick;
|
||||
|
||||
@@ -1357,7 +1371,8 @@ LWBackEnd<Impl>::squash(const InstSeqNum &sn)
|
||||
}
|
||||
|
||||
while (memBarrier && memBarrier->seqNum > sn) {
|
||||
DPRINTF(BE, "[sn:%lli] Memory barrier squashed (or previously squashed)\n", memBarrier->seqNum);
|
||||
DPRINTF(BE, "[sn:%lli] Memory barrier squashed (or previously "
|
||||
"squashed)\n", memBarrier->seqNum);
|
||||
memBarrier->clearMemDependents();
|
||||
if (memBarrier->memDepReady()) {
|
||||
DPRINTF(BE, "No previous barrier\n");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2004-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -138,7 +138,6 @@ class OzoneLWLSQ {
|
||||
/** Executes a load instruction. */
|
||||
Fault executeLoad(DynInstPtr &inst);
|
||||
|
||||
// Fault executeLoad(int lq_idx);
|
||||
/** Executes a store instruction. */
|
||||
Fault executeStore(DynInstPtr &inst);
|
||||
|
||||
@@ -304,10 +303,8 @@ class OzoneLWLSQ {
|
||||
Status _status;
|
||||
|
||||
/** The store queue. */
|
||||
// std::vector<SQEntry> storeQueue;
|
||||
std::list<SQEntry> storeQueue;
|
||||
/** The load queue. */
|
||||
// std::vector<DynInstPtr> loadQueue;
|
||||
std::list<DynInstPtr> loadQueue;
|
||||
|
||||
typedef typename std::list<SQEntry>::iterator SQIt;
|
||||
@@ -365,7 +362,6 @@ class OzoneLWLSQ {
|
||||
*/
|
||||
InstSeqNum stallingStoreIsn;
|
||||
/** The index of the above store. */
|
||||
// int stallingLoadIdx;
|
||||
LQIt stallingLoad;
|
||||
|
||||
/** Whether or not a load is blocked due to the memory system. It is
|
||||
@@ -398,8 +394,6 @@ class OzoneLWLSQ {
|
||||
template <class T>
|
||||
Fault write(MemReqPtr &req, T &data, int store_idx);
|
||||
|
||||
/** Returns the index of the head load instruction. */
|
||||
// int getLoadHead() { return loadHead; }
|
||||
/** Returns the sequence number of the head load instruction. */
|
||||
InstSeqNum getLoadHeadSeqNum()
|
||||
{
|
||||
@@ -411,8 +405,6 @@ class OzoneLWLSQ {
|
||||
|
||||
}
|
||||
|
||||
/** Returns the index of the head store instruction. */
|
||||
// int getStoreHead() { return storeHead; }
|
||||
/** Returns the sequence number of the head store instruction. */
|
||||
InstSeqNum getStoreHeadSeqNum()
|
||||
{
|
||||
@@ -604,12 +596,7 @@ OzoneLWLSQ<Impl>::read(MemReqPtr &req, T &data, int load_idx)
|
||||
DPRINTF(OzoneLSQ, "D-cache: PC:%#x reading from paddr:%#x "
|
||||
"vaddr:%#x flags:%i\n",
|
||||
inst->readPC(), req->paddr, req->vaddr, req->flags);
|
||||
/*
|
||||
Addr debug_addr = ULL(0xfffffc0000be81a8);
|
||||
if (req->vaddr == debug_addr) {
|
||||
debug_break();
|
||||
}
|
||||
*/
|
||||
|
||||
assert(!req->completionEvent);
|
||||
req->completionEvent =
|
||||
new typename BackEnd::LdWritebackEvent(inst, be);
|
||||
@@ -631,9 +618,6 @@ OzoneLWLSQ<Impl>::read(MemReqPtr &req, T &data, int load_idx)
|
||||
_status = DcacheMissStall;
|
||||
|
||||
} else {
|
||||
// DPRINTF(Activity, "Activity: ld accessing mem hit [sn:%lli]\n",
|
||||
// inst->seqNum);
|
||||
|
||||
DPRINTF(OzoneLSQ, "D-cache hit!\n");
|
||||
}
|
||||
} else {
|
||||
@@ -664,12 +648,7 @@ OzoneLWLSQ<Impl>::write(MemReqPtr &req, T &data, int store_idx)
|
||||
assert(!req->data);
|
||||
req->data = new uint8_t[64];
|
||||
memcpy(req->data, (uint8_t *)&(*sq_it).data, req->size);
|
||||
/*
|
||||
Addr debug_addr = ULL(0xfffffc0000be81a8);
|
||||
if (req->vaddr == debug_addr) {
|
||||
debug_break();
|
||||
}
|
||||
*/
|
||||
|
||||
// This function only writes the data to the store queue, so no fault
|
||||
// can happen here.
|
||||
return NoFault;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2004-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -104,12 +104,6 @@ OzoneLWLSQ<Impl>::init(Params *params, unsigned maxLQEntries,
|
||||
SQIndices.push(i);
|
||||
}
|
||||
|
||||
// May want to initialize these entries to NULL
|
||||
|
||||
// loadHead = loadTail = 0;
|
||||
|
||||
// storeHead = storeWBIdx = storeTail = 0;
|
||||
|
||||
usedPorts = 0;
|
||||
cachePorts = params->cachePorts;
|
||||
|
||||
@@ -197,8 +191,6 @@ OzoneLWLSQ<Impl>::insert(DynInstPtr &inst)
|
||||
} else {
|
||||
insertStore(inst);
|
||||
}
|
||||
|
||||
// inst->setInLSQ();
|
||||
}
|
||||
|
||||
template <class Impl>
|
||||
@@ -569,12 +561,9 @@ OzoneLWLSQ<Impl>::writebackStores()
|
||||
}
|
||||
|
||||
if (result != MA_HIT && dcacheInterface->doEvents()) {
|
||||
// Event *wb = NULL;
|
||||
store_event->miss = true;
|
||||
typename BackEnd::LdWritebackEvent *wb = NULL;
|
||||
if (req->flags & LOCKED) {
|
||||
// Stx_C does not generate a system port transaction.
|
||||
// req->result=1;
|
||||
wb = new typename BackEnd::LdWritebackEvent(inst,
|
||||
be);
|
||||
store_event->wbEvent = wb;
|
||||
@@ -585,8 +574,6 @@ OzoneLWLSQ<Impl>::writebackStores()
|
||||
// DPRINTF(Activity, "Active st accessing mem miss [sn:%lli]\n",
|
||||
// inst->seqNum);
|
||||
|
||||
// Will stores need their own kind of writeback events?
|
||||
// Do stores even need writeback events?
|
||||
be->addDcacheMiss(inst);
|
||||
|
||||
lastDcacheStall = curTick;
|
||||
@@ -604,20 +591,16 @@ OzoneLWLSQ<Impl>::writebackStores()
|
||||
// inst->seqNum);
|
||||
|
||||
if (req->flags & LOCKED) {
|
||||
// Stx_C does not generate a system port transaction.
|
||||
/* if (req->flags & UNCACHEABLE) {
|
||||
req->result = 2;
|
||||
} else {
|
||||
req->result = 1;
|
||||
}
|
||||
*/
|
||||
// Stx_C does not generate a system port
|
||||
// transaction in the 21264, but that might be
|
||||
// hard to accomplish in this model.
|
||||
|
||||
typename BackEnd::LdWritebackEvent *wb =
|
||||
new typename BackEnd::LdWritebackEvent(inst,
|
||||
be);
|
||||
store_event->wbEvent = wb;
|
||||
}
|
||||
sq_it--;
|
||||
// completeStore(inst->sqIdx);
|
||||
}
|
||||
} else {
|
||||
panic("Must HAVE DCACHE!!!!!\n");
|
||||
@@ -780,7 +763,7 @@ OzoneLWLSQ<Impl>::completeStore(int store_idx)
|
||||
SQIndices.push(inst->sqIdx);
|
||||
storeQueue.erase(sq_it);
|
||||
--stores;
|
||||
// assert(!inst->isCompleted());
|
||||
|
||||
inst->setCompleted();
|
||||
if (cpu->checker) {
|
||||
cpu->checker->tick(inst);
|
||||
@@ -791,7 +774,6 @@ template <class Impl>
|
||||
void
|
||||
OzoneLWLSQ<Impl>::switchOut()
|
||||
{
|
||||
// assert(loads == 0);
|
||||
assert(storesToWB == 0);
|
||||
switchedOut = true;
|
||||
SQIt sq_it = --(storeQueue.end());
|
||||
@@ -804,8 +786,6 @@ OzoneLWLSQ<Impl>::switchOut()
|
||||
|
||||
if ((*sq_it).size == 0 && !(*sq_it).completed) {
|
||||
sq_it--;
|
||||
// completeStore(inst->sqIdx);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -817,7 +797,8 @@ OzoneLWLSQ<Impl>::switchOut()
|
||||
continue;
|
||||
} else if ((*sq_it).req->flags & LOCKED) {
|
||||
sq_it--;
|
||||
assert(!(*sq_it).canWB || ((*sq_it).canWB && (*sq_it).req->flags & LOCKED));
|
||||
assert(!(*sq_it).canWB ||
|
||||
((*sq_it).canWB && (*sq_it).req->flags & LOCKED));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -886,12 +867,6 @@ OzoneLWLSQ<Impl>::takeOverFrom(ExecContext *old_xc)
|
||||
SQIndices.push(i);
|
||||
}
|
||||
|
||||
// May want to initialize these entries to NULL
|
||||
|
||||
// loadHead = loadTail = 0;
|
||||
|
||||
// storeHead = storeWBIdx = storeTail = 0;
|
||||
|
||||
usedPorts = 0;
|
||||
|
||||
loadFaultInst = storeFaultInst = memDepViolator = NULL;
|
||||
|
||||
@@ -1,3 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CPU_OZONE_RENAME_TABLE_HH__
|
||||
#define __CPU_OZONE_RENAME_TABLE_HH__
|
||||
|
||||
|
||||
@@ -1,3 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CPU_OZONE_THREAD_STATE_HH__
|
||||
#define __CPU_OZONE_THREAD_STATE_HH__
|
||||
@@ -62,19 +89,14 @@ struct OzoneThreadState : public ThreadState {
|
||||
|
||||
void setStatus(Status new_status) { _status = new_status; }
|
||||
|
||||
RenameTable<Impl> renameTable; // Should I include backend and frontend
|
||||
// tables here? For the ozone CPU, maybe, for the new full CPU, probably
|
||||
// not...you wouldn't want threads just accessing the backend/frontend
|
||||
// rename tables.
|
||||
Addr PC; // What should these be set to? Probably the committed ones.
|
||||
RenameTable<Impl> renameTable;
|
||||
Addr PC;
|
||||
Addr nextPC;
|
||||
|
||||
// Current instruction?
|
||||
// Current instruction
|
||||
TheISA::MachInst inst;
|
||||
|
||||
TheISA::RegFile regs;
|
||||
// Front end? Back end?
|
||||
// MemReqPtr memReq;
|
||||
|
||||
typename Impl::FullCPU *cpu;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user