arch,cpu: Use PCStateBase in buildRetPC.

Change-Id: I9d9f5b25613440737b1d67134fcae09aa68baf8b
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/52044
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:
Gabe Black
2021-10-08 02:30:25 -07:00
parent 5ad4cf0af1
commit 9d48180e4a
8 changed files with 46 additions and 35 deletions

View File

@@ -205,12 +205,13 @@ class ArmStaticInst : public StaticInst
uint64_t getEMI() const override { return machInst; }
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState retPC = callPC;
retPC.uEnd();
return retPC;
PCStateBase *ret_pc = call_pc.clone();
ret_pc->as<PCState>().uEnd();
return std::unique_ptr<PCStateBase>{ret_pc};
}
std::string generateDisassembly(

View File

@@ -64,13 +64,18 @@ output header {{
pc.as<PCState>().advance();
}
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState ret = callPC;
PCStateBase *ret_pc = call_pc.clone();
auto &ret = ret_pc->as<PCState>();
ret.advance();
ret.pc(curPC.npc());
return ret;
ret.pc(cur_pc.as<PCState>().npc());
return std::unique_ptr<PCStateBase>{ret_pc};
}
size_t

View File

@@ -74,12 +74,13 @@ class PowerStaticInst : public StaticInst
pc_state.as<PCState>().advance();
}
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState retPC = callPC;
retPC.advance();
return retPC;
PCStateBase *ret_pc = call_pc.clone();
ret_pc->as<PCState>().advance();
return std::unique_ptr<PCStateBase>{ret_pc};
}
size_t

View File

@@ -64,13 +64,15 @@ class RiscvStaticInst : public StaticInst
pc.as<PCState>().advance();
}
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState retPC = callPC;
retPC.advance();
retPC.pc(curPC.npc());
return retPC;
PCStateBase *ret_pc_ptr = call_pc.clone();
auto &ret_pc = ret_pc_ptr->as<PCState>();
ret_pc.advance();
ret_pc.pc(cur_pc.as<PCState>().npc());
return std::unique_ptr<PCStateBase>{ret_pc_ptr};
}
size_t

View File

@@ -122,13 +122,15 @@ class SparcStaticInst : public StaticInst
return simpleAsBytes(buf, size, machInst);
}
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState ret = callPC;
PCStateBase *ret_ptr = call_pc.clone();
auto &ret = ret_ptr->as<PCState>();
ret.uEnd();
ret.pc(curPC.npc());
return ret;
ret.pc(cur_pc.as<PCState>().npc());
return std::unique_ptr<PCStateBase>{ret_ptr};
}
};

View File

@@ -204,12 +204,13 @@ class X86StaticInst : public StaticInst
pcState.as<PCState>().advance();
}
PCState
buildRetPC(const PCState &curPC, const PCState &callPC) const override
std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc,
const PCStateBase &call_pc) const override
{
PCState retPC = callPC;
retPC.uEnd();
return retPC;
PCStateBase *ret_pc_ptr = call_pc.clone();
ret_pc_ptr->as<PCState>().uEnd();
return std::unique_ptr<PCStateBase>{ret_pc_ptr};
}
};

View File

@@ -180,7 +180,7 @@ BPredUnit::predict(const StaticInstPtr &inst, const InstSeqNum &seqNum,
// If it's a function return call, then look up the address
// in the RAS.
TheISA::PCState rasTop = RAS[tid].top();
target = inst->buildRetPC(pc, rasTop);
target = inst->buildRetPC(pc, rasTop)->as<TheISA::PCState>();
// Record the top entry of the RAS, and its index.
predict_record.usedRAS = true;

View File

@@ -322,9 +322,8 @@ class StaticInst : public RefCounted, public StaticInstFlags
virtual void advancePC(PCStateBase &pc_state) const = 0;
virtual TheISA::PCState
buildRetPC(const TheISA::PCState &cur_pc,
const TheISA::PCState &call_pc) const
virtual std::unique_ptr<PCStateBase>
buildRetPC(const PCStateBase &cur_pc, const PCStateBase &call_pc) const
{
panic("buildRetPC not defined!");
}