No longer used hacked liveness_pass_1
This hack was introduced in issue#287 which later becomes endless maintainance pain. ===== Our previous check_exit_request use `brcond` in the middle of a TranslationBlock which breaks the assumptions and thus a hack to liveness_pass_1 is used for _all_ brcond instructions which causes issues for MIPS and many other scenarios. ===== This patch also resolves PC not sync-ed when no memory hooks are installed, finally. Now Unicorn will always have correct PC no matter what happens.
This commit is contained in:
@@ -32,28 +32,17 @@ static inline void gen_io_end(TCGContext *tcg_ctx)
|
||||
|
||||
static inline void gen_tb_start(TCGContext *tcg_ctx, TranslationBlock *tb)
|
||||
{
|
||||
TCGv_i32 count;
|
||||
|
||||
tcg_ctx->exitreq_label = gen_new_label(tcg_ctx);
|
||||
|
||||
count = tcg_temp_new_i32(tcg_ctx);
|
||||
|
||||
tcg_gen_ld_i32(tcg_ctx, count, tcg_ctx->cpu_env,
|
||||
offsetof(ArchCPU, neg.icount_decr.u32) -
|
||||
offsetof(ArchCPU, env));
|
||||
TCGv_ptr puc = tcg_const_ptr(tcg_ctx, tcg_ctx->uc);
|
||||
TCGv_i32 tmp = tcg_const_i32(tcg_ctx, 0);
|
||||
// Unicorn:
|
||||
// We CANT'T use brcondi_i32 here or we will fail liveness analysis
|
||||
// because it marks the end of BB
|
||||
if (tcg_ctx->delay_slot_flag != NULL) {
|
||||
// Initialize delay_slot_flag here
|
||||
tcg_gen_movi_i32(tcg_ctx, tcg_ctx->delay_slot_flag, 0);
|
||||
TCGv_i32 tmp = tcg_const_i32(tcg_ctx, 0);
|
||||
// dest = (c1 cond c2 ? v1 : v2)
|
||||
tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GT, count, tcg_ctx->delay_slot_flag, tmp, tcg_ctx->delay_slot_flag, count);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp);
|
||||
tcg_gen_mov_i32(tcg_ctx, tmp, tcg_ctx->delay_slot_flag);
|
||||
}
|
||||
tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_LT, count, 0, tcg_ctx->exitreq_label);
|
||||
tcg_temp_free_i32(tcg_ctx, count);
|
||||
gen_helper_check_exit_request(tcg_ctx, puc, tmp);
|
||||
tcg_temp_free_i32(tcg_ctx, tmp);
|
||||
tcg_temp_free_ptr(tcg_ctx, puc);
|
||||
}
|
||||
|
||||
static inline void gen_tb_end(TCGContext *tcg_ctx, TranslationBlock *tb, int num_insns)
|
||||
@@ -68,7 +57,6 @@ static inline void gen_tb_end(TCGContext *tcg_ctx, TranslationBlock *tb, int num
|
||||
tcg_set_insn_param(tcg_ctx->icount_start_insn, 1, num_insns);
|
||||
}
|
||||
|
||||
gen_set_label(tcg_ctx, tcg_ctx->exitreq_label);
|
||||
tcg_gen_exit_tb(tcg_ctx, tb, TB_EXIT_REQUESTED);
|
||||
}
|
||||
|
||||
|
||||
@@ -672,7 +672,6 @@ struct TCGContext {
|
||||
#endif
|
||||
|
||||
TCGv_i32 delay_slot_flag;
|
||||
TCGLabel *exitreq_label;
|
||||
|
||||
TCGTempSet free_temps[TCG_TYPE_COUNT * 2];
|
||||
TCGTemp temps[TCG_MAX_TEMPS]; /* globals first, temps after */
|
||||
|
||||
Reference in New Issue
Block a user