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

Change subject: cpu,arm: Add a method to RegClass-es to print register values.
......................................................................

cpu,arm: Add a method to RegClass-es to print register values.

This further abstracts the properties of registers so they can be
removed from the CPUs.

Change-Id: I2aa1bffe8b095a0301579e60270965c611d6db4e
---
M src/arch/arm/isa.cc
M src/cpu/reg_class.cc
M src/cpu/reg_class.hh
3 files changed, 85 insertions(+), 26 deletions(-)



diff --git a/src/arch/arm/isa.cc b/src/arch/arm/isa.cc
index acf5083..18359b0 100644
--- a/src/arch/arm/isa.cc
+++ b/src/arch/arm/isa.cc
@@ -75,7 +75,7 @@
     }
 } miscRegClassOps;

-VecElemRegClassOps vecRegElemClassOps(NumVecElemPerVecReg);
+VecElemRegClassOps<ArmISA::VecElem> vecRegElemClassOps(NumVecElemPerVecReg);

 ISA::ISA(const Params &p) : BaseISA(p), system(NULL),
     _decoderFlavor(p.decoderFlavor), pmu(p.pmu), impdefAsNop(p.impdef_nop),
@@ -84,7 +84,7 @@
     _regClasses.emplace_back(NUM_INTREGS, INTREG_ZERO);
     _regClasses.emplace_back(0);
     _regClasses.emplace_back(NumVecRegs, -1, sizeof(VecRegContainer));
-    _regClasses.emplace_back(NumVecRegs * TheISA::NumVecElemPerVecReg,
+    _regClasses.emplace_back(NumVecRegs * ArmISA::NumVecElemPerVecReg,
             vecRegElemClassOps);
_regClasses.emplace_back(NumVecPredRegs, -1, sizeof(VecPredRegContainer));
     _regClasses.emplace_back(NUM_CCREGS);
diff --git a/src/cpu/reg_class.cc b/src/cpu/reg_class.cc
index b667838..57a489a 100644
--- a/src/cpu/reg_class.cc
+++ b/src/cpu/reg_class.cc
@@ -39,23 +39,61 @@
  */

 #include "cpu/reg_class.hh"
+
+#include <sstream>
+
 #include "base/cprintf.hh"

 namespace gem5
 {

 std::string
-DefaultRegClassOps::regName(const RegId &id) const
+RegClassOps::regName(const RegId &id) const
 {
     return csprintf("r%d", id.index());
 }

 std::string
-VecElemRegClassOps::regName(const RegId &id) const
+RegClassOps::valString(const void *val, size_t size) const
 {
-    RegIndex reg_idx = id.index() / elemsPerVec;
-    RegIndex elem_idx = id.index() % elemsPerVec;
-    return csprintf("v%d[%d]", reg_idx, elem_idx);
+    // If this is just a RegVal, or could be interpreted as one, print it
+    // that way.
+    if (size == sizeof(uint64_t))
+        return csprintf("%s", *(const uint64_t *)val);
+    else if (size == sizeof(uint32_t))
+        return csprintf("%s", *(const uint32_t *)val);
+    else if (size == sizeof(uint16_t))
+        return csprintf("%s", *(const uint16_t *)val);
+    else if (size == sizeof(uint8_t))
+        return csprintf("%s", *(const uint8_t *)val);
+
+ // Otherwise, print it as a sequence of bytes, 4 in a chunk, separated by
+    // spaces, and all surrounded by []s.
+
+    std::stringstream out;
+    ccprintf(out, "[");
+
+    constexpr size_t chunk_size = 4;
+    const uint8_t *bytes = (const uint8_t *)val;
+
+    while (size >= chunk_size) {
+        size -= chunk_size;
+        if (size) {
+            ccprintf(out, "%2x%2x%2x%2x ", bytes[0], bytes[1], bytes[2],
+                    bytes[3]);
+        } else {
+            ccprintf(out, "%2x%2x%2x%2x", bytes[0], bytes[1], bytes[2],
+                    bytes[3]);
+        }
+        bytes += chunk_size;
+    }
+
+    while (size--)
+        ccprintf(out, "%2x", *bytes++);
+
+    ccprintf(out, "]");
+
+    return out.str();
 }

 const char *RegId::regClassStrings[] = {
diff --git a/src/cpu/reg_class.hh b/src/cpu/reg_class.hh
index aa37e8d..a405cf6 100644
--- a/src/cpu/reg_class.hh
+++ b/src/cpu/reg_class.hh
@@ -41,9 +41,11 @@
 #ifndef __CPU__REG_CLASS_HH__
 #define __CPU__REG_CLASS_HH__

+#include <any>
 #include <cstddef>
 #include <string>

+#include "base/cprintf.hh"
 #include "base/intmath.hh"
 #include "base/types.hh"

@@ -69,24 +71,8 @@
 class RegClassOps
 {
   public:
-    virtual std::string regName(const RegId &id) const = 0;
-};
-
-class DefaultRegClassOps : public RegClassOps
-{
-  public:
-    std::string regName(const RegId &id) const override;
-};
-
-class VecElemRegClassOps : public RegClassOps
-{
-  protected:
-    size_t elemsPerVec;
-
-  public:
- VecElemRegClassOps(size_t elems_per_vec) : elemsPerVec(elems_per_vec) {}
-
-    std::string regName(const RegId &id) const override;
+    virtual std::string regName(const RegId &id) const;
+    virtual std::string valString(const void *val, size_t size) const;
 };

 class RegClass
@@ -100,7 +86,7 @@
     // be calculated with a multiply.
     size_t _regShift;

-    static inline DefaultRegClassOps defaultOps;
+    static inline RegClassOps defaultOps;
     RegClassOps *_ops = &defaultOps;

   public:
@@ -122,6 +108,11 @@
     size_t regShift() const { return _regShift; }

std::string regName(const RegId &id) const { return _ops->regName(id); }
+    std::string
+    valString(const void *val) const
+    {
+        return _ops->valString(val, size());
+    }
 };

/** Register ID: describe an architectural register with its class and index.
@@ -195,6 +186,36 @@
     }
 };

+template <typename ValueType>
+class TypedRegClassOps : public RegClassOps
+{
+  public:
+    std::string
+    valString(const void *val, size_t size) const override
+    {
+        assert(size == sizeof(ValueType));
+        return csprintf("%s", *(const ValueType *)val);
+    }
+};
+
+template <typename ValueType>
+class VecElemRegClassOps : public TypedRegClassOps<ValueType>
+{
+  protected:
+    size_t elemsPerVec;
+
+  public:
+ VecElemRegClassOps(size_t elems_per_vec) : elemsPerVec(elems_per_vec) {}
+
+    std::string
+    regName(const RegId &id) const override
+    {
+        RegIndex reg_idx = id.index() / elemsPerVec;
+        RegIndex elem_idx = id.index() % elemsPerVec;
+        return csprintf("v%d[%d]", reg_idx, elem_idx);
+    }
+};
+
 /** Physical register ID.
  * Like a register ID but physical. The inheritance is private because the
  * only relationship between this types is functional, and it is done to

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