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
1 changed files with 1 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue