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

Change subject: cpu: Implement (get|set)Reg(Flat|) for SimpleThread.
......................................................................

cpu: Implement (get|set)Reg(Flat|) for SimpleThread.

Change-Id: Iddda31746606865d746df98e9e6d5adfa7266745
---
M src/cpu/simple_thread.hh
1 file changed, 301 insertions(+), 0 deletions(-)



diff --git a/src/cpu/simple_thread.hh b/src/cpu/simple_thread.hh
index 97bd21a..650a4be 100644
--- a/src/cpu/simple_thread.hh
+++ b/src/cpu/simple_thread.hh
@@ -129,6 +129,18 @@
                     data.data() + (idx << _regShift));
         }

+        void
+        get(size_t idx, void *val) const
+        {
+            std::memcpy(val, data.data() + (idx << _regShift), _regBytes);
+        }
+
+        void
+        set(size_t idx, const void *val)
+        {
+            std::memcpy(data.data() + (idx << _regShift), val, _regBytes);
+        }
+
         void clear() { std::fill(data.begin(), data.end(), 0); }
     };

@@ -518,6 +530,295 @@
     }

     RegVal
+    getReg(const RegId &arch_reg) const override
+    {
+        const RegId reg = flattenRegId(arch_reg);
+
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+        const RegIndex arch_idx = arch_reg.index();
+
+        RegVal val;
+        switch (type) {
+          case IntRegClass:
+            assert(idx < intRegs.size());
+            val = intRegs.reg(idx);
+            DPRINTF(IntRegs, "Reading int reg %d (%d) as %#x.\n",
+                    arch_idx, idx, val);
+            return val;
+          case FloatRegClass:
+            assert(idx < floatRegs.size());
+            val = floatRegs.reg(idx);
+            DPRINTF(FloatRegs, "Reading float reg %d (%d) as %#x.\n",
+                    arch_idx, idx, val);
+            return val;
+          case CCRegClass:
+            assert(idx < ccRegs.size());
+            val = ccRegs.reg(idx);
+            DPRINTF(CCRegs, "Reading cc reg %d (%d) as %#x.\n",
+                    arch_idx, idx, val);
+            return val;
+          default:
+            panic("Unsupported register class type %d.", type);
+        }
+    }
+
+    RegVal
+    getRegFlat(const RegId &reg) const override
+    {
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+
+        RegVal val;
+        switch (type) {
+          case IntRegClass:
+            assert(idx < intRegs.size());
+            val = intRegs.reg(idx);
+            DPRINTF(IntRegs, "Reading int reg %d as %#x.\n", idx, val);
+            return val;
+          case FloatRegClass:
+            assert(idx < floatRegs.size());
+            val = floatRegs.reg(idx);
+            DPRINTF(FloatRegs, "Reading float reg %d as %#x.\n", idx, val);
+            return val;
+          case CCRegClass:
+            assert(idx < ccRegs.size());
+            val = ccRegs.reg(idx);
+            DPRINTF(CCRegs, "Reading cc reg %d as %#x.\n", idx, val);
+            return val;
+          default:
+            panic("Unsupported register class type %d.", type);
+        }
+    }
+
+    void
+    getReg(const RegId &arch_reg, void *val) const override
+    {
+        const RegId reg = flattenRegId(arch_reg);
+
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+        const RegIndex arch_idx = arch_reg.index();
+
+        switch (type) {
+          case IntRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case FloatRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case VecRegClass:
+            vecRegs.get(idx, val);
+            DPRINTF(VecRegs, "Reading vector register %d (%d) as %s.\n",
+                    arch_idx, idx, *(TheISA::VecRegContainer *)val);
+            break;
+          case VecPredRegClass:
+            vecPredRegs.get(idx, val);
+ DPRINTF(VecPredRegs, "Reading predicate register %d (%d) as %s.\n",
+                    arch_idx, idx, *(TheISA::VecRegContainer *)val);
+            break;
+          case CCRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case VecElemClass:
+            {
+                auto ret = vecRegs.reg<TheISA::VecRegContainer>(idx).
+                    as<TheISA::VecElem>();
+                const TheISA::VecElem &elem = ret[reg.elemIndex()];
+                DPRINTF(VecRegs, "Reading element %d of vector register "
+                        "%d (%d) as %s.\n",
+                        reg.elemIndex(), arch_idx, idx, elem);
+                memcpy(val, &elem, sizeof(elem));
+            }
+            break;
+          default:
+            panic("Unrecognized register class type %d.", type);
+        }
+    }
+
+    void
+    getRegFlat(const RegId &reg, void *val) const override
+    {
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+
+        switch (type) {
+          case IntRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case FloatRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case VecRegClass:
+            vecRegs.get(idx, val);
+            DPRINTF(VecRegs, "Reading vector register %d as %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            break;
+          case VecPredRegClass:
+            vecPredRegs.get(idx, val);
+            DPRINTF(VecPredRegs, "Reading predicate register %d as %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            break;
+          case CCRegClass:
+            *(RegVal *)val = getRegFlat(reg);
+            break;
+          case VecElemClass:
+            {
+                auto ret = vecRegs.reg<TheISA::VecRegContainer>(idx).
+                    as<TheISA::VecElem>();
+                const TheISA::VecElem &elem = ret[reg.elemIndex()];
+                DPRINTF(VecRegs,
+ "Reading element %d of vector register %d as %s.\n",
+                        reg.elemIndex(), idx, elem);
+                memcpy(val, &elem, sizeof(elem));
+            }
+            break;
+          default:
+            panic("Unrecognized register class type %d.", type);
+        }
+    }
+
+    void
+    setReg(const RegId &arch_reg, RegVal val) override
+    {
+        const RegId reg = flattenRegId(arch_reg);
+
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+        const RegIndex arch_idx = arch_reg.index();
+
+        switch (type) {
+          case IntRegClass:
+            DPRINTF(IntRegs, "Setting int register %d (%d) to %#x.\n",
+                    arch_idx, idx, val);
+            intRegs.reg(idx) = val;
+            break;
+          case FloatRegClass:
+            DPRINTF(FloatRegs, "Setting float register %d (%d) to %#x.\n",
+                    arch_idx, idx, val);
+            floatRegs.reg(idx) = val;
+            break;
+          case CCRegClass:
+            DPRINTF(CCRegs, "Setting cc register %d (%d) to %#x.\n",
+                    arch_idx, idx, val);
+            ccRegs.reg(idx) = val;
+            break;
+          default:
+            panic("Unsupported register class type %d.", type);
+        }
+    }
+
+    void
+    setRegFlat(const RegId &reg, RegVal val) override
+    {
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+
+        switch (type) {
+          case IntRegClass:
+ DPRINTF(IntRegs, "Setting int register %d to %#x.\n", idx, val);
+            intRegs.reg(idx) = val;
+            break;
+          case FloatRegClass:
+            DPRINTF(FloatRegs, "Setting float register %d to %#x.\n",
+                    idx, val);
+            floatRegs.reg(idx) = val;
+            break;
+          case CCRegClass:
+            DPRINTF(CCRegs, "Setting cc register %d to %#x.\n", idx, val);
+            ccRegs.reg(idx) = val;
+            break;
+          default:
+            panic("Unsupported register class type %d.", type);
+        }
+    }
+
+    void
+    setReg(const RegId &arch_reg, const void *val) override
+    {
+        const RegId reg = flattenRegId(arch_reg);
+
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+        const RegIndex arch_idx = arch_reg.index();
+
+        switch (type) {
+          case IntRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case FloatRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case VecRegClass:
+            DPRINTF(VecRegs, "Setting vector register %d (%d) to %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            vecRegs.set(idx, val);
+            break;
+          case VecPredRegClass:
+ DPRINTF(VecPredRegs, "Setting predicate register %d (%d) to %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            vecPredRegs.set(idx, val);
+            break;
+          case CCRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case VecElemClass:
+            {
+                const auto &elem = *(const TheISA::VecElem *)val;
+                DPRINTF(VecRegs, "Setting element %d of vector register "
+                        "%d (%d) to %s.\n",
+                        reg.elemIndex(), arch_idx, idx, elem);
+                vecRegs.reg<TheISA::VecRegContainer>(idx).
+                    as<TheISA::VecElem>()[reg.elemIndex()] = elem;
+            }
+            break;
+          default:
+            panic("Unrecognized register class type %d.", type);
+        }
+    }
+
+    void
+    setRegFlat(const RegId &reg, const void *val) override
+    {
+        const RegClassType type = reg.classValue();
+        const RegIndex idx = reg.index();
+
+        switch (type) {
+          case IntRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case FloatRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case VecRegClass:
+            DPRINTF(VecRegs, "Setting vector register %d to %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            vecRegs.set(idx, val);
+            break;
+          case VecPredRegClass:
+            DPRINTF(VecPredRegs, "Setting predicate register %d to %s.\n",
+                    idx, *(TheISA::VecRegContainer *)val);
+            vecPredRegs.set(idx, val);
+            break;
+          case CCRegClass:
+            setRegFlat(reg, *(RegVal *)val);
+            break;
+          case VecElemClass:
+            {
+                const auto &elem = *(const TheISA::VecElem *)val;
+                DPRINTF(VecRegs,
+ "Setting element %d of vector register %d to %s.\n",
+                        reg.elemIndex(), idx, elem);
+                vecRegs.reg<TheISA::VecRegContainer>(idx).
+                    as<TheISA::VecElem>()[reg.elemIndex()] = elem;
+            }
+            break;
+          default:
+            panic("Unrecognized register class type %d.", type);
+        }
+    }
+
+    RegVal
     readIntRegFlat(RegIndex idx) const override
     {
         return intRegs.reg(idx);

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49110
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: Iddda31746606865d746df98e9e6d5adfa7266745
Gerrit-Change-Number: 49110
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
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