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

 (

53 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one. )Change subject: cpu-o3: Use an array to hold rename maps in UnifiedRenameMap.
......................................................................

cpu-o3: Use an array to hold rename maps in UnifiedRenameMap.

Change-Id: I3ae1d6ecb103d2b877aba36050cd7b148742b503
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49715
Reviewed-by: Giacomo Travaglini <[email protected]>
Maintainer: Giacomo Travaglini <[email protected]>
Tested-by: kokoro <[email protected]>
---
M src/cpu/o3/rename.cc
M src/cpu/o3/rename_map.cc
M src/cpu/o3/rename_map.hh
3 files changed, 67 insertions(+), 120 deletions(-)

Approvals:
  Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass




diff --git a/src/cpu/o3/rename.cc b/src/cpu/o3/rename.cc
index e2b2d14..2ff428b 100644
--- a/src/cpu/o3/rename.cc
+++ b/src/cpu/o3/rename.cc
@@ -1250,12 +1250,12 @@
             freeEntries[tid].lqEntries,
             freeEntries[tid].sqEntries,
             renameMap[tid]->numFreeEntries(),
-            renameMap[tid]->numFreeIntEntries(),
-            renameMap[tid]->numFreeFloatEntries(),
-            renameMap[tid]->numFreeVecEntries(),
-            renameMap[tid]->numFreeVecElemEntries(),
-            renameMap[tid]->numFreePredEntries(),
-            renameMap[tid]->numFreeCCEntries());
+            renameMap[tid]->numFreeEntries(IntRegClass),
+            renameMap[tid]->numFreeEntries(FloatRegClass),
+            renameMap[tid]->numFreeEntries(VecRegClass),
+            renameMap[tid]->numFreeEntries(VecElemClass),
+            renameMap[tid]->numFreeEntries(VecPredRegClass),
+            renameMap[tid]->numFreeEntries(CCRegClass));

     DPRINTF(Rename, "[tid:%i] %i instructions not yet in ROB\n",
             tid, instsInProgress[tid]);
diff --git a/src/cpu/o3/rename_map.cc b/src/cpu/o3/rename_map.cc
index 7a18ab5..d665b6a 100644
--- a/src/cpu/o3/rename_map.cc
+++ b/src/cpu/o3/rename_map.cc
@@ -115,23 +115,30 @@
 {
     regFile = _regFile;

-    intMap.init(regClasses.at(IntRegClass), &(freeList->intList));
-    floatMap.init(regClasses.at(FloatRegClass), &(freeList->floatList));
-    vecMap.init(regClasses.at(VecRegClass), &(freeList->vecList));
-    vecElemMap.init(regClasses.at(VecElemClass), &(freeList->vecElemList));
-    predMap.init(regClasses.at(VecPredRegClass), &(freeList->predList));
-    ccMap.init(regClasses.at(CCRegClass), &(freeList->ccList));
+    renameMaps[IntRegClass].init(regClasses.at(IntRegClass),
+            &(freeList->intList));
+    renameMaps[FloatRegClass].init(regClasses.at(FloatRegClass),
+            &(freeList->floatList));
+    renameMaps[VecRegClass].init(regClasses.at(VecRegClass),
+            &(freeList->vecList));
+    renameMaps[VecElemClass].init(regClasses.at(VecElemClass),
+            &(freeList->vecElemList));
+    renameMaps[VecPredRegClass].init(regClasses.at(VecPredRegClass),
+            &(freeList->predList));
+    renameMaps[CCRegClass].init(regClasses.at(CCRegClass),
+            &(freeList->ccList));
 }

 bool
 UnifiedRenameMap::canRename(DynInstPtr inst) const
 {
-    return inst->numDestRegs(IntRegClass) <= intMap.numFreeEntries() &&
-        inst->numDestRegs(FloatRegClass) <= floatMap.numFreeEntries() &&
-        inst->numDestRegs(VecRegClass) <= vecMap.numFreeEntries() &&
-        inst->numDestRegs(VecElemClass) <= vecElemMap.numFreeEntries() &&
-        inst->numDestRegs(VecPredRegClass) <= predMap.numFreeEntries() &&
-        inst->numDestRegs(CCRegClass) <= ccMap.numFreeEntries();
+    for (int i = 0; i < renameMaps.size(); i++) {
+        if (inst->numDestRegs((RegClassType)i) >
+                renameMaps[i].numFreeEntries()) {
+            return false;
+        }
+    }
+    return true;
 }

 } // namespace o3
diff --git a/src/cpu/o3/rename_map.hh b/src/cpu/o3/rename_map.hh
index e5886f1..3e5380b 100644
--- a/src/cpu/o3/rename_map.hh
+++ b/src/cpu/o3/rename_map.hh
@@ -42,7 +42,10 @@
 #ifndef __CPU_O3_RENAME_MAP_HH__
 #define __CPU_O3_RENAME_MAP_HH__

+#include <algorithm>
+#include <array>
 #include <iostream>
+#include <limits>
 #include <utility>
 #include <vector>

@@ -174,23 +177,7 @@
 class UnifiedRenameMap
 {
   private:
-    /** The integer register rename map */
-    SimpleRenameMap intMap;
-
-    /** The floating-point register rename map */
-    SimpleRenameMap floatMap;
-
-    /** The condition-code register rename map */
-    SimpleRenameMap ccMap;
-
-    /** The vector register rename map */
-    SimpleRenameMap vecMap;
-
-    /** The vector element register rename map */
-    SimpleRenameMap vecElemMap;
-
-    /** The predicate register rename map */
-    SimpleRenameMap predMap;
+    std::array<SimpleRenameMap, CCRegClass + 1> renameMaps;

     /**
      * The register file object is used only to get PhysRegIdPtr
@@ -223,32 +210,16 @@
     RenameInfo
     rename(const RegId& arch_reg)
     {
-        switch (arch_reg.classValue()) {
-          case IntRegClass:
-            return intMap.rename(arch_reg);
-          case FloatRegClass:
-            return floatMap.rename(arch_reg);
-          case VecRegClass:
-            return vecMap.rename(arch_reg);
-          case VecElemClass:
-            return vecElemMap.rename(arch_reg);
-          case VecPredRegClass:
-            return predMap.rename(arch_reg);
-          case CCRegClass:
-            return ccMap.rename(arch_reg);
-          case MiscRegClass:
-            {
-                // misc regs aren't really renamed, just remapped
-                PhysRegIdPtr phys_reg = lookup(arch_reg);
- // Set the new register to the previous one to keep the same
-                // mapping throughout the execution.
-                return RenameInfo(phys_reg, phys_reg);
-            }
-
-          default:
-            panic("rename rename(): unknown reg class %s\n",
-                  arch_reg.className());
+        auto reg_class = arch_reg.classValue();
+        if (reg_class == MiscRegClass) {
+            // misc regs aren't really renamed, just remapped
+            PhysRegIdPtr phys_reg = lookup(arch_reg);
+            // Set the new register to the previous one to keep the same
+            // mapping throughout the execution.
+            return RenameInfo(phys_reg, phys_reg);
         }
+
+        return renameMaps[reg_class].rename(arch_reg);
     }

     /**
@@ -261,34 +232,13 @@
     PhysRegIdPtr
     lookup(const RegId& arch_reg) const
     {
-        switch (arch_reg.classValue()) {
-          case IntRegClass:
-            return intMap.lookup(arch_reg);
-
-          case FloatRegClass:
-            return  floatMap.lookup(arch_reg);
-
-          case VecRegClass:
-            return  vecMap.lookup(arch_reg);
-
-          case VecElemClass:
-            return  vecElemMap.lookup(arch_reg);
-
-          case VecPredRegClass:
-            return predMap.lookup(arch_reg);
-
-          case CCRegClass:
-            return ccMap.lookup(arch_reg);
-
-          case MiscRegClass:
+        auto reg_class = arch_reg.classValue();
+        if (reg_class == MiscRegClass) {
             // misc regs aren't really renamed, they keep the same
             // mapping throughout the execution.
             return regFile->getMiscRegId(arch_reg.index());
-
-          default:
-            panic("rename lookup(): unknown reg class %s\n",
-                  arch_reg.className());
         }
+        return renameMaps[reg_class].lookup(arch_reg);
     }

     /**
@@ -303,37 +253,17 @@
     setEntry(const RegId& arch_reg, PhysRegIdPtr phys_reg)
     {
         assert(phys_reg->is(arch_reg.classValue()));
-        switch (arch_reg.classValue()) {
-          case IntRegClass:
-            return intMap.setEntry(arch_reg, phys_reg);
-
-          case FloatRegClass:
-            return floatMap.setEntry(arch_reg, phys_reg);
-
-          case VecRegClass:
-            return vecMap.setEntry(arch_reg, phys_reg);
-
-          case VecElemClass:
-            return vecElemMap.setEntry(arch_reg, phys_reg);
-
-          case VecPredRegClass:
-            return predMap.setEntry(arch_reg, phys_reg);
-
-          case CCRegClass:
-            return ccMap.setEntry(arch_reg, phys_reg);
-
-          case MiscRegClass:
+        auto reg_class = arch_reg.classValue();
+        if (reg_class == MiscRegClass) {
             // Misc registers do not actually rename, so don't change
             // their mappings.  We end up here when a commit or squash
             // tries to update or undo a hardwired misc reg nmapping,
             // which should always be setting it to what it already is.
             assert(phys_reg == lookup(arch_reg));
             return;
-
-          default:
-            panic("rename setEntry(): unknown reg class %s\n",
-                  arch_reg.className());
         }
+
+        return renameMaps[reg_class].setEntry(arch_reg, phys_reg);
     }

     /**
@@ -345,23 +275,20 @@
     unsigned
     numFreeEntries() const
     {
-        return std::min({intMap.numFreeEntries(),
-                         floatMap.numFreeEntries(),
-                         vecMap.numFreeEntries(),
-                         vecElemMap.numFreeEntries(),
-                         predMap.numFreeEntries()});
+        auto min_free = std::numeric_limits<unsigned>::max();
+        for (auto &map: renameMaps) {
+            // If this map isn't empty (not used)...
+            if (map.numArchRegs())
+                min_free = std::min(min_free, map.numFreeEntries());
+        }
+        return min_free;
     }

-    unsigned numFreeIntEntries() const { return intMap.numFreeEntries(); }
- unsigned numFreeFloatEntries() const { return floatMap.numFreeEntries(); }
-    unsigned numFreeVecEntries() const { return vecMap.numFreeEntries(); }
     unsigned
-    numFreeVecElemEntries() const
+    numFreeEntries(RegClassType type) const
     {
-        return vecElemMap.numFreeEntries();
+        return renameMaps[type].numFreeEntries();
     }
- unsigned numFreePredEntries() const { return predMap.numFreeEntries(); }
-    unsigned numFreeCCEntries() const { return ccMap.numFreeEntries(); }

     /**
      * Return whether there are enough registers to serve the request.

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49715
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: I3ae1d6ecb103d2b877aba36050cd7b148742b503
Gerrit-Change-Number: 49715
Gerrit-PatchSet: 56
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-Reviewer: Gabe Black <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
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