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 <noreply+kokoro@google.com> Maintainer: Gabe Black <gabe.black@gmail.com> Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
This commit is contained in:
@@ -313,14 +313,15 @@ BaseSimpleCPU::preExecute()
|
||||
t_info.setMemAccPredicate(true);
|
||||
|
||||
// decode the instruction
|
||||
std::unique_ptr<PCStateBase> 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.
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
#ifndef __CPU_SIMPLE_BASE_HH__
|
||||
#define __CPU_SIMPLE_BASE_HH__
|
||||
|
||||
#include <memory>
|
||||
|
||||
#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<PCStateBase> preExecuteTempPC;
|
||||
|
||||
public:
|
||||
void checkForInterrupts();
|
||||
void setupFetchRequest(const RequestPtr &req);
|
||||
|
||||
Reference in New Issue
Block a user