Gabe Black has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/49109 )
Change subject: cpu: Implement getReg and setReg for O3.
......................................................................
cpu: Implement getReg and setReg for O3.
Change-Id: I3f0bf1e75a5191be98c79fede5aad854a920e9c9
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49109
Tested-by: kokoro <noreply+kok...@google.com>
Reviewed-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Maintainer: Gabe Black <gabe.bl...@gmail.com>
---
M src/cpu/o3/cpu.cc
M src/cpu/o3/cpu.hh
M src/cpu/o3/regfile.hh
M src/cpu/o3/thread_context.cc
M src/cpu/o3/thread_context.hh
M src/cpu/regfile.hh
6 files changed, 398 insertions(+), 0 deletions(-)
Approvals:
Giacomo Travaglini: Looks good to me, approved
Gabe Black: Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index e05ea92..1f0b666 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -1086,6 +1086,36 @@
}
RegVal
+CPU::getReg(PhysRegIdPtr phys_reg)
+{
+ return regFile.getReg(phys_reg);
+}
+
+void
+CPU::getReg(PhysRegIdPtr phys_reg, void *val)
+{
+ regFile.getReg(phys_reg, val);
+}
+
+void *
+CPU::getWritableReg(PhysRegIdPtr phys_reg)
+{
+ return regFile.getWritableReg(phys_reg);
+}
+
+void
+CPU::setReg(PhysRegIdPtr phys_reg, RegVal val)
+{
+ regFile.setReg(phys_reg, val);
+}
+
+void
+CPU::setReg(PhysRegIdPtr phys_reg, const void *val)
+{
+ regFile.setReg(phys_reg, val);
+}
+
+RegVal
CPU::readIntReg(PhysRegIdPtr phys_reg)
{
cpuStats.intRegfileReads++;
@@ -1185,6 +1215,131 @@
}
RegVal
+CPU::getArchReg(const RegId ®, ThreadID tid)
+{
+ switch (reg.classValue()) {
+ case IntRegClass:
+ cpuStats.intRegfileReads++;
+ break;
+ case FloatRegClass:
+ cpuStats.fpRegfileReads++;
+ break;
+ case CCRegClass:
+ cpuStats.ccRegfileReads++;
+ break;
+ case VecRegClass:
+ case VecElemClass:
+ cpuStats.vecRegfileReads++;
+ break;
+ case VecPredRegClass:
+ cpuStats.vecPredRegfileReads++;
+ break;
+ default:
+ break;
+ }
+ PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(reg);
+ return getReg(phys_reg);
+}
+
+void
+CPU::getArchReg(const RegId ®, void *val, ThreadID tid)
+{
+ switch (reg.classValue()) {
+ case IntRegClass:
+ cpuStats.intRegfileReads++;
+ break;
+ case FloatRegClass:
+ cpuStats.fpRegfileReads++;
+ break;
+ case CCRegClass:
+ cpuStats.ccRegfileReads++;
+ break;
+ case VecRegClass:
+ case VecElemClass:
+ cpuStats.vecRegfileReads++;
+ break;
+ case VecPredRegClass:
+ cpuStats.vecPredRegfileReads++;
+ break;
+ default:
+ break;
+ }
+ PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(reg);
+ getReg(phys_reg, val);
+}
+
+void *
+CPU::getWritableArchReg(const RegId ®, ThreadID tid)
+{
+ switch (reg.classValue()) {
+ case VecRegClass:
+ cpuStats.vecRegfileReads++;
+ break;
+ case VecPredRegClass:
+ cpuStats.vecPredRegfileReads++;
+ break;
+ default:
+ break;
+ }
+ PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(reg);
+ return getWritableReg(phys_reg);
+}
+
+void
+CPU::setArchReg(const RegId ®, RegVal val, ThreadID tid)
+{
+ switch (reg.classValue()) {
+ case IntRegClass:
+ cpuStats.intRegfileWrites++;
+ break;
+ case FloatRegClass:
+ cpuStats.fpRegfileWrites++;
+ break;
+ case CCRegClass:
+ cpuStats.ccRegfileWrites++;
+ break;
+ case VecRegClass:
+ case VecElemClass:
+ cpuStats.vecRegfileWrites++;
+ break;
+ case VecPredRegClass:
+ cpuStats.vecPredRegfileWrites++;
+ break;
+ default:
+ break;
+ }
+ PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(reg);
+ setReg(phys_reg, val);
+}
+
+void
+CPU::setArchReg(const RegId ®, const void *val, ThreadID tid)
+{
+ switch (reg.classValue()) {
+ case IntRegClass:
+ cpuStats.intRegfileWrites++;
+ break;
+ case FloatRegClass:
+ cpuStats.fpRegfileWrites++;
+ break;
+ case CCRegClass:
+ cpuStats.ccRegfileWrites++;
+ break;
+ case VecRegClass:
+ case VecElemClass:
+ cpuStats.vecRegfileWrites++;
+ break;
+ case VecPredRegClass:
+ cpuStats.vecPredRegfileWrites++;
+ break;
+ default:
+ break;
+ }
+ PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(reg);
+ setReg(phys_reg, val);
+}
+
+RegVal
CPU::readArchIntReg(int reg_idx, ThreadID tid)
{
PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(
diff --git a/src/cpu/o3/cpu.hh b/src/cpu/o3/cpu.hh
index 3fab0cb..5dd310f 100644
--- a/src/cpu/o3/cpu.hh
+++ b/src/cpu/o3/cpu.hh
@@ -311,6 +311,13 @@
*/
void setMiscReg(int misc_reg, RegVal val, ThreadID tid);
+ RegVal getReg(PhysRegIdPtr phys_reg);
+ void getReg(PhysRegIdPtr phys_reg, void *val);
+ void *getWritableReg(PhysRegIdPtr phys_reg);
+
+ void setReg(PhysRegIdPtr phys_reg, RegVal val);
+ void setReg(PhysRegIdPtr phys_reg, const void *val);
+
RegVal readIntReg(PhysRegIdPtr phys_reg);
RegVal readFloatReg(PhysRegIdPtr phys_reg);
@@ -344,6 +351,13 @@
void setCCReg(PhysRegIdPtr phys_reg, RegVal val);
+ RegVal getArchReg(const RegId ®, ThreadID tid);
+ void getArchReg(const RegId ®, void *val, ThreadID tid);
+ void *getWritableArchReg(const RegId ®, ThreadID tid);
+
+ void setArchReg(const RegId ®, RegVal val, ThreadID tid);
+ void setArchReg(const RegId ®, const void *val, ThreadID tid);
+
RegVal readArchIntReg(int reg_idx, ThreadID tid);
RegVal readArchFloatReg(int reg_idx, ThreadID tid);
diff --git a/src/cpu/o3/regfile.hh b/src/cpu/o3/regfile.hh
index cffa382..0ee321e 100644
--- a/src/cpu/o3/regfile.hh
+++ b/src/cpu/o3/regfile.hh
@@ -42,6 +42,7 @@
#ifndef __CPU_O3_REGFILE_HH__
#define __CPU_O3_REGFILE_HH__
+#include <cstring>
#include <vector>
#include "arch/generic/isa.hh"
@@ -177,6 +178,156 @@
return &miscRegIds[reg_idx];
}
+ RegVal
+ getReg(PhysRegIdPtr phys_reg) const
+ {
+ const RegClassType type = phys_reg->classValue();
+ const RegIndex idx = phys_reg->index();
+
+ RegVal val;
+ switch (type) {
+ case IntRegClass:
+ val = intRegFile.reg(idx);
+ DPRINTF(IEW, "RegFile: Access to int register %i, has
data %#x\n",
+ idx, val);
+ return val;
+ case FloatRegClass:
+ val = floatRegFile.reg(idx);
+ DPRINTF(IEW, "RegFile: Access to float register %i has
data %#x\n",
+ idx, val);
+ return val;
+ case VecElemClass:
+ val = vectorElemRegFile.reg(idx);
+ DPRINTF(IEW, "RegFile: Access to vector element register %i "
+ "has data %#x\n", idx, val);
+ return val;
+ case CCRegClass:
+ val = ccRegFile.reg(idx);
+ DPRINTF(IEW, "RegFile: Access to cc register %i has
data %#x\n",
+ idx, val);
+ return val;
+ default:
+ panic("Unsupported register class type %d.", type);
+ }
+ }
+
+ void
+ getReg(PhysRegIdPtr phys_reg, void *val) const
+ {
+ const RegClassType type = phys_reg->classValue();
+ const RegIndex idx = phys_reg->index();
+
+ switch (type) {
+ case IntRegClass:
+ *(RegVal *)val = getReg(phys_reg);
+ break;
+ case FloatRegClass:
+ *(RegVal *)val = getReg(phys_reg);
+ break;
+ case VecRegClass:
+ vectorRegFile.get(idx, val);
+ DPRINTF(IEW, "RegFile: Access to vector register %i, has "
+ "data %s\n", idx, *(TheISA::VecRegContainer *)val);
+ break;
+ case VecElemClass:
+ *(RegVal *)val = getReg(phys_reg);
+ break;
+ case VecPredRegClass:
+ vecPredRegFile.get(idx, val);
+ DPRINTF(IEW, "RegFile: Access to predicate register %i, has "
+ "data %s\n", idx, *(TheISA::VecRegContainer *)val);
+ break;
+ case CCRegClass:
+ *(RegVal *)val = getReg(phys_reg);
+ break;
+ default:
+ panic("Unrecognized register class type %d.", type);
+ }
+ }
+
+ void *
+ getWritableReg(PhysRegIdPtr phys_reg)
+ {
+ const RegClassType type = phys_reg->classValue();
+ const RegIndex idx = phys_reg->index();
+
+ switch (type) {
+ case VecRegClass:
+ return vectorRegFile.ptr(idx);
+ case VecPredRegClass:
+ return vecPredRegFile.ptr(idx);
+ default:
+ panic("Unrecognized register class type %d.", type);
+ }
+ }
+
+ void
+ setReg(PhysRegIdPtr phys_reg, RegVal val)
+ {
+ const RegClassType type = phys_reg->classValue();
+ const RegIndex idx = phys_reg->index();
+
+ switch (type) {
+ case IntRegClass:
+ if (phys_reg->index() != zeroReg.index())
+ intRegFile.reg(idx) = val;
+ DPRINTF(IEW, "RegFile: Setting int register %i to %#x\n",
+ idx, val);
+ break;
+ case FloatRegClass:
+ floatRegFile.reg(idx) = val;
+ DPRINTF(IEW, "RegFile: Setting float register %i to %#x\n",
+ idx, val);
+ break;
+ case VecElemClass:
+ vectorElemRegFile.reg(idx) = val;
+ DPRINTF(IEW, "RegFile: Setting vector element register %i to "
+ "%#x\n", idx, val);
+ break;
+ case CCRegClass:
+ ccRegFile.reg(idx) = val;
+ DPRINTF(IEW, "RegFile: Setting cc register %i to %#x\n",
+ idx, val);
+ break;
+ default:
+ panic("Unsupported register class type %d.", type);
+ }
+ }
+
+ void
+ setReg(PhysRegIdPtr phys_reg, const void *val)
+ {
+ const RegClassType type = phys_reg->classValue();
+ const RegIndex idx = phys_reg->index();
+
+ switch (type) {
+ case IntRegClass:
+ setReg(phys_reg, *(RegVal *)val);
+ break;
+ case FloatRegClass:
+ setReg(phys_reg, *(RegVal *)val);
+ break;
+ case VecRegClass:
+ DPRINTF(IEW, "RegFile: Setting vector register %i to %s\n",
+ idx, *(TheISA::VecRegContainer *)val);
+ vectorRegFile.set(idx, val);
+ break;
+ case VecElemClass:
+ setReg(phys_reg, *(RegVal *)val);
+ break;
+ case VecPredRegClass:
+ DPRINTF(IEW, "RegFile: Setting predicate register %i to %s\n",
+ idx, *(TheISA::VecRegContainer *)val);
+ vecPredRegFile.set(idx, val);
+ break;
+ case CCRegClass:
+ setReg(phys_reg, *(RegVal *)val);
+ break;
+ default:
+ panic("Unrecognized register class type %d.", type);
+ }
+ }
+
/** Reads an integer register. */
RegVal
readIntReg(PhysRegIdPtr phys_reg) const
diff --git a/src/cpu/o3/thread_context.cc b/src/cpu/o3/thread_context.cc
index c22229f..dda0f04 100644
--- a/src/cpu/o3/thread_context.cc
+++ b/src/cpu/o3/thread_context.cc
@@ -197,6 +197,38 @@
return cpu->readArchCCReg(reg_idx, thread->threadId());
}
+RegVal
+ThreadContext::getRegFlat(const RegId ®) const
+{
+ return cpu->getArchReg(reg, thread->threadId());
+}
+
+void *
+ThreadContext::getWritableRegFlat(const RegId ®)
+{
+ return cpu->getWritableArchReg(reg, thread->threadId());
+}
+
+void
+ThreadContext::getRegFlat(const RegId ®, void *val) const
+{
+ cpu->getArchReg(reg, val, thread->threadId());
+}
+
+void
+ThreadContext::setRegFlat(const RegId ®, RegVal val)
+{
+ cpu->setArchReg(reg, val, thread->threadId());
+ conditionalSquash();
+}
+
+void
+ThreadContext::setRegFlat(const RegId ®, const void *val)
+{
+ cpu->setArchReg(reg, val, thread->threadId());
+ conditionalSquash();
+}
+
void
ThreadContext::setIntRegFlat(RegIndex reg_idx, RegVal val)
{
diff --git a/src/cpu/o3/thread_context.hh b/src/cpu/o3/thread_context.hh
index 86149ee..605f4cc 100644
--- a/src/cpu/o3/thread_context.hh
+++ b/src/cpu/o3/thread_context.hh
@@ -333,6 +333,13 @@
cpu->squashFromTC(thread->threadId());
}
+ RegVal getRegFlat(const RegId ®) const override;
+ void getRegFlat(const RegId ®, void *val) const override;
+ void *getWritableRegFlat(const RegId ®) override;
+
+ void setRegFlat(const RegId ®, RegVal val) override;
+ void setRegFlat(const RegId ®, const void *val) override;
+
RegVal readIntRegFlat(RegIndex idx) const override;
void setIntRegFlat(RegIndex idx, RegVal val) override;
diff --git a/src/cpu/regfile.hh b/src/cpu/regfile.hh
index 22a15d6..42fe59c 100644
--- a/src/cpu/regfile.hh
+++ b/src/cpu/regfile.hh
@@ -28,7 +28,9 @@
#ifndef __CPU_REGFILE_HH__
#define __CPU_REGFILE_HH__
+#include <algorithm>
#include <cassert>
+#include <cstring>
#include <vector>
#include "cpu/reg_class.hh"
@@ -72,6 +74,30 @@
data.data() + (idx << _regShift));
}
+ void *
+ ptr(size_t idx)
+ {
+ return data.data() + (idx << _regShift);
+ }
+
+ const void *
+ ptr(size_t idx) const
+ {
+ return data.data() + (idx << _regShift);
+ }
+
+ void
+ get(size_t idx, void *val) const
+ {
+ std::memcpy(val, ptr(idx), _regBytes);
+ }
+
+ void
+ set(size_t idx, const void *val)
+ {
+ std::memcpy(ptr(idx), val, _regBytes);
+ }
+
void clear() { std::fill(data.begin(), data.end(), 0); }
};
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49109
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: I3f0bf1e75a5191be98c79fede5aad854a920e9c9
Gerrit-Change-Number: 49109
Gerrit-PatchSet: 43
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Jason Lowe-Power <ja...@lowepower.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
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