@samitouri / QOSamiQemu / commits / 17bcfb42be

target/hexagon: Add next_PC, {s,g}reg writes

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>

Brian Cain committed Jun 22, 2026 at 15:28 UTC 17bcfb42befd19ee50e96ca3339f95c6ff1bf072
2 files changed +74 -5
target/hexagon/translate.c
+73 -4
@@ -545,6 +545,10 @@ static void gen_start_packet(DisasContext *ctx)
545 ctx->reg_log_idx = 0;
546 bitmap_zero(ctx->regs_written, TOTAL_PER_THREAD_REGS);
547 bitmap_zero(ctx->predicated_regs, TOTAL_PER_THREAD_REGS);
548 +#ifndef CONFIG_USER_ONLY
549 + ctx->greg_log_idx = 0;
550 + ctx->sreg_log_idx = 0;
551 +#endif
552 ctx->preg_log_idx = 0;
553 bitmap_zero(ctx->pregs_written, NUM_PREGS);
554 ctx->future_vregs_idx = 0;
@@ -577,6 +581,25 @@ static void gen_start_packet(DisasContext *ctx)
581 * gen phase, so clear it again.
582 */
583 bitmap_zero(ctx->pregs_written, NUM_PREGS);
584 +#ifndef CONFIG_USER_ONLY
585 + for (i = 0; i < HEX_SREG_GLB_START; i++) {
586 + ctx->t_sreg_new_value[i] = NULL;
587 + }
588 + for (i = 0; i < ctx->sreg_log_idx; i++) {
589 + int reg_num = ctx->sreg_log[i];
590 + if (reg_num < HEX_SREG_GLB_START &&
591 + (ctx->need_commit || reg_num == HEX_SREG_SSR)) {
592 + ctx->t_sreg_new_value[reg_num] = tcg_temp_new();
593 + }
594 + }
595 + for (i = 0; i < NUM_GREGS; i++) {
596 + ctx->greg_new_value[i] = NULL;
597 + }
598 + for (i = 0; i < ctx->greg_log_idx; i++) {
599 + int reg_num = ctx->greg_log[i];
600 + ctx->greg_new_value[reg_num] = tcg_temp_new();
601 + }
602 +#endif
603
604 /* Initialize the runtime state for packet semantics */
605 if (need_slot_cancelled(&ctx->pkt)) {
@@ -734,6 +757,50 @@ static void gen_reg_writes(DisasContext *ctx)
757 }
758 }
759
760 +#ifndef CONFIG_USER_ONLY
761 +static void gen_greg_writes(DisasContext *ctx)
762 +{
763 + int i;
764 +
765 + for (i = 0; i < ctx->greg_log_idx; i++) {
766 + int reg_num = ctx->greg_log[i];
767 +
768 + tcg_gen_mov_tl(hex_greg[reg_num], ctx->greg_new_value[reg_num]);
769 + }
770 +}
771 +
772 +
773 +static void gen_sreg_writes(DisasContext *ctx)
774 +{
775 + int i;
776 +
777 + TCGv_i32 old_reg = tcg_temp_new_i32();
778 + for (i = 0; i < ctx->sreg_log_idx; i++) {
779 + int reg_num = ctx->sreg_log[i];
780 +
781 + if (reg_num == HEX_SREG_SSR) {
782 + tcg_gen_mov_tl(old_reg, hex_t_sreg[reg_num]);
783 + tcg_gen_mov_tl(hex_t_sreg[reg_num], ctx->t_sreg_new_value[reg_num]);
784 + gen_helper_modify_ssr(tcg_env, ctx->t_sreg_new_value[reg_num],
785 + old_reg);
786 + } else if ((reg_num == HEX_SREG_STID) ||
787 + (reg_num == HEX_SREG_IMASK) ||
788 + (reg_num == HEX_SREG_IPENDAD)) {
789 + if (ctx->need_commit && reg_num < HEX_SREG_GLB_START) {
790 + tcg_gen_mov_tl(hex_t_sreg[reg_num],
791 + ctx->t_sreg_new_value[reg_num]);
792 + }
793 + gen_helper_pending_interrupt(tcg_env);
794 + } else if ((reg_num == HEX_SREG_BESTWAIT) ||
795 + (reg_num == HEX_SREG_SCHEDCFG)) {
796 + gen_helper_resched(tcg_env);
797 + } else if (ctx->need_commit && reg_num < HEX_SREG_GLB_START) {
798 + tcg_gen_mov_tl(hex_t_sreg[reg_num], ctx->t_sreg_new_value[reg_num]);
799 + }
800 + }
801 +}
802 +#endif
803 +
804 static void gen_pred_writes(DisasContext *ctx)
805 {
806 /* Early exit if not needed or the log is empty */
@@ -1030,6 +1097,10 @@ static void gen_commit_packet(DisasContext *ctx)
1097 process_store_log(ctx);
1098
1099 gen_reg_writes(ctx);
1100 +#ifndef CONFIG_USER_ONLY
1101 + gen_greg_writes(ctx);
1102 + gen_sreg_writes(ctx);
1103 +#endif
1104 gen_pred_writes(ctx);
1105 if (ctx->pkt.pkt_has_hvx) {
1106 gen_commit_hvx(ctx);
@@ -1242,6 +1313,8 @@ void hexagon_translate_init(void)
1313 hex_llsc_val_i64 = tcg_global_mem_new_i64(tcg_env,
1314 offsetof(CPUHexagonState, llsc_val_i64), "llsc_val_i64");
1315 #ifndef CONFIG_USER_ONLY
1316 + hex_cause_code = tcg_global_mem_new_i32(tcg_env,
1317 + offsetof(CPUHexagonState, cause_code), "cause_code");
1318 hex_cycle_count = tcg_global_mem_new_i64(tcg_env,
1319 offsetof(CPUHexagonState, t_cycle_count), "t_cycle_count");
1320 #endif
@@ -1282,8 +1355,4 @@ void hexagon_translate_init(void)
1355 offsetof(CPUHexagonState, vstore_pending[i]),
1356 vstore_pending_names[i]);
1357 }
1285 -#ifndef CONFIG_USER_ONLY
1286 - hex_cause_code = tcg_global_mem_new(tcg_env,
1287 - offsetof(CPUHexagonState, cause_code), "cause_code");
1288 -#endif
1358 }
target/hexagon/translate.h
+1 -1
@@ -46,7 +46,7 @@ typedef struct DisasContext {
46 int greg_log_idx;
47 int sreg_log[SREG_WRITES_MAX];
48 int sreg_log_idx;
49 - TCGv_i32 t_sreg_new_value[NUM_SREGS];
49 + TCGv_i32 t_sreg_new_value[HEX_SREG_GLB_START];
50 TCGv_i32 greg_new_value[NUM_GREGS];
51 #endif
52 int preg_log[PRED_WRITES_MAX];