From: Qi Hu Date: Mon, 24 Oct 2022 08:41:55 +0000 (+0200) Subject: target/i386: Fix calculation of LOCK NEG eflags X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=121531751087ad3f8d87ad17068835bbcd14fb02;p=qmiga%2Fqemu.git target/i386: Fix calculation of LOCK NEG eflags After: lock negl -0x14(%rbp) pushf pop %rax %rax will contain the wrong value because the "lock neg" calculates the wrong eflags. Simple test: #include int main() { __volatile__ unsigned test = 0x2363a; __volatile__ char cond = 0; asm( "lock negl %0 \n\t" "sets %1" : "=m"(test), "=r"(cond)); assert(cond & 1); return 0; } Reported-by: Jinyang Shen Co-Developed-by: Xuehai Chen Signed-off-by: Xuehai Chen Signed-off-by: Qi Hu Signed-off-by: Paolo Bonzini --- diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 546c427c23..c477a10f41 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -3300,7 +3300,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu) tcg_temp_free(t2); tcg_temp_free(a0); - tcg_gen_mov_tl(s->T0, t0); + tcg_gen_neg_tl(s->T0, t0); tcg_temp_free(t0); } else { tcg_gen_neg_tl(s->T0, s->T0);