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];