Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/41894 )

Change subject: WIP
......................................................................

WIP

Change-Id: I0ccbd634cc3374d28c0e79ea82cef39f1ba2c141
---
M src/arch/generic/isa.hh
M src/arch/x86/isa.hh
M src/cpu/minor/execute.cc
M src/cpu/minor/scoreboard.cc
M src/cpu/minor/scoreboard.hh
M src/cpu/simple_thread.cc
M src/cpu/simple_thread.hh
M src/cpu/thread_context.cc
M src/cpu/thread_context.hh
9 files changed, 76 insertions(+), 31 deletions(-)



diff --git a/src/arch/generic/isa.hh b/src/arch/generic/isa.hh
index 2fc8df4..78303ac 100644
--- a/src/arch/generic/isa.hh
+++ b/src/arch/generic/isa.hh
@@ -45,6 +45,15 @@

 class ThreadContext;

+class RegisterClassInfo
+{
+  protected:
+    size_t _size = 0;
+
+  public:
+    size_t size() const { return _size; }
+};
+
 class BaseISA : public SimObject
 {
   protected:
@@ -70,6 +79,8 @@
     {
         return initVecRegRenameMode();
     }
+
+ const RegisterClassInfo &registerClassInfo(RegClass reg_class) const = 0;
 };

 #endif // __ARCH_GENERIC_ISA_HH__
diff --git a/src/arch/x86/isa.hh b/src/arch/x86/isa.hh
index 5d31d87..a653bbb 100644
--- a/src/arch/x86/isa.hh
+++ b/src/arch/x86/isa.hh
@@ -53,6 +53,16 @@

     std::string vendorString;

+    RegisterClassInfo regClassInfo[NumRegClasses] = {
+        { NumIntRegs },
+        { NumFloatRegs },
+        { 1 },
+        { 1 },
+        { 1 },
+        { NumCCRegs },
+        { NUM_MISCREGS }
+    };
+
   public:
     void clear();

@@ -115,6 +125,12 @@
     void setThreadContext(ThreadContext *_tc) override;

     std::string getVendorString() const;
+
+    const RegisterClassInfo &
+    registerClassInfo(RegClass reg_class) const override
+    {
+        return regClassInfo[reg_class];
+    }
 };

 }
diff --git a/src/cpu/minor/execute.cc b/src/cpu/minor/execute.cc
index ed582ad..0f33954 100644
--- a/src/cpu/minor/execute.cc
+++ b/src/cpu/minor/execute.cc
@@ -168,6 +168,9 @@
     for (ThreadID tid = 0; tid < params.numThreads; tid++) {
         std::string tid_str = std::to_string(tid);

+        ThreadContext *tc = cpu.threads[tid]->getTC();
+        const int numRegs = ;
+
         /* Input Buffers */
         inputBuffer.push_back(
             InputBuffer<ForwardInstData>(
@@ -175,7 +178,11 @@
                 params.executeInputBufferSize));

         /* Scoreboards */
-        scoreboard.push_back(Scoreboard(name_ + ".scoreboard" + tid_str));
+        scoreboard.emplace_back(name_ + ".scoreboard" + tid_str,
+                tc->registerClassInfo(IntRegClass).size(),
+                TheISA::NumCCRegs, TheISA::NumFloatRegs,
+                TheISA::NumVecRegs, TheISA::NumVecElemPerVecReg,
+                TheISA::NumVecPredRegs);

         /* In-flight instruction records */
         executeInfo[tid].inFlightInsts =  new Queue<QueuedInst,
diff --git a/src/cpu/minor/scoreboard.cc b/src/cpu/minor/scoreboard.cc
index c0846c7..459d693 100644
--- a/src/cpu/minor/scoreboard.cc
+++ b/src/cpu/minor/scoreboard.cc
@@ -57,31 +57,24 @@
         switch (reg.classValue())
         {
           case IntRegClass:
-            scoreboard_index = reg.index();
+            scoreboard_index = intRegOffset + reg.index();
             ret = true;
             break;
           case FloatRegClass:
-            scoreboard_index = TheISA::NumIntRegs + TheISA::NumCCRegs +
-                reg.index();
+            scoreboard_index = floatRegOffset + reg.index();
             ret = true;
             break;
           case VecRegClass:
-            scoreboard_index = TheISA::NumIntRegs + TheISA::NumCCRegs +
-                TheISA::NumFloatRegs + reg.index();
-            ret = true;
-            break;
           case VecElemClass:
-            scoreboard_index = TheISA::NumIntRegs + TheISA::NumCCRegs +
-                TheISA::NumFloatRegs + reg.flatIndex();
+            scoreboard_index = vecRegOffset + reg.index();
             ret = true;
             break;
           case VecPredRegClass:
-            scoreboard_index = TheISA::NumIntRegs + TheISA::NumCCRegs +
-                TheISA::NumFloatRegs + TheISA::NumVecRegs + reg.index();
+            scoreboard_index = vecPredRegOffset + reg.index();
             ret = true;
             break;
           case CCRegClass:
-            scoreboard_index = TheISA::NumIntRegs + reg.index();
+            scoreboard_index = ccRegOffset + reg.index();
             ret = true;
             break;
           case MiscRegClass:
diff --git a/src/cpu/minor/scoreboard.hh b/src/cpu/minor/scoreboard.hh
index aab0b2b..e7e7293 100644
--- a/src/cpu/minor/scoreboard.hh
+++ b/src/cpu/minor/scoreboard.hh
@@ -60,6 +60,11 @@
 class Scoreboard : public Named
 {
   public:
+    const unsigned intRegOffset = 0;
+    const unsigned ccRegOffset;
+    const unsigned floatRegOffset;
+    const unsigned vecRegOffset;
+    const unsigned vecPredRegOffset;
     /** The number of registers in the Scoreboard.  These
      *  are just the integer, CC and float registers packed
      *  together with integer regs in the range [0,NumIntRegs-1],
@@ -92,12 +97,17 @@
     std::vector<InstSeqNum> writingInst;

   public:
-    Scoreboard(const std::string &name) :
+    Scoreboard(const std::string &name,
+            unsigned numIntRegs, unsigned numCcRegs, unsigned numFloatRegs,
+            unsigned numVecRegs, unsigned numVecElemPerReg,
+            unsigned numVecPredRegs) :
         Named(name),
-        numRegs(TheISA::NumIntRegs + TheISA::NumCCRegs +
-            TheISA::NumFloatRegs +
-            (TheISA::NumVecRegs * TheISA::NumVecElemPerVecReg) +
-            TheISA::NumVecPredRegs),
+        ccRegOffset(numIntRegs),
+        floatRegOffset(ccRegOffset + numCcRegs),
+        vecRegOffset(floatRegOffset + numFloatRegs),
+        vecPredRegOffset(vecRegOffset + numVecRegs),
+        numRegs(numIntRegs + numCcRegs + numFloatRegs +
+                (numVecRegs * numVecElemPerReg) + numVecPredRegs),
         numResults(numRegs, 0),
         numUnpredictableResults(numRegs, 0),
         fuIndices(numRegs, 0),
diff --git a/src/cpu/simple_thread.cc b/src/cpu/simple_thread.cc
index f15be91..d293ba0 100644
--- a/src/cpu/simple_thread.cc
+++ b/src/cpu/simple_thread.cc
@@ -67,6 +67,7 @@
                            Process *_process, BaseMMU *_mmu,
                            BaseISA *_isa)
     : ThreadState(_cpu, _thread_num, _process),
+      intRegs(_isa->registerClassInfo(IntRegClass).size()),
       isa(dynamic_cast<TheISA::ISA *>(_isa)),
       predicate(true), memAccPredicate(true),
       comInstEventQueue("instruction-based event queue"),
@@ -80,6 +81,7 @@
 SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
                            BaseMMU *_mmu, BaseISA *_isa)
     : ThreadState(_cpu, _thread_num, NULL),
+      intRegs(_isa->registerClassInfo(IntRegClass).size()),
       isa(dynamic_cast<TheISA::ISA *>(_isa)),
       predicate(true), memAccPredicate(true),
       comInstEventQueue("instruction-based event queue"),
diff --git a/src/cpu/simple_thread.hh b/src/cpu/simple_thread.hh
index 7a13825..9d206b6 100644
--- a/src/cpu/simple_thread.hh
+++ b/src/cpu/simple_thread.hh
@@ -42,8 +42,6 @@
 #ifndef __CPU_SIMPLE_THREAD_HH__
 #define __CPU_SIMPLE_THREAD_HH__

-#include <array>
-
 #include "arch/decoder.hh"
 #include "arch/generic/htm.hh"
 #include "arch/generic/mmu.hh"
@@ -94,7 +92,7 @@

   protected:
     std::array<RegVal, TheISA::NumFloatRegs> floatRegs;
-    std::array<RegVal, TheISA::NumIntRegs> intRegs;
+    std::vector<RegVal> intRegs;
     std::array<TheISA::VecRegContainer, TheISA::NumVecRegs> vecRegs;
     std::array<TheISA::VecPredRegContainer, TheISA::NumVecPredRegs>
         vecPredRegs;
@@ -270,8 +268,8 @@
     readIntReg(RegIndex reg_idx) const override
     {
         int flatIndex = isa->flattenIntIndex(reg_idx);
-        assert(flatIndex < TheISA::NumIntRegs);
-        uint64_t regVal(readIntRegFlat(flatIndex));
+        assert(flatIndex < intRegs.size());
+        uint64_t regVal = readIntRegFlat(flatIndex);
         DPRINTF(IntRegs, "Reading int reg %d (%d) as %#x.\n",
                 reg_idx, flatIndex, regVal);
         return regVal;
@@ -442,7 +440,7 @@
     setIntReg(RegIndex reg_idx, RegVal val) override
     {
         int flatIndex = isa->flattenIntIndex(reg_idx);
-        assert(flatIndex < TheISA::NumIntRegs);
+        assert(flatIndex < intRegs.size());
         DPRINTF(IntRegs, "Setting int reg %d (%d) to %#x.\n",
                 reg_idx, flatIndex, val);
         setIntRegFlat(flatIndex, val);
diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc
index 16db818..9983c9f 100644
--- a/src/cpu/thread_context.cc
+++ b/src/cpu/thread_context.cc
@@ -57,7 +57,7 @@
     DPRINTF(Context, "Comparing thread contexts\n");

     // First loop through the integer registers.
-    for (int i = 0; i < TheISA::NumIntRegs; ++i) {
+    for (int i = 0; i < registerClassInfo(IntRegClass).size(); ++i) {
         RegVal t1 = one->readIntReg(i);
         RegVal t2 = two->readIntReg(i);
         if (t1 != t2)
@@ -161,10 +161,11 @@
     }
     SERIALIZE_CONTAINER(vecPredRegs);

-    RegVal intRegs[TheISA::NumIntRegs];
-    for (int i = 0; i < TheISA::NumIntRegs; ++i)
+    const size_t numIntRegs = registerClassInfo(IntRegClass).size();
+    RegVal intRegs[numIntRegs];
+    for (int i = 0; i < numIntRegs; ++i)
         intRegs[i] = tc.readIntRegFlat(i);
-    SERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
+    SERIALIZE_ARRAY(intRegs, numIntRegs);

     if (TheISA::NumCCRegs) {
         RegVal ccRegs[TheISA::NumCCRegs];
@@ -201,9 +202,10 @@
         tc.setVecPredRegFlat(i, vecPredRegs[i]);
     }

-    RegVal intRegs[TheISA::NumIntRegs];
-    UNSERIALIZE_ARRAY(intRegs, TheISA::NumIntRegs);
-    for (int i = 0; i < TheISA::NumIntRegs; ++i)
+    const size_t numIntRegs = registerClassInfo(IntRegClass).size();
+    RegVal intRegs[numIntRegs];
+    UNSERIALIZE_ARRAY(intRegs, numIntRegs);
+    for (int i = 0; i < numIntRegs; ++i)
         tc.setIntRegFlat(i, intRegs[i]);

     if (TheISA::NumCCRegs) {
diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh
index c1c951d..ba49390 100644
--- a/src/cpu/thread_context.hh
+++ b/src/cpu/thread_context.hh
@@ -296,6 +296,12 @@
     // Same with st cond failures.
     virtual Counter readFuncExeInst() const = 0;

+    const RegisterClassInfo &
+    registerClassInfo(RegClass reg_class)
+    {
+        return getIsaPtr()->registerClassInfo(reg_class);
+    }
+
     // This function exits the thread context in the CPU and returns
     // 1 if the CPU has no more active threads (meaning it's OK to exit);
// Used in syscall-emulation mode when a thread calls the exit syscall.

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/41894
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: I0ccbd634cc3374d28c0e79ea82cef39f1ba2c141
Gerrit-Change-Number: 41894
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to