From 1197d778cceb57ebc20bff880579af464665a356 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Thu, 1 Mar 2018 19:13:33 -0500 Subject: [PATCH] target-m68k: fix gen_flush_flags() gen_flush_flags() is setting unconditionally cc_op_synced to 1 and s->cc_op to CC_OP_FLAGS, whereas env->cc_op can be set to something else by a previous tcg fragment. We fix that by not setting cc_op_synced to 1 (except for gen_helper_flush_flags() that updates env->cc_op) FIX: https://github.com/vivier/qemu-m68k/issues/19 Backports commit 695576db2daaf2bdc63e7f6d36038b61caed622a from qemu --- qemu/target-m68k/translate.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qemu/target-m68k/translate.c b/qemu/target-m68k/translate.c index e26e283d..dbf5e0bd 100644 --- a/qemu/target-m68k/translate.c +++ b/qemu/target-m68k/translate.c @@ -585,18 +585,19 @@ static void gen_flush_flags(DisasContext *s) case CC_OP_DYNAMIC: gen_helper_flush_flags(tcg_ctx, tcg_ctx->cpu_env, tcg_ctx->QREG_CC_OP); + s->cc_op_synced = 1; break; default: t0 = tcg_const_i32(tcg_ctx, s->cc_op); gen_helper_flush_flags(tcg_ctx, tcg_ctx->cpu_env, t0); tcg_temp_free(tcg_ctx, t0); + s->cc_op_synced = 1; break; } /* Note that flush_flags also assigned to env->cc_op. */ s->cc_op = CC_OP_FLAGS; - s->cc_op_synced = 1; } static inline TCGv gen_extend(DisasContext *s, TCGv val, int opsize, int sign)