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!"); }