]> git.ipfire.org Git - thirdparty/qemu.git/commit
target/i386: fix operand size for DATA16 REX.W POPCNT
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 9 May 2024 10:38:10 +0000 (12:38 +0200)
committerMichael Tokarev <mjt@tls.msk.ru>
Mon, 27 May 2024 04:32:26 +0000 (07:32 +0300)
commiteb761b4ee5c9dcb01d16e6aab9de2e35a308a11a
tree0b91778ffb728182bbdd5194bca2cf11decfb29c
parent7d7b770bde7f52a8a46112292ddb721cd82ba092
target/i386: fix operand size for DATA16 REX.W POPCNT

According to the manual, 32-bit vs 64-bit is governed by REX.W
and REX ignores the 0x66 prefix.  This can be confirmed with this
program:

    #include <stdio.h>
    int main()
    {
       int x = 0x12340000;
       int y;
       asm("popcntl %1, %0" : "=r" (y) : "r" (x)); printf("%x\n", y);
       asm("mov $-1, %0; .byte 0x66; popcntl %1, %0" : "+r" (y) : "r" (x)); printf("%x\n", y);
       asm("mov $-1, %0; .byte 0x66; popcntq %q1, %q0" : "+r" (y) : "r" (x)); printf("%x\n", y);
    }

which prints 5/ffff0000/5 on real hardware and 5/ffff0000/ffff0000
on QEMU.

Cc: qemu-stable@nongnu.org
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 41c685dc59bb611096f3bb6a663cfa82e4cba97b)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
(Mjt: drop removal of mo_64_32() helper function in target/i386/tcg/translate.c
 due to missing-in-8.2 v9.0.0-542-gaef4f4affde2
 "target/i386: remove now-converted opcodes from old decoder"
 which removed other user of it)
target/i386/tcg/translate.c