On Wed, Jul 15, 2026 at 12:57 PM Brian Cain <[email protected]> wrote:
> Add hex_next_PC, a global mirroring CPUHexagonState::next_PC, > and ctx->need_next_pc, so that gen_write_new_pc_addr() can write the > branch target through hex_next_PC instead of hex_gpr[HEX_REG_PC] > when a later unconditional write of PC is expected. gen_end_tb() > then commits hex_next_PC into hex_gpr[HEX_REG_PC] at the end of the > packet. > > Previously, non-COF instructions that still end a TB did not advance the > PC, since next_PC's value was never written back into the PC register. > > Reviewed-by: Pierrick Bouvier <[email protected]> > Signed-off-by: Brian Cain <[email protected]> > --- > target/hexagon/translate.h | 3 +++ > target/hexagon/genptr.c | 14 ++++++++--- > target/hexagon/translate.c | 51 ++++++++++++++++++++++++++------------ > 3 files changed, 49 insertions(+), 19 deletions(-) > > > @@ -1327,6 +1344,8 @@ void hexagon_translate_init(void) > } > hex_new_value_usr = tcg_global_mem_new(tcg_env, > offsetof(CPUHexagonState, new_value_usr), "new_value_usr"); > + hex_next_PC = tcg_global_mem_new(tcg_env, > + offsetof(CPUHexagonState, next_PC), "next_PC"); > This only lives within the context of a single packet, so it shouldn't be global. Put it into DisasContext and make it a tmp similar to new_value.
