Gabe Black has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/42096 )

Change subject: cpu: De-templatize the BaseO3DynInst.
......................................................................

cpu: De-templatize the BaseO3DynInst.

Change-Id: If77561b811e10adf54a8b9e28f61e143ed3ead33
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/42096
Reviewed-by: Gabe Black <gabe.bl...@gmail.com>
Maintainer: Gabe Black <gabe.bl...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/cpu/o3/dyn_inst.cc
M src/cpu/o3/dyn_inst.hh
D src/cpu/o3/dyn_inst_impl.hh
M src/cpu/o3/impl.hh
4 files changed, 314 insertions(+), 369 deletions(-)

Approvals:
  Gabe Black: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass



diff --git a/src/cpu/o3/dyn_inst.cc b/src/cpu/o3/dyn_inst.cc
index e6da0a7..42204cf 100644
--- a/src/cpu/o3/dyn_inst.cc
+++ b/src/cpu/o3/dyn_inst.cc
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2010-2011 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2004-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -26,9 +38,292 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */

-#include "cpu/o3/dyn_inst_impl.hh"
-#include "cpu/o3/impl.hh"
+#include "cpu/o3/dyn_inst.hh"

-// Force instantiation of BaseO3DynInst for all the implementations that
-// are needed.
-template class BaseO3DynInst<O3CPUImpl>;
+#include <algorithm>
+
+#include "debug/DynInst.hh"
+#include "debug/IQ.hh"
+#include "debug/O3PipeView.hh"
+
+BaseO3DynInst::BaseO3DynInst(const StaticInstPtr &static_inst,
+                             const StaticInstPtr &_macroop,
+                             TheISA::PCState _pc, TheISA::PCState pred_pc,
+ InstSeqNum seq_num, FullO3CPU<O3CPUImpl> *_cpu)
+    : seqNum(seq_num), staticInst(static_inst), cpu(_cpu), pc(_pc),
+      regs(staticInst->numSrcRegs(), staticInst->numDestRegs()),
+      predPC(pred_pc), macroop(_macroop)
+{
+    this->regs.init();
+
+    status.reset();
+
+    instFlags.reset();
+    instFlags[RecordResult] = true;
+    instFlags[Predicate] = true;
+    instFlags[MemAccPredicate] = true;
+
+#ifndef NDEBUG
+    ++cpu->instcount;
+
+    if (cpu->instcount > 1500) {
+#ifdef DEBUG
+        cpu->dumpInsts();
+        dumpSNList();
+#endif
+        assert(cpu->instcount <= 1500);
+    }
+
+    DPRINTF(DynInst,
+        "DynInst: [sn:%lli] Instruction created. Instcount for %s = %i\n",
+        seqNum, cpu->name(), cpu->instcount);
+#endif
+
+#ifdef DEBUG
+    cpu->snList.insert(seqNum);
+#endif
+
+}
+
+BaseO3DynInst::BaseO3DynInst(const StaticInstPtr &_staticInst,
+                             const StaticInstPtr &_macroop)
+    : BaseO3DynInst(_staticInst, _macroop, {}, {}, 0, nullptr)
+{}
+
+BaseO3DynInst::~BaseO3DynInst()
+{
+#if TRACING_ON
+    if (DTRACE(O3PipeView)) {
+        Tick fetch = this->fetchTick;
+        // fetchTick can be -1 if the instruction fetched outside the trace
+        // window.
+        if (fetch != -1) {
+            Tick val;
+            // Print info needed by the pipeline activity viewer.
+ DPRINTFR(O3PipeView, "O3PipeView:fetch:%llu:0x%08llx:%d:%llu:%s\n",
+                     fetch,
+                     this->instAddr(),
+                     this->microPC(),
+                     this->seqNum,
+                     this->staticInst->disassemble(this->instAddr()));
+
+            val = (this->decodeTick == -1) ? 0 : fetch + this->decodeTick;
+            DPRINTFR(O3PipeView, "O3PipeView:decode:%llu\n", val);
+            val = (this->renameTick == -1) ? 0 : fetch + this->renameTick;
+            DPRINTFR(O3PipeView, "O3PipeView:rename:%llu\n", val);
+ val = (this->dispatchTick == -1) ? 0 : fetch + this->dispatchTick;
+            DPRINTFR(O3PipeView, "O3PipeView:dispatch:%llu\n", val);
+            val = (this->issueTick == -1) ? 0 : fetch + this->issueTick;
+            DPRINTFR(O3PipeView, "O3PipeView:issue:%llu\n", val);
+ val = (this->completeTick == -1) ? 0 : fetch + this->completeTick;
+            DPRINTFR(O3PipeView, "O3PipeView:complete:%llu\n", val);
+            val = (this->commitTick == -1) ? 0 : fetch + this->commitTick;
+
+ Tick valS = (this->storeTick == -1) ? 0 : fetch + this->storeTick;
+            DPRINTFR(O3PipeView, "O3PipeView:retire:%llu:store:%llu\n",
+                    val, valS);
+        }
+    }
+#endif
+
+    delete [] memData;
+    delete traceData;
+    fault = NoFault;
+
+#ifndef NDEBUG
+    --cpu->instcount;
+
+    DPRINTF(DynInst,
+ "DynInst: [sn:%lli] Instruction destroyed. Instcount for %s = %i\n",
+        seqNum, cpu->name(), cpu->instcount);
+#endif
+#ifdef DEBUG
+    cpu->snList.erase(seqNum);
+#endif
+};
+
+
+#ifdef DEBUG
+void
+BaseO3DynInst::dumpSNList()
+{
+    std::set<InstSeqNum>::iterator sn_it = cpu->snList.begin();
+
+    int count = 0;
+    while (sn_it != cpu->snList.end()) {
+        cprintf("%i: [sn:%lli] not destroyed\n", count, (*sn_it));
+        count++;
+        sn_it++;
+    }
+}
+#endif
+
+void
+BaseO3DynInst::dump()
+{
+    cprintf("T%d : %#08d `", threadNumber, pc.instAddr());
+    std::cout << staticInst->disassemble(pc.instAddr());
+    cprintf("'\n");
+}
+
+void
+BaseO3DynInst::dump(std::string &outstring)
+{
+    std::ostringstream s;
+    s << "T" << threadNumber << " : 0x" << pc.instAddr() << " "
+      << staticInst->disassemble(pc.instAddr());
+
+    outstring = s.str();
+}
+
+void
+BaseO3DynInst::markSrcRegReady()
+{
+    DPRINTF(IQ, "[sn:%lli] has %d ready out of %d sources. RTI %d)\n",
+            seqNum, readyRegs+1, numSrcRegs(), readyToIssue());
+    if (++readyRegs == numSrcRegs()) {
+        setCanIssue();
+    }
+}
+
+void
+BaseO3DynInst::markSrcRegReady(RegIndex src_idx)
+{
+    regs.readySrcIdx(src_idx, true);
+    markSrcRegReady();
+}
+
+
+void
+BaseO3DynInst::setSquashed()
+{
+    status.set(Squashed);
+
+    if (!isPinnedRegsRenamed() || isPinnedRegsSquashDone())
+        return;
+
+    // This inst has been renamed already so it may go through rename
+    // again (e.g. if the squash is due to memory access order violation).
+ // Reset the write counters for all pinned destination register to ensure + // that they are in a consistent state for a possible re-rename. This also
+    // ensures that dest regs will be pinned to the same phys register if
+    // re-rename happens.
+    for (int idx = 0; idx < numDestRegs(); idx++) {
+        PhysRegIdPtr phys_dest_reg = regs.renamedDestIdx(idx);
+        if (phys_dest_reg->isPinned()) {
+            phys_dest_reg->incrNumPinnedWrites();
+            if (isPinnedRegsWritten())
+                phys_dest_reg->incrNumPinnedWritesToComplete();
+        }
+    }
+    setPinnedRegsSquashDone();
+}
+
+Fault
+BaseO3DynInst::execute()
+{
+    // @todo: Pretty convoluted way to avoid squashing from happening
+    // when using the TC during an instruction's execution
+    // (specifically for instructions that have side-effects that use
+    // the TC).  Fix this.
+    bool no_squash_from_TC = this->thread->noSquashFromTC;
+    this->thread->noSquashFromTC = true;
+
+    this->fault = this->staticInst->execute(this, this->traceData);
+
+    this->thread->noSquashFromTC = no_squash_from_TC;
+
+    return this->fault;
+}
+
+Fault
+BaseO3DynInst::initiateAcc()
+{
+    // @todo: Pretty convoluted way to avoid squashing from happening
+    // when using the TC during an instruction's execution
+    // (specifically for instructions that have side-effects that use
+    // the TC).  Fix this.
+    bool no_squash_from_TC = this->thread->noSquashFromTC;
+    this->thread->noSquashFromTC = true;
+
+    this->fault = this->staticInst->initiateAcc(this, this->traceData);
+
+    this->thread->noSquashFromTC = no_squash_from_TC;
+
+    return this->fault;
+}
+
+Fault
+BaseO3DynInst::completeAcc(PacketPtr pkt)
+{
+    // @todo: Pretty convoluted way to avoid squashing from happening
+    // when using the TC during an instruction's execution
+    // (specifically for instructions that have side-effects that use
+    // the TC).  Fix this.
+    bool no_squash_from_TC = this->thread->noSquashFromTC;
+    this->thread->noSquashFromTC = true;
+
+    if (this->cpu->checker) {
+        if (this->isStoreConditional()) {
+            this->reqToVerify->setExtraData(pkt->req->getExtraData());
+        }
+    }
+
+ this->fault = this->staticInst->completeAcc(pkt, this, this->traceData);
+
+    this->thread->noSquashFromTC = no_squash_from_TC;
+
+    return this->fault;
+}
+
+void
+BaseO3DynInst::trap(const Fault &fault)
+{
+    this->cpu->trap(fault, this->threadNumber, this->staticInst);
+}
+
+Fault
+BaseO3DynInst::initiateMemRead(Addr addr, unsigned size, Request::Flags flags,
+                               const std::vector<bool> &byte_enable)
+{
+    assert(byte_enable.size() == size);
+    return cpu->pushRequest(
+        dynamic_cast<O3DynInstPtr::PtrType>(this),
+        /* ld */ true, nullptr, size, addr, flags, nullptr, nullptr,
+        byte_enable);
+}
+
+Fault
+BaseO3DynInst::initiateHtmCmd(Request::Flags flags)
+{
+    return cpu->pushRequest(
+            dynamic_cast<O3DynInstPtr::PtrType>(this),
+            /* ld */ true, nullptr, 8, 0x0ul, flags, nullptr, nullptr);
+}
+
+Fault
+BaseO3DynInst::writeMem(uint8_t *data, unsigned size, Addr addr,
+                        Request::Flags flags, uint64_t *res,
+                        const std::vector<bool> &byte_enable)
+{
+    assert(byte_enable.size() == size);
+    return cpu->pushRequest(
+        dynamic_cast<O3DynInstPtr::PtrType>(this),
+        /* st */ false, data, size, addr, flags, res, nullptr,
+        byte_enable);
+}
+
+Fault
+BaseO3DynInst::initiateMemAMO(Addr addr, unsigned size, Request::Flags flags,
+                              AtomicOpFunctorPtr amo_op)
+{
+ // atomic memory instructions do not have data to be written to memory yet + // since the atomic operations will be executed directly in cache/memory.
+    // Therefore, its `data` field is nullptr.
+    // Atomic memory requests need to carry their `amo_op` fields to cache/
+    // memory
+    return cpu->pushRequest(
+            dynamic_cast<O3DynInstPtr::PtrType>(this),
+            /* atomic */ false, nullptr, size, addr, flags, nullptr,
+            std::move(amo_op), std::vector<bool>(size, true));
+}
diff --git a/src/cpu/o3/dyn_inst.hh b/src/cpu/o3/dyn_inst.hh
index 4083721..cade03b 100644
--- a/src/cpu/o3/dyn_inst.hh
+++ b/src/cpu/o3/dyn_inst.hh
@@ -48,6 +48,7 @@
 #include <list>
 #include <string>

+#include "base/refcnt.hh"
 #include "base/trace.hh"
 #include "config/the_isa.hh"
 #include "cpu/checker/cpu.hh"
@@ -65,17 +66,20 @@

 class Packet;

-template <class Impl>
+class BaseO3DynInst;
+
+using O3DynInstPtr = RefCountingPtr<BaseO3DynInst>;
+
 class BaseO3DynInst : public ExecContext, public RefCounted
 {
   public:
     // The list of instructions iterator type.
-    typedef typename std::list<typename Impl::DynInstPtr>::iterator ListIt;
+    typedef typename std::list<O3DynInstPtr>::iterator ListIt;

     /** BaseDynInst constructor given a binary instruction. */
     BaseO3DynInst(const StaticInstPtr &staticInst, const StaticInstPtr
             &macroop, TheISA::PCState pc, TheISA::PCState predPC,
-            InstSeqNum seq_num, typename Impl::O3CPU *cpu);
+            InstSeqNum seq_num, FullO3CPU<O3CPUImpl> *cpu);

     /** BaseDynInst constructor given a static inst pointer. */
     BaseO3DynInst(const StaticInstPtr &_staticInst,
@@ -99,12 +103,12 @@
     const StaticInstPtr staticInst;

     /** Pointer to the Impl's CPU object. */
-    typename Impl::O3CPU *cpu = nullptr;
+    FullO3CPU<O3CPUImpl> *cpu = nullptr;

     BaseCPU *getCpuPtr() { return cpu; }

     /** Pointer to the thread state. */
-    typename Impl::O3CPU::ImplState *thread = nullptr;
+    O3ThreadState<O3CPUImpl> *thread = nullptr;

     /** The kind of fault this instruction has generated. */
     Fault fault = NoFault;
@@ -200,8 +204,6 @@
         size_t _numSrcs;
         size_t _numDests;

-        size_t srcsReady = 0;
-
         using BackingStorePtr = std::unique_ptr<uint8_t[]>;
         using BufCursor = BackingStorePtr::pointer;

@@ -384,11 +386,11 @@

     /** Load queue index. */
     ssize_t lqIdx = -1;
-    typename Impl::CPUPol::LSQUnit::LQIterator lqIt;
+    typename ::LSQUnit<O3CPUImpl>::LQIterator lqIt;

     /** Store queue index. */
     ssize_t sqIdx = -1;
-    typename Impl::CPUPol::LSQUnit::SQIterator sqIt;
+    typename ::LSQUnit<O3CPUImpl>::SQIterator sqIt;


     /////////////////////// TLB Miss //////////////////////
@@ -396,7 +398,7 @@
      * Saved memory request (needed when the DTB address translation is
      * delayed due to a hw page table walk).
      */
-    typename Impl::CPUPol::LSQ::LSQRequest *savedReq;
+    typename ::LSQ<O3CPUImpl>::LSQ::LSQRequest *savedReq;

     /////////////////////// Checker //////////////////////
     // Need a copy of main request pointer to verify on writes.
@@ -1015,7 +1017,7 @@

     /** Sets the pointer to the thread state. */
     void
-    setThreadState(typename Impl::O3CPU::ImplState *state)
+    setThreadState(O3ThreadState<O3CPUImpl> *state)
     {
         thread = state;
     }
@@ -1326,56 +1328,4 @@
     }
 };

-template<class Impl>
-Fault
-BaseO3DynInst<Impl>::initiateMemRead(Addr addr, unsigned size,
-                                     Request::Flags flags,
-                                     const std::vector<bool> &byte_enable)
-{
-    assert(byte_enable.size() == size);
-    return cpu->pushRequest(
-        dynamic_cast<typename Impl::DynInstPtr::PtrType>(this),
-        /* ld */ true, nullptr, size, addr, flags, nullptr, nullptr,
-        byte_enable);
-}
-
-template<class Impl>
-Fault
-BaseO3DynInst<Impl>::initiateHtmCmd(Request::Flags flags)
-{
-    return cpu->pushRequest(
-            dynamic_cast<typename Impl::DynInstPtr::PtrType>(this),
-            /* ld */ true, nullptr, 8, 0x0ul, flags, nullptr, nullptr);
-}
-
-template<class Impl>
-Fault
-BaseO3DynInst<Impl>::writeMem(uint8_t *data, unsigned size, Addr addr,
-                              Request::Flags flags, uint64_t *res,
-                              const std::vector<bool> &byte_enable)
-{
-    assert(byte_enable.size() == size);
-    return cpu->pushRequest(
-        dynamic_cast<typename Impl::DynInstPtr::PtrType>(this),
-        /* st */ false, data, size, addr, flags, res, nullptr,
-        byte_enable);
-}
-
-template<class Impl>
-Fault
-BaseO3DynInst<Impl>::initiateMemAMO(Addr addr, unsigned size,
-                                    Request::Flags flags,
-                                    AtomicOpFunctorPtr amo_op)
-{
- // atomic memory instructions do not have data to be written to memory yet - // since the atomic operations will be executed directly in cache/memory.
-    // Therefore, its `data` field is nullptr.
-    // Atomic memory requests need to carry their `amo_op` fields to cache/
-    // memory
-    return cpu->pushRequest(
-            dynamic_cast<typename Impl::DynInstPtr::PtrType>(this),
-            /* atomic */ false, nullptr, size, addr, flags, nullptr,
-            std::move(amo_op), std::vector<bool>(size, true));
-}
-
 #endif // __CPU_O3_DYN_INST_HH__
diff --git a/src/cpu/o3/dyn_inst_impl.hh b/src/cpu/o3/dyn_inst_impl.hh
deleted file mode 100644
index 7bb9dde..0000000
--- a/src/cpu/o3/dyn_inst_impl.hh
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2010-2011 ARM Limited
- * All rights reserved
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder.  You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * 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
- * 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_O3_DYN_INST_IMPL_HH__
-#define __CPU_O3_DYN_INST_IMPL_HH__
-
-#include <algorithm>
-
-#include "cpu/o3/dyn_inst.hh"
-#include "debug/DynInst.hh"
-#include "debug/IQ.hh"
-#include "debug/O3PipeView.hh"
-
-template <class Impl>
-BaseO3DynInst<Impl>::BaseO3DynInst(const StaticInstPtr &static_inst,
-                                   const StaticInstPtr &_macroop,
-                                   TheISA::PCState _pc,
-                                   TheISA::PCState pred_pc,
-                                   InstSeqNum seq_num,
-                                   typename Impl::O3CPU *_cpu)
-    : seqNum(seq_num), staticInst(static_inst), cpu(_cpu), pc(_pc),
-      regs(staticInst->numSrcRegs(), staticInst->numDestRegs()),
-      predPC(pred_pc), macroop(_macroop)
-{
-    this->regs.init();
-
-    status.reset();
-
-    instFlags.reset();
-    instFlags[RecordResult] = true;
-    instFlags[Predicate] = true;
-    instFlags[MemAccPredicate] = true;
-
-#ifndef NDEBUG
-    ++cpu->instcount;
-
-    if (cpu->instcount > 1500) {
-#ifdef DEBUG
-        cpu->dumpInsts();
-        dumpSNList();
-#endif
-        assert(cpu->instcount <= 1500);
-    }
-
-    DPRINTF(DynInst,
-        "DynInst: [sn:%lli] Instruction created. Instcount for %s = %i\n",
-        seqNum, cpu->name(), cpu->instcount);
-#endif
-
-#ifdef DEBUG
-    cpu->snList.insert(seqNum);
-#endif
-
-}
-
-template <class Impl>
-BaseO3DynInst<Impl>::BaseO3DynInst(const StaticInstPtr &_staticInst,
-                                   const StaticInstPtr &_macroop)
-    : BaseO3DynInst<Impl>(_staticInst, _macroop, {}, {}, 0, nullptr)
-{}
-
-template <class Impl>BaseO3DynInst<Impl>::~BaseO3DynInst()
-{
-#if TRACING_ON
-    if (DTRACE(O3PipeView)) {
-        Tick fetch = this->fetchTick;
- // fetchTick can be -1 if the instruction fetched outside the trace window.
-        if (fetch != -1) {
-            Tick val;
-            // Print info needed by the pipeline activity viewer.
- DPRINTFR(O3PipeView, "O3PipeView:fetch:%llu:0x%08llx:%d:%llu:%s\n",
-                     fetch,
-                     this->instAddr(),
-                     this->microPC(),
-                     this->seqNum,
-                     this->staticInst->disassemble(this->instAddr()));
-
-            val = (this->decodeTick == -1) ? 0 : fetch + this->decodeTick;
-            DPRINTFR(O3PipeView, "O3PipeView:decode:%llu\n", val);
-            val = (this->renameTick == -1) ? 0 : fetch + this->renameTick;
-            DPRINTFR(O3PipeView, "O3PipeView:rename:%llu\n", val);
- val = (this->dispatchTick == -1) ? 0 : fetch + this->dispatchTick;
-            DPRINTFR(O3PipeView, "O3PipeView:dispatch:%llu\n", val);
-            val = (this->issueTick == -1) ? 0 : fetch + this->issueTick;
-            DPRINTFR(O3PipeView, "O3PipeView:issue:%llu\n", val);
- val = (this->completeTick == -1) ? 0 : fetch + this->completeTick;
-            DPRINTFR(O3PipeView, "O3PipeView:complete:%llu\n", val);
-            val = (this->commitTick == -1) ? 0 : fetch + this->commitTick;
-
- Tick valS = (this->storeTick == -1) ? 0 : fetch + this->storeTick; - DPRINTFR(O3PipeView, "O3PipeView:retire:%llu:store:%llu\n", val, valS);
-        }
-    }
-#endif
-
-    delete [] memData;
-    delete traceData;
-    fault = NoFault;
-
-#ifndef NDEBUG
-    --cpu->instcount;
-
-    DPRINTF(DynInst,
- "DynInst: [sn:%lli] Instruction destroyed. Instcount for %s = %i\n",
-        seqNum, cpu->name(), cpu->instcount);
-#endif
-#ifdef DEBUG
-    cpu->snList.erase(seqNum);
-#endif
-};
-
-
-#ifdef DEBUG
-template <class Impl>
-void
-BaseO3DynInst<Impl>::dumpSNList()
-{
-    std::set<InstSeqNum>::iterator sn_it = cpu->snList.begin();
-
-    int count = 0;
-    while (sn_it != cpu->snList.end()) {
-        cprintf("%i: [sn:%lli] not destroyed\n", count, (*sn_it));
-        count++;
-        sn_it++;
-    }
-}
-#endif
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::dump()
-{
-    cprintf("T%d : %#08d `", threadNumber, pc.instAddr());
-    std::cout << staticInst->disassemble(pc.instAddr());
-    cprintf("'\n");
-}
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::dump(std::string &outstring)
-{
-    std::ostringstream s;
-    s << "T" << threadNumber << " : 0x" << pc.instAddr() << " "
-      << staticInst->disassemble(pc.instAddr());
-
-    outstring = s.str();
-}
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::markSrcRegReady()
-{
-    DPRINTF(IQ, "[sn:%lli] has %d ready out of %d sources. RTI %d)\n",
-            seqNum, readyRegs+1, numSrcRegs(), readyToIssue());
-    if (++readyRegs == numSrcRegs()) {
-        setCanIssue();
-    }
-}
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::markSrcRegReady(RegIndex src_idx)
-{
-    regs.readySrcIdx(src_idx, true);
-    markSrcRegReady();
-}
-
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::setSquashed()
-{
-    status.set(Squashed);
-
-    if (!isPinnedRegsRenamed() || isPinnedRegsSquashDone())
-        return;
-
-    // This inst has been renamed already so it may go through rename
-    // again (e.g. if the squash is due to memory access order violation).
- // Reset the write counters for all pinned destination register to ensure - // that they are in a consistent state for a possible re-rename. This also
-    // ensures that dest regs will be pinned to the same phys register if
-    // re-rename happens.
-    for (int idx = 0; idx < numDestRegs(); idx++) {
-        PhysRegIdPtr phys_dest_reg = regs.renamedDestIdx(idx);
-        if (phys_dest_reg->isPinned()) {
-            phys_dest_reg->incrNumPinnedWrites();
-            if (isPinnedRegsWritten())
-                phys_dest_reg->incrNumPinnedWritesToComplete();
-        }
-    }
-    setPinnedRegsSquashDone();
-}
-
-template <class Impl>
-Fault
-BaseO3DynInst<Impl>::execute()
-{
-    // @todo: Pretty convoluted way to avoid squashing from happening
-    // when using the TC during an instruction's execution
-    // (specifically for instructions that have side-effects that use
-    // the TC).  Fix this.
-    bool no_squash_from_TC = this->thread->noSquashFromTC;
-    this->thread->noSquashFromTC = true;
-
-    this->fault = this->staticInst->execute(this, this->traceData);
-
-    this->thread->noSquashFromTC = no_squash_from_TC;
-
-    return this->fault;
-}
-
-template <class Impl>
-Fault
-BaseO3DynInst<Impl>::initiateAcc()
-{
-    // @todo: Pretty convoluted way to avoid squashing from happening
-    // when using the TC during an instruction's execution
-    // (specifically for instructions that have side-effects that use
-    // the TC).  Fix this.
-    bool no_squash_from_TC = this->thread->noSquashFromTC;
-    this->thread->noSquashFromTC = true;
-
-    this->fault = this->staticInst->initiateAcc(this, this->traceData);
-
-    this->thread->noSquashFromTC = no_squash_from_TC;
-
-    return this->fault;
-}
-
-template <class Impl>
-Fault
-BaseO3DynInst<Impl>::completeAcc(PacketPtr pkt)
-{
-    // @todo: Pretty convoluted way to avoid squashing from happening
-    // when using the TC during an instruction's execution
-    // (specifically for instructions that have side-effects that use
-    // the TC).  Fix this.
-    bool no_squash_from_TC = this->thread->noSquashFromTC;
-    this->thread->noSquashFromTC = true;
-
-    if (this->cpu->checker) {
-        if (this->isStoreConditional()) {
-            this->reqToVerify->setExtraData(pkt->req->getExtraData());
-        }
-    }
-
- this->fault = this->staticInst->completeAcc(pkt, this, this->traceData);
-
-    this->thread->noSquashFromTC = no_squash_from_TC;
-
-    return this->fault;
-}
-
-template <class Impl>
-void
-BaseO3DynInst<Impl>::trap(const Fault &fault)
-{
-    this->cpu->trap(fault, this->threadNumber, this->staticInst);
-}
-
-#endif//__CPU_O3_DYN_INST_IMPL_HH__
diff --git a/src/cpu/o3/impl.hh b/src/cpu/o3/impl.hh
index b709930..593c5e4 100644
--- a/src/cpu/o3/impl.hh
+++ b/src/cpu/o3/impl.hh
@@ -33,7 +33,6 @@
 #include "cpu/o3/cpu_policy.hh"

 // Forward declarations.
-template <class Impl>
 class BaseO3DynInst;

 template <class Impl>
@@ -53,7 +52,7 @@
     typedef SimpleCPUPolicy<O3CPUImpl> CPUPol;

     /** The DynInst type to be used. */
-    typedef BaseO3DynInst<O3CPUImpl> DynInst;
+    typedef BaseO3DynInst DynInst;

     /** The refcounted DynInst pointer to be used.  In most cases this is
      *  what should be used, and not DynInst *.

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/42096
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: If77561b811e10adf54a8b9e28f61e143ed3ead33
Gerrit-Change-Number: 42096
Gerrit-PatchSet: 10
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Daniel Carvalho <oda...@yahoo.com.br>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Jason Lowe-Power <ja...@lowepower.com>
Gerrit-Reviewer: Matthew Poremba <matthew.pore...@amd.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to