Gabe Black has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/52070 )
Change subject: arch: Implement StaticInst::advancePC(ThreadContext *) for
the ISAs.
......................................................................
arch: Implement StaticInst::advancePC(ThreadContext *) for the ISAs.
Change-Id: Icc0332eca55c38f80964e7f898ccfa35da64fdf9
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/52070
Reviewed-by: Daniel Carvalho <oda...@yahoo.com.br>
Maintainer: Gabe Black <gabe.bl...@gmail.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/arch/arm/insts/static_inst.hh
M src/arch/x86/insts/microop.hh
M src/arch/x86/insts/static_inst.hh
M src/arch/power/insts/static_inst.hh
M src/arch/mips/isa/base.isa
M src/arch/arm/insts/macromem.hh
M src/arch/riscv/insts/static_inst.cc
M src/arch/riscv/insts/static_inst.hh
M src/arch/sparc/insts/micro.hh
M src/arch/arm/insts/mem.hh
M src/arch/arm/insts/mem64.hh
M src/arch/arm/insts/pred_inst.hh
M src/arch/arm/insts/vfp.hh
M src/arch/sparc/insts/static_inst.cc
M src/arch/sparc/insts/static_inst.hh
15 files changed, 188 insertions(+), 0 deletions(-)
Approvals:
Daniel Carvalho: Looks good to me, approved
Gabe Black: Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/arch/arm/insts/macromem.hh b/src/arch/arm/insts/macromem.hh
index 1dd69ea..90f12d2 100644
--- a/src/arch/arm/insts/macromem.hh
+++ b/src/arch/arm/insts/macromem.hh
@@ -44,6 +44,7 @@
#include "arch/arm/insts/pred_inst.hh"
#include "arch/arm/pcstate.hh"
#include "arch/arm/tlb.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -87,6 +88,20 @@
apc.advance();
}
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else if (flags[IsMicroop]) {
+ pc.uAdvance();
+ } else {
+ pc.advance();
+ }
+ tc->pcState(pc);
+ }
};
class MicroOpX : public ArmStaticInst
@@ -109,6 +124,20 @@
apc.advance();
}
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else if (flags[IsMicroop]) {
+ pc.uAdvance();
+ } else {
+ pc.advance();
+ }
+ tc->pcState(pc);
+ }
};
/**
diff --git a/src/arch/arm/insts/mem.hh b/src/arch/arm/insts/mem.hh
index 4a2c8a0..d5ef424 100644
--- a/src/arch/arm/insts/mem.hh
+++ b/src/arch/arm/insts/mem.hh
@@ -43,6 +43,7 @@
#include "arch/arm/insts/pred_inst.hh"
#include "arch/arm/pcstate.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -69,6 +70,20 @@
apc.advance();
}
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else if (flags[IsMicroop]) {
+ pc.uAdvance();
+ } else {
+ pc.advance();
+ }
+ tc->pcState(pc);
+ }
};
// The address is a base register plus an immediate.
diff --git a/src/arch/arm/insts/mem64.hh b/src/arch/arm/insts/mem64.hh
index e2dd5dd..53c0527 100644
--- a/src/arch/arm/insts/mem64.hh
+++ b/src/arch/arm/insts/mem64.hh
@@ -41,6 +41,7 @@
#include "arch/arm/insts/misc64.hh"
#include "arch/arm/insts/static_inst.hh"
#include "arch/arm/pcstate.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -87,6 +88,20 @@
apc.advance();
}
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else if (flags[IsMicroop]) {
+ pc.uAdvance();
+ } else {
+ pc.advance();
+ }
+ tc->pcState(pc);
+ }
};
class Memory64 : public MightBeMicro64
diff --git a/src/arch/arm/insts/pred_inst.hh
b/src/arch/arm/insts/pred_inst.hh
index 1f62614..a4a6567 100644
--- a/src/arch/arm/insts/pred_inst.hh
+++ b/src/arch/arm/insts/pred_inst.hh
@@ -46,6 +46,7 @@
#include "base/compiler.hh"
#include "base/logging.hh"
#include "base/trace.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -400,6 +401,17 @@
else
apc.uAdvance();
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop])
+ pc.uEnd();
+ else
+ pc.uAdvance();
+ tc->pcState(pc);
+ }
};
} // namespace ArmISA
diff --git a/src/arch/arm/insts/static_inst.hh
b/src/arch/arm/insts/static_inst.hh
index e0b2ab5..290ff3c 100644
--- a/src/arch/arm/insts/static_inst.hh
+++ b/src/arch/arm/insts/static_inst.hh
@@ -52,6 +52,7 @@
#include "base/trace.hh"
#include "cpu/exec_context.hh"
#include "cpu/static_inst.hh"
+#include "cpu/thread_context.hh"
#include "sim/byteswap.hh"
#include "sim/full_system.hh"
@@ -203,6 +204,14 @@
pcState.as<PCState>().advance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+ }
+
uint64_t getEMI() const override { return machInst; }
std::unique_ptr<PCStateBase>
diff --git a/src/arch/arm/insts/vfp.hh b/src/arch/arm/insts/vfp.hh
index 76b727e..e2409ac 100644
--- a/src/arch/arm/insts/vfp.hh
+++ b/src/arch/arm/insts/vfp.hh
@@ -45,6 +45,7 @@
#include "arch/arm/insts/misc.hh"
#include "arch/arm/pcstate.hh"
#include "arch/arm/regs/misc.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -866,6 +867,20 @@
}
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else if (flags[IsMicroop]) {
+ pc.uAdvance();
+ } else {
+ pc.advance();
+ }
+ tc->pcState(pc);
+ }
+
float
fpSqrt (FPSCR fpscr,float x) const
{
diff --git a/src/arch/mips/isa/base.isa b/src/arch/mips/isa/base.isa
index cd13de2..8e9b50b 100644
--- a/src/arch/mips/isa/base.isa
+++ b/src/arch/mips/isa/base.isa
@@ -64,6 +64,14 @@
pc.as<PCState>().advance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+ }
+
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
diff --git a/src/arch/power/insts/static_inst.hh
b/src/arch/power/insts/static_inst.hh
index eaa0100..3bac77e 100644
--- a/src/arch/power/insts/static_inst.hh
+++ b/src/arch/power/insts/static_inst.hh
@@ -33,6 +33,7 @@
#include "arch/power/types.hh"
#include "base/trace.hh"
#include "cpu/static_inst.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -74,6 +75,14 @@
pc_state.as<PCState>().advance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+ }
+
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
diff --git a/src/arch/riscv/insts/static_inst.cc
b/src/arch/riscv/insts/static_inst.cc
index ee8ab43..6f6b3fe 100644
--- a/src/arch/riscv/insts/static_inst.cc
+++ b/src/arch/riscv/insts/static_inst.cc
@@ -50,5 +50,17 @@
}
}
+void
+RiscvMicroInst::advancePC(ThreadContext *tc) const
+{
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop]) {
+ pc.uEnd();
+ } else {
+ pc.uAdvance();
+ }
+ tc->pcState(pc);
+}
+
} // namespace RiscvISA
} // namespace gem5
diff --git a/src/arch/riscv/insts/static_inst.hh
b/src/arch/riscv/insts/static_inst.hh
index ed180ed..ef8032d 100644
--- a/src/arch/riscv/insts/static_inst.hh
+++ b/src/arch/riscv/insts/static_inst.hh
@@ -36,6 +36,7 @@
#include "arch/riscv/types.hh"
#include "cpu/exec_context.hh"
#include "cpu/static_inst.hh"
+#include "cpu/thread_context.hh"
#include "mem/packet.hh"
namespace gem5
@@ -64,6 +65,14 @@
pc.as<PCState>().advance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+ }
+
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
@@ -139,6 +148,7 @@
}
void advancePC(PCStateBase &pcState) const override;
+ void advancePC(ThreadContext *tc) const override;
};
} // namespace RiscvISA
diff --git a/src/arch/sparc/insts/micro.hh b/src/arch/sparc/insts/micro.hh
index b07e8c2..8526cae 100644
--- a/src/arch/sparc/insts/micro.hh
+++ b/src/arch/sparc/insts/micro.hh
@@ -109,6 +109,17 @@
else
spc.uAdvance();
}
+
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop])
+ pc.uEnd();
+ else
+ pc.uAdvance();
+ tc->pcState(pc);
+ }
};
class SparcDelayedMicroInst : public SparcMicroInst
diff --git a/src/arch/sparc/insts/static_inst.cc
b/src/arch/sparc/insts/static_inst.cc
index d6da2b0..4f544f9 100644
--- a/src/arch/sparc/insts/static_inst.cc
+++ b/src/arch/sparc/insts/static_inst.cc
@@ -86,6 +86,14 @@
}
void
+SparcStaticInst::advancePC(ThreadContext *tc) const
+{
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+}
+
+void
SparcStaticInst::printSrcReg(std::ostream &os, int reg) const
{
if (_numSrcRegs > reg)
diff --git a/src/arch/sparc/insts/static_inst.hh
b/src/arch/sparc/insts/static_inst.hh
index c5cec25..3c1b73f 100644
--- a/src/arch/sparc/insts/static_inst.hh
+++ b/src/arch/sparc/insts/static_inst.hh
@@ -37,6 +37,7 @@
#include "base/trace.hh"
#include "cpu/exec_context.hh"
#include "cpu/static_inst.hh"
+#include "cpu/thread_context.hh"
namespace gem5
{
@@ -112,6 +113,7 @@
const RegId *indexArray, int num) const;
void advancePC(PCStateBase &pcState) const override;
+ void advancePC(ThreadContext *tc) const override;
static bool passesFpCondition(uint32_t fcc, uint32_t condition);
static bool passesCondition(uint32_t codes, uint32_t condition);
diff --git a/src/arch/x86/insts/microop.hh b/src/arch/x86/insts/microop.hh
index 5fa0e37..9cbdec8 100644
--- a/src/arch/x86/insts/microop.hh
+++ b/src/arch/x86/insts/microop.hh
@@ -142,6 +142,17 @@
xpc.uAdvance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ if (flags[IsLastMicroop])
+ pc.uEnd();
+ else
+ pc.uAdvance();
+ tc->pcState(pc);
+ }
+
std::unique_ptr<PCStateBase> branchTarget(
const PCStateBase &branch_pc) const override;
diff --git a/src/arch/x86/insts/static_inst.hh
b/src/arch/x86/insts/static_inst.hh
index d890904..176fc3d 100644
--- a/src/arch/x86/insts/static_inst.hh
+++ b/src/arch/x86/insts/static_inst.hh
@@ -42,6 +42,7 @@
#include "arch/x86/types.hh"
#include "base/trace.hh"
#include "cpu/static_inst.hh"
+#include "cpu/thread_context.hh"
#include "debug/X86.hh"
namespace gem5
@@ -204,6 +205,14 @@
pcState.as<PCState>().advance();
}
+ void
+ advancePC(ThreadContext *tc) const override
+ {
+ PCState pc = tc->pcState().as<PCState>();
+ pc.advance();
+ tc->pcState(pc);
+ }
+
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/52070
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: Icc0332eca55c38f80964e7f898ccfa35da64fdf9
Gerrit-Change-Number: 52070
Gerrit-PatchSet: 19
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Daniel Carvalho <oda...@yahoo.com.br>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.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