aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2022-03-24 09:08:39 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2022-03-24 09:11:03 +0100
commitde65b39a517c9977769c612af716dc418ce2ea0b (patch)
treea98cfc64dc1230134c98f9cf3f4b09d696f25cbb
parent98a02bc4492c7e00a703ad42f1ff9d2f3521a138 (diff)
downloadqemu-de65b39a517c9977769c612af716dc418ce2ea0b.zip
qemu-de65b39a517c9977769c612af716dc418ce2ea0b.tar.gz
qemu-de65b39a517c9977769c612af716dc418ce2ea0b.tar.bz2
target/i386: tcg: high bits SSE cmp operation must be ignored
High bits in the immediate operand of SSE comparisons are ignored, they do not result in an undefined opcode exception. This is mentioned explicitly in the Intel documentation. Reported-by: sonicadvance1@gmail.com Closes: https://gitlab.com/qemu-project/qemu/-/issues/184 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--target/i386/tcg/translate.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
index 2a94d33..c393913 100644
--- a/target/i386/tcg/translate.c
+++ b/target/i386/tcg/translate.c
@@ -4509,10 +4509,8 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
sse_fn_ppi(s->ptr0, s->ptr1, tcg_const_i32(val));
break;
case 0xc2:
- /* compare insns */
- val = x86_ldub_code(env, s);
- if (val >= 8)
- goto unknown_op;
+ /* compare insns, bits 7:3 (7:5 for AVX) are ignored */
+ val = x86_ldub_code(env, s) & 7;
sse_fn_epp = sse_op_table4[val][b1];
tcg_gen_addi_ptr(s->ptr0, cpu_env, op1_offset);