]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
PR432809 VEX should support REX.W + POPF
authorMark Wielaard <mark@klomp.org>
Fri, 12 Feb 2021 19:42:00 +0000 (20:42 +0100)
committerMark Wielaard <mark@klomp.org>
Fri, 12 Feb 2021 19:42:00 +0000 (20:42 +0100)
It seems a REX.W prefix simply explicitly sets the operant size to 8,
and so can/must be ignored as redundant. This is what we already do
for PUSH, POP and PUSHF. All instructions are described as "When in
64-bit mode, instruction defaults to 64-bit operand size and cannot
encode 32-bit operand size." in the instruction manual.

Original patch and analysis by Mike Dalessio <mike.dalessio@gmail.com>

https://bugs.kde.org/show_bug.cgi?id=432809

NEWS
VEX/priv/guest_amd64_toIR.c

diff --git a/NEWS b/NEWS
index dbe029ecea4982f4847412b9c0a58c1c0cf834b1..eafe0cb009f2a6d29c678c6c973d7e708abbfe8a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -88,6 +88,7 @@ n-i-bz  helgrind: If hg_cli__realloc fails, return NULL.
 430354  ppc stxsibx and stxsihx instructions write too much data
 430485  expr_is_guardable doesn't handle Iex_Qop
 432672  vg_regtest: test-specific environment variables not reset between tests
+432809  VEX should support REX.W + POPF
 432861  PPC modsw and modsd give incorrect results for 1 mod 12
 
 Release 3.16.1 (?? June 2020)
index 2faca7d03febab7b4b3d297d853a139203a18bf4..30487065d71c7f72d844d3d37fda01dd2211ea72 100644 (file)
@@ -20586,7 +20586,7 @@ Long dis_ESC_NONE (
       /* Note.  There is no encoding for a 32-bit popf in 64-bit mode.
          So sz==4 actually means sz==8. */
       if (haveF2orF3(pfx)) goto decode_failure;
-      vassert(sz == 2 || sz == 4);
+      vassert(sz == 2 || sz == 4 || sz == 8);
       if (sz == 4) sz = 8;
       if (sz != 8) goto decode_failure; // until we know a sz==2 test case exists
       t1 = newTemp(Ity_I64); t2 = newTemp(Ity_I64);