* [Qemu-devel] [PATCH] target-i386 update @ 2014-05-12 21:28 Richard Henderson 2014-05-12 21:28 ` [Qemu-devel] [PATCH] target-i386: Preserve the Z bit for bt/bts/btr/btc Richard Henderson 2014-05-12 23:32 ` [Qemu-devel] [PATCH] target-i386 update Richard Henderson 0 siblings, 2 replies; 4+ messages in thread From: Richard Henderson @ 2014-05-12 21:28 UTC (permalink / raw) To: qemu-devel; +Cc: peter.maydell A long-delayed fix for the changed handling of the Z flag. r~ The following changes since commit 06b4f00d53637f2c16a62c2cbaa30bffb045cf88: Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging (2014-05-09 15:46:34 +0100) are available in the git repository at: git://github.com/rth7680/qemu.git tags/pull-tgt-i386-20140512 for you to fetch changes up to dc1823ce26f0539eab098e0209400d793ef66279: target-i386: Preserve the Z bit for bt/bts/btr/btc (2014-05-12 14:20:04 -0700) ---------------------------------------------------------------- Fix BT zero flag for new Intel manuals ---------------------------------------------------------------- Richard Henderson (1): target-i386: Preserve the Z bit for bt/bts/btr/btc target-i386/translate.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH] target-i386: Preserve the Z bit for bt/bts/btr/btc 2014-05-12 21:28 [Qemu-devel] [PATCH] target-i386 update Richard Henderson @ 2014-05-12 21:28 ` Richard Henderson 2014-05-12 23:32 ` [Qemu-devel] [PATCH] target-i386 update Richard Henderson 1 sibling, 0 replies; 4+ messages in thread From: Richard Henderson @ 2014-05-12 21:28 UTC (permalink / raw) To: qemu-devel; +Cc: peter.maydell, qemu-stable Older Intel manuals (pre-2010) and current AMD manuals describe Z as undefined, but newer Intel manuals describe Z as unchanged. Cc: qemu-stable@nongnu.org Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Richard Henderson <rth@twiddle.net> --- target-i386/translate.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index 02625e3..032b0fd 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -6708,41 +6708,63 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } bt_op: tcg_gen_andi_tl(cpu_T[1], cpu_T[1], (1 << (3 + ot)) - 1); + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); switch(op) { case 0: - tcg_gen_shr_tl(cpu_cc_src, cpu_T[0], cpu_T[1]); - tcg_gen_movi_tl(cpu_cc_dst, 0); break; case 1: - tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); tcg_gen_movi_tl(cpu_tmp0, 1); tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0); break; case 2: - tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); tcg_gen_movi_tl(cpu_tmp0, 1); tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); - tcg_gen_not_tl(cpu_tmp0, cpu_tmp0); - tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_tmp0); + tcg_gen_andc_tl(cpu_T[0], cpu_T[0], cpu_tmp0); break; default: case 3: - tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_T[1]); tcg_gen_movi_tl(cpu_tmp0, 1); tcg_gen_shl_tl(cpu_tmp0, cpu_tmp0, cpu_T[1]); tcg_gen_xor_tl(cpu_T[0], cpu_T[0], cpu_tmp0); break; } - set_cc_op(s, CC_OP_SARB + ot); if (op != 0) { if (mod != 3) { gen_op_st_v(s, ot, cpu_T[0], cpu_A0); } else { gen_op_mov_reg_v(ot, rm, cpu_T[0]); } + } + + /* Delay all CC updates until after the store above. Note that + C is the result of the test, Z is unchanged, and the others + are all undefined. */ + switch (s->cc_op) { + case CC_OP_MULB ... CC_OP_MULQ: + case CC_OP_ADDB ... CC_OP_ADDQ: + case CC_OP_ADCB ... CC_OP_ADCQ: + case CC_OP_SUBB ... CC_OP_SUBQ: + case CC_OP_SBBB ... CC_OP_SBBQ: + case CC_OP_LOGICB ... CC_OP_LOGICQ: + case CC_OP_INCB ... CC_OP_INCQ: + case CC_OP_DECB ... CC_OP_DECQ: + case CC_OP_SHLB ... CC_OP_SHLQ: + case CC_OP_SARB ... CC_OP_SARQ: + case CC_OP_BMILGB ... CC_OP_BMILGQ: + /* Z was going to be computed from the non-zero status of CC_DST. + We can get that same Z value (and the new C value) by leaving + CC_DST alone, setting CC_SRC, and using a CC_OP_SAR of the + same width. */ tcg_gen_mov_tl(cpu_cc_src, cpu_tmp4); - tcg_gen_movi_tl(cpu_cc_dst, 0); + set_cc_op(s, ((s->cc_op - CC_OP_MULB) & 3) + CC_OP_SARB); + break; + default: + /* Otherwise, generate EFLAGS and replace the C bit. */ + gen_compute_eflags(s); + tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, cpu_tmp4, + ctz32(CC_C), 1); + break; } break; case 0x1bc: /* bsf / tzcnt */ -- 1.9.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] target-i386 update 2014-05-12 21:28 [Qemu-devel] [PATCH] target-i386 update Richard Henderson 2014-05-12 21:28 ` [Qemu-devel] [PATCH] target-i386: Preserve the Z bit for bt/bts/btr/btc Richard Henderson @ 2014-05-12 23:32 ` Richard Henderson 2014-05-15 14:41 ` Peter Maydell 1 sibling, 1 reply; 4+ messages in thread From: Richard Henderson @ 2014-05-12 23:32 UTC (permalink / raw) To: qemu-devel; +Cc: peter.maydell On 05/12/2014 02:28 PM, Richard Henderson wrote: > A long-delayed fix for the changed handling of the Z flag. > > > r~ > > > The following changes since commit 06b4f00d53637f2c16a62c2cbaa30bffb045cf88: > > Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging (2014-05-09 15:46:34 +0100) > > are available in the git repository at: > > > git://github.com/rth7680/qemu.git tags/pull-tgt-i386-20140512 > > for you to fetch changes up to dc1823ce26f0539eab098e0209400d793ef66279: > > target-i386: Preserve the Z bit for bt/bts/btr/btc (2014-05-12 14:20:04 -0700) > Arg! Of course the subject line should have contained [PULL]. r~ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] target-i386 update 2014-05-12 23:32 ` [Qemu-devel] [PATCH] target-i386 update Richard Henderson @ 2014-05-15 14:41 ` Peter Maydell 0 siblings, 0 replies; 4+ messages in thread From: Peter Maydell @ 2014-05-15 14:41 UTC (permalink / raw) To: Richard Henderson; +Cc: QEMU Developers On 13 May 2014 00:32, Richard Henderson <rth@twiddle.net> wrote: > On 05/12/2014 02:28 PM, Richard Henderson wrote: >> A long-delayed fix for the changed handling of the Z flag. >> >> >> r~ >> >> >> The following changes since commit 06b4f00d53637f2c16a62c2cbaa30bffb045cf88: >> >> Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging (2014-05-09 15:46:34 +0100) >> >> are available in the git repository at: >> >> >> git://github.com/rth7680/qemu.git tags/pull-tgt-i386-20140512 >> >> for you to fetch changes up to dc1823ce26f0539eab098e0209400d793ef66279: >> >> target-i386: Preserve the Z bit for bt/bts/btr/btc (2014-05-12 14:20:04 -0700) >> > > Arg! Of course the subject line should have contained [PULL]. Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-05-15 14:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-05-12 21:28 [Qemu-devel] [PATCH] target-i386 update Richard Henderson 2014-05-12 21:28 ` [Qemu-devel] [PATCH] target-i386: Preserve the Z bit for bt/bts/btr/btc Richard Henderson 2014-05-12 23:32 ` [Qemu-devel] [PATCH] target-i386 update Richard Henderson 2014-05-15 14:41 ` Peter Maydell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).