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

Change subject: cpu: constexpr most of RegId's methods, and add a RegIndex operator.
......................................................................

cpu: constexpr most of RegId's methods, and add a RegIndex operator.

That will let a RegId be used where a RegId is required, but also let it
be downconverted into a scalar RegIndex if using an older API. Note that
this does *not* let you automatically upconvert from a RegIndex into a
RegId, since there would be no way to know what class of register to
use.

Change-Id: I5fff224dce5e02959d5fc3e717014bf7eaa9c022
---
M src/cpu/reg_class.hh
1 file changed, 33 insertions(+), 16 deletions(-)



diff --git a/src/cpu/reg_class.hh b/src/cpu/reg_class.hh
index 5a7a124..8eb325d 100644
--- a/src/cpu/reg_class.hh
+++ b/src/cpu/reg_class.hh
@@ -93,22 +93,22 @@
     const debug::Flag &debugFlag;

   public:
-    RegClass(size_t new_size, const debug::Flag &debug_flag,
+    constexpr RegClass(size_t new_size, const debug::Flag &debug_flag,
             size_t reg_bytes=sizeof(RegVal)) :
_size(new_size), _regBytes(reg_bytes), _regShift(ceilLog2(reg_bytes)),
         debugFlag(debug_flag)
     {}
-    RegClass(size_t new_size, RegClassOps &new_ops,
+    constexpr RegClass(size_t new_size, RegClassOps &new_ops,
const debug::Flag &debug_flag, size_t reg_bytes=sizeof(RegVal)) :
         RegClass(new_size, debug_flag, reg_bytes)
     {
         _ops = &new_ops;
     }

-    size_t size() const { return _size; }
-    size_t regBytes() const { return _regBytes; }
-    size_t regShift() const { return _regShift; }
-    const debug::Flag &debug() const { return debugFlag; }
+    constexpr size_t size() const { return _size; }
+    constexpr size_t regBytes() const { return _regBytes; }
+    constexpr size_t regShift() const { return _regShift; }
+    constexpr const debug::Flag &debug() const { return debugFlag; }

std::string regName(const RegId &id) const { return _ops->regName(id); }
     std::string
@@ -134,24 +134,33 @@
     friend struct std::hash<RegId>;

   public:
-    RegId() : RegId(InvalidRegClass, 0) {}
+    constexpr RegId() : RegId(InvalidRegClass, 0) {}

-    explicit RegId(RegClassType reg_class, RegIndex reg_idx)
+    explicit constexpr RegId(RegClassType reg_class, RegIndex reg_idx)
         : regClass(reg_class), regIdx(reg_idx), numPinnedWrites(0)
     {}

-    bool
+    constexpr operator RegIndex() const
+    {
+        return index();
+    }
+
+    constexpr bool
     operator==(const RegId& that) const
     {
         return regClass == that.classValue() && regIdx == that.index();
     }

-    bool operator!=(const RegId& that) const { return !(*this==that); }
+    constexpr bool
+    operator!=(const RegId& that) const
+    {
+        return !(*this==that);
+    }

     /** Order operator.
      * The order is required to implement maps with key type RegId
      */
-    bool
+    constexpr bool
     operator<(const RegId& that) const
     {
         return regClass < that.classValue() ||
@@ -161,23 +170,31 @@
     /**
      * Return true if this register can be renamed
      */
-    bool
+    constexpr bool
     isRenameable() const
     {
         return regClass != MiscRegClass && regClass != InvalidRegClass;
     }

     /** @return true if it is of the specified class. */
-    bool is(RegClassType reg_class) const { return regClass == reg_class; }
+    constexpr bool
+    is(RegClassType reg_class) const
+    {
+        return regClass == reg_class;
+    }

     /** Index accessors */
     /** @{ */
-    RegIndex index() const { return regIdx; }
+    constexpr RegIndex index() const { return regIdx; }

     /** Class accessor */
-    RegClassType classValue() const { return regClass; }
+    constexpr RegClassType classValue() const { return regClass; }
     /** Return a const char* with the register class name. */
-    const char* className() const { return regClassStrings[regClass]; }
+    constexpr const char*
+    className() const
+    {
+        return regClassStrings[regClass];
+    }

     int getNumPinnedWrites() const { return numPinnedWrites; }
void setNumPinnedWrites(int num_writes) { numPinnedWrites = num_writes; }

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49753
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: I5fff224dce5e02959d5fc3e717014bf7eaa9c022
Gerrit-Change-Number: 49753
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