diff --git a/qemu/target/arm/translate.c b/qemu/target/arm/translate.c index 01a65cc1..744d8ff7 100644 --- a/qemu/target/arm/translate.c +++ b/qemu/target/arm/translate.c @@ -455,8 +455,7 @@ static void gen_sub_carry(TCGContext *tcg_ctx, TCGv_i32 dest, TCGv_i32 t0, TCGv_ static inline void mb_tcg_opcode_cmp_hook(TCGContext *tcg_ctx, TCGv_i32 v0, TCGv_i32 v1, uint32_t size) { uc_engine *uc = tcg_ctx->uc; - TCGv_i64 targ1 = temp_tcgv_i64(tcg_ctx, tcgv_i32_temp(tcg_ctx, v0)); - TCGv_i64 targ2 = temp_tcgv_i64(tcg_ctx, tcgv_i32_temp(tcg_ctx, v1)); + if (HOOK_EXISTS_BOUNDED(uc, UC_HOOK_TCG_OPCODE, tcg_ctx->pc_start)) { struct hook *hook; HOOK_FOREACH_VAR_DECLARE; @@ -464,7 +463,13 @@ static inline void mb_tcg_opcode_cmp_hook(TCGContext *tcg_ctx, TCGv_i32 v0, TCGv if (hook->to_delete) continue; if (hook->op == UC_TCG_OP_SUB && (hook->op_flags & UC_TCG_OP_FLAG_CMP)) { + TCGv_i64 targ1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 targ2 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, targ1, v0); + tcg_gen_extu_i32_i64(tcg_ctx, targ2, v1); gen_uc_traceopcode(tcg_ctx, hook, targ1, targ2, size, uc, tcg_ctx->pc_start); + tcg_temp_free_i64(tcg_ctx, targ1); + tcg_temp_free_i64(tcg_ctx, targ2); } } }