target/i386: decode-new: avoid out-of-bounds access to xmm_regs[-1]
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 19 Oct 2022 12:32:04 +0000 (14:32 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 20 Oct 2022 13:15:50 +0000 (15:15 +0200)
If the destination is a memory register, op->n is -1.  Going through
tcg_gen_gvec_dup_imm path is both useless (the value has been stored
by the gen_* function already) and wrong because of the out-of-bounds
access.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
target/i386/tcg/emit.c.inc

index 27eca591a999ee38cefb411b8f6f26ed01c74d27..ebf299451dffa3a471500ab9d691a135e78d332b 100644 (file)
@@ -296,7 +296,7 @@ static void gen_writeback(DisasContext *s, X86DecodedInsn *decode, int opn, TCGv
     case X86_OP_MMX:
         break;
     case X86_OP_SSE:
-        if ((s->prefix & PREFIX_VEX) && op->ot == MO_128) {
+        if (!op->has_ea && (s->prefix & PREFIX_VEX) && op->ot == MO_128) {
             tcg_gen_gvec_dup_imm(MO_64,
                                  offsetof(CPUX86State, xmm_regs[op->n].ZMM_X(1)),
                                  16, 16, 0);