Signed-off-by: Taylor Simpson <[email protected]>
---
target/hexagon/translate.h | 7 ++++++-
target/hexagon/translate.c | 5 +++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/target/hexagon/translate.h b/target/hexagon/translate.h
index 4ef9357aad..ab53d8b4d2 100644
--- a/target/hexagon/translate.h
+++ b/target/hexagon/translate.h
@@ -66,6 +66,7 @@ typedef struct DisasContext {
int qreg_log[NUM_QREGS];
int qreg_log_idx;
DECLARE_BITMAP(qregs_written, NUM_QREGS);
+ DECLARE_BITMAP(qregs_multi_write, NUM_QREGS);
DECLARE_BITMAP(insn_qregs_written, NUM_QREGS);
DECLARE_BITMAP(insn_qregs_read, NUM_QREGS);
bool pre_commit;
@@ -264,7 +265,11 @@ static inline void ctx_log_qreg_write(DisasContext *ctx,
ctx->has_hvx_overlap = true;
}
}
- set_bit(rnum, ctx->qregs_written);
+ if (!test_bit(rnum, ctx->qregs_written)) {
+ set_bit(rnum, ctx->qregs_written);
+ } else {
+ set_bit(rnum, ctx->qregs_multi_write);
+ }
ctx->qreg_log[ctx->qreg_log_idx] = rnum;
ctx->qreg_log_idx++;
}
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
index 9aea3e7ae4..32cb2e7fb4 100644
--- a/target/hexagon/translate.c
+++ b/target/hexagon/translate.c
@@ -433,6 +433,7 @@ static void clear_pkt_ctx(DisasContext *ctx)
bitmap_zero(ctx->vregs_multi_write, NUM_VREGS);
bitmap_zero(ctx->vregs_uncond, NUM_VREGS);
bitmap_zero(ctx->qregs_written, NUM_QREGS);
+ bitmap_zero(ctx->qregs_multi_write, NUM_QREGS);
ctx->qreg_log_idx = 0;
for (i = 0; i < STORES_MAX; i++) {
ctx->store_width[i] = 0;
@@ -464,6 +465,10 @@ static bool pkt_has_write_conflict(DisasContext *ctx)
return true;
}
+ if (!bitmap_empty(ctx->qregs_multi_write, NUM_QREGS)) {
+ return true;
+ }
+
return false;
}
--
2.43.0