From 7216fc8e2910db4ad9928944989b4a5d36e0ac86 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 24 Oct 2021 23:50:05 -0700 Subject: [PATCH] cpu-simple: Use a local temporary for the PC in preExecute. This avoids having to dynamically allocate and then free a temporary when working with the pc in preExecute. Change-Id: Ic86e23d0f0c7e786122a6024a154bb2907a6afcb Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/52071 Tested-by: kokoro Maintainer: Gabe Black Reviewed-by: Daniel Carvalho --- src/cpu/simple/base.cc | 19 ++++++++++--------- src/cpu/simple/base.hh | 5 +++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc index 0f11eb982a..48809b5a61 100644 --- a/src/cpu/simple/base.cc +++ b/src/cpu/simple/base.cc @@ -313,14 +313,15 @@ BaseSimpleCPU::preExecute() t_info.setMemAccPredicate(true); // decode the instruction - std::unique_ptr pc_state(thread->pcState().clone()); + set(preExecuteTempPC, thread->pcState()); + auto &pc_state = *preExecuteTempPC; auto &decoder = thread->decoder; - if (isRomMicroPC(pc_state->microPC())) { + if (isRomMicroPC(pc_state.microPC())) { t_info.stayAtPC = false; curStaticInst = decoder.fetchRomMicroop( - pc_state->microPC(), curMacroStaticInst); + pc_state.microPC(), curMacroStaticInst); } else if (!curMacroStaticInst) { //We're not in the middle of a macro instruction StaticInstPtr instPtr = NULL; @@ -328,16 +329,16 @@ BaseSimpleCPU::preExecute() //Predecode, ie bundle up an ExtMachInst //If more fetch data is needed, pass it in. Addr fetch_pc = - (pc_state->instAddr() & decoder.pcMask()) + t_info.fetchOffset; + (pc_state.instAddr() & decoder.pcMask()) + t_info.fetchOffset; - decoder.moreBytes(*pc_state, fetch_pc); + decoder.moreBytes(pc_state, fetch_pc); //Decode an instruction if one is ready. Otherwise, we'll have to //fetch beyond the MachInst at the current pc. - instPtr = decoder.decode(*pc_state); + instPtr = decoder.decode(pc_state); if (instPtr) { t_info.stayAtPC = false; - thread->pcState(*pc_state); + thread->pcState(pc_state); } else { t_info.stayAtPC = true; t_info.fetchOffset += decoder.moreBytesSize(); @@ -348,13 +349,13 @@ BaseSimpleCPU::preExecute() if (instPtr && instPtr->isMacroop()) { curMacroStaticInst = instPtr; curStaticInst = - curMacroStaticInst->fetchMicroop(pc_state->microPC()); + curMacroStaticInst->fetchMicroop(pc_state.microPC()); } else { curStaticInst = instPtr; } } else { //Read the next micro op from the macro op - curStaticInst = curMacroStaticInst->fetchMicroop(pc_state->microPC()); + curStaticInst = curMacroStaticInst->fetchMicroop(pc_state.microPC()); } //If we decoded an instruction this "tick", record information about it. diff --git a/src/cpu/simple/base.hh b/src/cpu/simple/base.hh index 8c84ff9944..45fd5ea969 100644 --- a/src/cpu/simple/base.hh +++ b/src/cpu/simple/base.hh @@ -42,6 +42,9 @@ #ifndef __CPU_SIMPLE_BASE_HH__ #define __CPU_SIMPLE_BASE_HH__ +#include + +#include "arch/generic/pcstate.hh" #include "base/statistics.hh" #include "cpu/base.hh" #include "cpu/checker/cpu.hh" @@ -129,6 +132,8 @@ class BaseSimpleCPU : public BaseCPU */ void traceFault(); + std::unique_ptr preExecuteTempPC; + public: void checkForInterrupts(); void setupFetchRequest(const RequestPtr &req);