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

Change subject: arch-riscv: Revamp float regs.
......................................................................

arch-riscv: Revamp float regs.

Change-Id: I6bb7a4f78e59082c3f783a5d4c2cb79f9c6df61f
---
M src/arch/riscv/isa.cc
M src/arch/riscv/regs/float.hh
M src/arch/riscv/remote_gdb.cc
M src/arch/riscv/remote_gdb.hh
M src/arch/riscv/utility.hh
5 files changed, 97 insertions(+), 12 deletions(-)



diff --git a/src/arch/riscv/isa.cc b/src/arch/riscv/isa.cc
index 5d920a5..bcecdc1 100644
--- a/src/arch/riscv/isa.cc
+++ b/src/arch/riscv/isa.cc
@@ -188,7 +188,7 @@
 ISA::ISA(const Params &p) : BaseISA(p)
 {
     _regClasses.emplace_back(int_reg::NumRegs, debug::IntRegs);
-    _regClasses.emplace_back(NumFloatRegs, debug::FloatRegs);
+    _regClasses.emplace_back(float_reg::NumRegs, debug::FloatRegs);
     _regClasses.emplace_back(1, debug::IntRegs); // Not applicable to RISCV
     _regClasses.emplace_back(2, debug::IntRegs); // Not applicable to RISCV
     _regClasses.emplace_back(1, debug::IntRegs); // Not applicable to RISCV
@@ -209,8 +209,10 @@
     }

     // Second loop through the float registers.
-    for (int i = 0; i < NumFloatRegs; ++i)
-        tc->setFloatReg(i, src->readFloatReg(i));
+    for (int i = 0; i < float_reg::NumRegs; ++i) {
+        RegId reg(FloatRegClass, i);
+        tc->setReg(reg, src->getReg(reg));
+    }

     // Lastly copy PC/NPC
     tc->pcState(src->pcState());
diff --git a/src/arch/riscv/regs/float.hh b/src/arch/riscv/regs/float.hh
index 37b94e2..531914a 100644
--- a/src/arch/riscv/regs/float.hh
+++ b/src/arch/riscv/regs/float.hh
@@ -54,6 +54,7 @@
 #include <vector>

 #include "base/bitfield.hh"
+#include "cpu/reg_class.hh"

 namespace gem5
 {
@@ -90,9 +91,90 @@
 static constexpr freg_t freg(float64_t f) { return f; }
 static constexpr freg_t freg(uint_fast16_t f) { return {f}; }

-const int NumFloatRegs = 32;
+namespace float_reg
+{

-const std::vector<std::string> FloatRegNames = {
+enum : RegIndex
+{
+    _Ft0Idx,
+    _Ft1Idx,
+    _Ft2Idx,
+    _Ft3Idx,
+    _Ft4Idx,
+    _Ft5Idx,
+    _Ft6Idx,
+    _Ft7Idx,
+
+    _Fs0Idx,
+    _Fs1Idx,
+
+    _Fa0Idx,
+    _Fa1Idx,
+    _Fa2Idx,
+    _Fa3Idx,
+    _Fa4Idx,
+    _Fa5Idx,
+    _Fa6Idx,
+    _Fa7Idx,
+
+    _Fs2Idx,
+    _Fs3Idx,
+    _Fs4Idx,
+    _Fs5Idx,
+    _Fs6Idx,
+    _Fs7Idx,
+    _Fs8Idx,
+    _Fs9Idx,
+    _Fs10Idx,
+    _Fs11Idx,
+
+    _Ft8Idx,
+    _Ft9Idx,
+    _Ft10Idx,
+    _Ft11Idx,
+
+    NumRegs
+};
+
+inline constexpr RegId
+    Ft0(FloatRegClass, _Ft0Idx),
+    Ft1(FloatRegClass, _Ft1Idx),
+    Ft2(FloatRegClass, _Ft2Idx),
+    Ft3(FloatRegClass, _Ft3Idx),
+    Ft4(FloatRegClass, _Ft4Idx),
+    Ft5(FloatRegClass, _Ft5Idx),
+    Ft6(FloatRegClass, _Ft6Idx),
+    Ft7(FloatRegClass, _Ft7Idx),
+
+    Fs0(FloatRegClass, _Fs0Idx),
+    Fs1(FloatRegClass, _Fs1Idx),
+
+    Fa0(FloatRegClass, _Fa0Idx),
+    Fa1(FloatRegClass, _Fa1Idx),
+    Fa2(FloatRegClass, _Fa2Idx),
+    Fa3(FloatRegClass, _Fa3Idx),
+    Fa4(FloatRegClass, _Fa4Idx),
+    Fa5(FloatRegClass, _Fa5Idx),
+    Fa6(FloatRegClass, _Fa6Idx),
+    Fa7(FloatRegClass, _Fa7Idx),
+
+    Fs2(FloatRegClass, _Fs2Idx),
+    Fs3(FloatRegClass, _Fs3Idx),
+    Fs4(FloatRegClass, _Fs4Idx),
+    Fs5(FloatRegClass, _Fs5Idx),
+    Fs6(FloatRegClass, _Fs6Idx),
+    Fs7(FloatRegClass, _Fs7Idx),
+    Fs8(FloatRegClass, _Fs8Idx),
+    Fs9(FloatRegClass, _Fs9Idx),
+    Fs10(FloatRegClass, _Fs10Idx),
+    Fs11(FloatRegClass, _Fs11Idx),
+
+    Ft8(FloatRegClass, _Ft8Idx),
+    Ft9(FloatRegClass, _Ft9Idx),
+    Ft10(FloatRegClass, _Ft10Idx),
+    Ft11(FloatRegClass, _Ft11Idx);
+
+const std::vector<std::string> RegNames = {
     "ft0", "ft1", "ft2", "ft3",
     "ft4", "ft5", "ft6", "ft7",
     "fs0", "fs1", "fa0", "fa1",
@@ -103,6 +185,7 @@
     "ft8", "ft9", "ft10", "ft11"
 };

+} // namespace float_reg
 } // namespace RiscvISA
 } // namespace gem5

diff --git a/src/arch/riscv/remote_gdb.cc b/src/arch/riscv/remote_gdb.cc
index e730060..dc4421f 100644
--- a/src/arch/riscv/remote_gdb.cc
+++ b/src/arch/riscv/remote_gdb.cc
@@ -197,8 +197,8 @@
     r.pc = context->pcState().pc();

     // Floating point registers
-    for (int i = 0; i < NumFloatRegs; i++)
-        r.fpu[i] = context->readFloatReg(i);
+    for (int i = 0; i < float_reg::NumRegs; i++)
+        r.fpu[i] = context->getReg(RegId(FloatRegClass, i));
     r.fflags = context->readMiscRegNoEffect(
         CSRData.at(CSR_FFLAGS).physIndex) & CSRMasks.at(CSR_FFLAGS);
     r.frm = context->readMiscRegNoEffect(
@@ -307,8 +307,8 @@
     context->pcState(r.pc);

     // Floating point registers
-    for (int i = 0; i < NumFloatRegs; i++)
-        context->setFloatReg(i, r.fpu[i]);
+    for (int i = 0; i < float_reg::NumRegs; i++)
+        context->setReg(RegId(FloatRegClass, i), r.fpu[i]);

     oldVal = context->readMiscRegNoEffect(
         CSRData.at(CSR_FFLAGS).physIndex);
diff --git a/src/arch/riscv/remote_gdb.hh b/src/arch/riscv/remote_gdb.hh
index fab945f..ec8d62a 100644
--- a/src/arch/riscv/remote_gdb.hh
+++ b/src/arch/riscv/remote_gdb.hh
@@ -74,7 +74,7 @@
         {
             uint64_t gpr[int_reg::NumArchRegs];
             uint64_t pc;
-            uint64_t fpu[NumFloatRegs];
+            uint64_t fpu[float_reg::NumRegs];
             uint32_t fflags;
             uint32_t frm;
             uint32_t fcsr;
diff --git a/src/arch/riscv/utility.hh b/src/arch/riscv/utility.hh
index 7ccbad0..8899288 100644
--- a/src/arch/riscv/utility.hh
+++ b/src/arch/riscv/utility.hh
@@ -122,12 +122,12 @@
         }
         return int_reg::RegNames[reg.index()];
     } else {
-        if (reg.index() >= NumFloatRegs) {
+        if (reg.index() >= float_reg::NumRegs) {
             std::stringstream str;
             str << "?? (f" << reg.index() << ')';
             return str.str();
         }
-        return FloatRegNames[reg.index()];
+        return float_reg::RegNames[reg.index()];
     }
 }


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