From 9d48180e4aa71676bd169c6f8b3dadf4fd1d39dd Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 8 Oct 2021 02:30:25 -0700 Subject: [PATCH] arch,cpu: Use PCStateBase in buildRetPC. Change-Id: I9d9f5b25613440737b1d67134fcae09aa68baf8b Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/52044 Tested-by: kokoro Maintainer: Gabe Black Reviewed-by: Daniel Carvalho --- src/arch/arm/insts/static_inst.hh | 11 ++++++----- src/arch/mips/isa/base.isa | 15 ++++++++++----- src/arch/power/insts/static_inst.hh | 11 ++++++----- src/arch/riscv/insts/static_inst.hh | 14 ++++++++------ src/arch/sparc/insts/static_inst.hh | 12 +++++++----- src/arch/x86/insts/static_inst.hh | 11 ++++++----- src/cpu/pred/bpred_unit.cc | 2 +- src/cpu/static_inst.hh | 5 ++--- 8 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/arch/arm/insts/static_inst.hh b/src/arch/arm/insts/static_inst.hh index 3979a4951d..07181c2c0b 100644 --- a/src/arch/arm/insts/static_inst.hh +++ b/src/arch/arm/insts/static_inst.hh @@ -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 + 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().uEnd(); + return std::unique_ptr{ret_pc}; } std::string generateDisassembly( diff --git a/src/arch/mips/isa/base.isa b/src/arch/mips/isa/base.isa index b02a8c4ad9..cd13de239a 100644 --- a/src/arch/mips/isa/base.isa +++ b/src/arch/mips/isa/base.isa @@ -64,13 +64,18 @@ output header {{ pc.as().advance(); } - PCState - buildRetPC(const PCState &curPC, const PCState &callPC) const override + std::unique_ptr + 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(); + ret.advance(); - ret.pc(curPC.npc()); - return ret; + ret.pc(cur_pc.as().npc()); + + return std::unique_ptr{ret_pc}; } size_t diff --git a/src/arch/power/insts/static_inst.hh b/src/arch/power/insts/static_inst.hh index bbe93fe4d2..eaa0100c3f 100644 --- a/src/arch/power/insts/static_inst.hh +++ b/src/arch/power/insts/static_inst.hh @@ -74,12 +74,13 @@ class PowerStaticInst : public StaticInst pc_state.as().advance(); } - PCState - buildRetPC(const PCState &curPC, const PCState &callPC) const override + std::unique_ptr + 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().advance(); + return std::unique_ptr{ret_pc}; } size_t diff --git a/src/arch/riscv/insts/static_inst.hh b/src/arch/riscv/insts/static_inst.hh index 1e2ec2854f..ed180ed296 100644 --- a/src/arch/riscv/insts/static_inst.hh +++ b/src/arch/riscv/insts/static_inst.hh @@ -64,13 +64,15 @@ class RiscvStaticInst : public StaticInst pc.as().advance(); } - PCState - buildRetPC(const PCState &curPC, const PCState &callPC) const override + std::unique_ptr + 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(); + ret_pc.advance(); + ret_pc.pc(cur_pc.as().npc()); + return std::unique_ptr{ret_pc_ptr}; } size_t diff --git a/src/arch/sparc/insts/static_inst.hh b/src/arch/sparc/insts/static_inst.hh index b2dfd5e9d0..c5cec2591a 100644 --- a/src/arch/sparc/insts/static_inst.hh +++ b/src/arch/sparc/insts/static_inst.hh @@ -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 + 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(); ret.uEnd(); - ret.pc(curPC.npc()); - return ret; + ret.pc(cur_pc.as().npc()); + return std::unique_ptr{ret_ptr}; } }; diff --git a/src/arch/x86/insts/static_inst.hh b/src/arch/x86/insts/static_inst.hh index 1654e81cc0..d8909043e2 100644 --- a/src/arch/x86/insts/static_inst.hh +++ b/src/arch/x86/insts/static_inst.hh @@ -204,12 +204,13 @@ class X86StaticInst : public StaticInst pcState.as().advance(); } - PCState - buildRetPC(const PCState &curPC, const PCState &callPC) const override + std::unique_ptr + 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().uEnd(); + return std::unique_ptr{ret_pc_ptr}; } }; diff --git a/src/cpu/pred/bpred_unit.cc b/src/cpu/pred/bpred_unit.cc index 9fcb9ba084..502b345cc3 100644 --- a/src/cpu/pred/bpred_unit.cc +++ b/src/cpu/pred/bpred_unit.cc @@ -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(); // Record the top entry of the RAS, and its index. predict_record.usedRAS = true; diff --git a/src/cpu/static_inst.hh b/src/cpu/static_inst.hh index d8c09ad623..9b5fd385cd 100644 --- a/src/cpu/static_inst.hh +++ b/src/cpu/static_inst.hh @@ -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 + buildRetPC(const PCStateBase &cur_pc, const PCStateBase &call_pc) const { panic("buildRetPC not defined!"); }