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 <assert.h> 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 <shenjinyang@loongson.cn> Co-Developed-by: Xuehai Chen <chenxuehai@loongson.cn> Signed-off-by: Xuehai Chen <chenxuehai@loongson.cn> Signed-off-by: Qi Hu <huqi@loongson.cn> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
75d30fde55
commit
1215317510
|
@ -3300,7 +3300,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||||
|
|
||||||
tcg_temp_free(t2);
|
tcg_temp_free(t2);
|
||||||
tcg_temp_free(a0);
|
tcg_temp_free(a0);
|
||||||
tcg_gen_mov_tl(s->T0, t0);
|
tcg_gen_neg_tl(s->T0, t0);
|
||||||
tcg_temp_free(t0);
|
tcg_temp_free(t0);
|
||||||
} else {
|
} else {
|
||||||
tcg_gen_neg_tl(s->T0, s->T0);
|
tcg_gen_neg_tl(s->T0, s->T0);
|
||||||
|
|
Loading…
Reference in New Issue