[binutils-gdb] x86/APX: handle EVEX.R4 and EVEX.X4 in build_evex_prefix()

Jan Beulich via Binutils-cvs <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=65f79f1be929e28cbfefb5517c414b7d62f1dbb1

commit 65f79f1be929e28cbfefb5517c414b7d62f1dbb1
Author: Jan Beulich <[email protected]>
Date:   Fri Aug 28 09:21:50 2026 +0200

    x86/APX: handle EVEX.R4 and EVEX.X4 in build_evex_prefix()
    
    There's no need to defer to the more expensive build_apx_evex_prefix(),
    as there's no need to first set bits just to then clear them again.

Diff:
---
 gas/config/tc-i386.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index de217fdc479..3b2ae4862d6 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4548,7 +4548,7 @@ is_any_vex_encoding (const insn_template *t)
 static INLINE bool
 is_apx_evex_encoding (void)
 {
-  return i.rex2 || i.tm.opcode_space == SPACE_MAP4 || pp.has_nf;
+  return (i.rex2 & REX_B) || i.tm.opcode_space == SPACE_MAP4 || pp.has_nf;
 }
 
 static INLINE bool
@@ -4678,10 +4678,9 @@ build_evex_prefix (void)
 
   /* The fifth bit of the second EVEX byte is 1's compliment of the
      REX_R bit in VREX.  */
-  if (!(i.vrex & REX_R))
+  if (!((i.vrex | i.rex2) & REX_R))
     i.vex.bytes[1] |= 0x10;
-  else
-    vrex_used |= REX_R;
+  vrex_used |= i.vrex & REX_R;
 
   if ((i.reg_operands + i.imm_operands) == i.operands)
     {
@@ -4761,7 +4760,7 @@ build_evex_prefix (void)
   /* The third byte of the EVEX prefix.  */
   i.vex.bytes[2] = ((w << 7)
 		    | (register_specifier << 3)
-		    | 4 /* Encode the U bit.  */
+		    | (i.rex2 & REX_X ? 0 : 4) /* Encode the U bit.  */
 		    | i.tm.opcode_modifier.opcodeprefix);
 
   /* The fourth byte of the EVEX prefix.  */
@@ -4869,15 +4868,8 @@ build_apx_evex_prefix (bool force_nd)
     }
 
   build_evex_prefix ();
-  if (i.rex2 & REX_R)
-    i.vex.bytes[1] &= ~0x10;
   if (i.rex2 & REX_B)
     i.vex.bytes[1] |= 0x08;
-  if (i.rex2 & REX_X)
-    {
-      gas_assert (i.rm.mode != 3);
-      i.vex.bytes[2] &= ~0x04;
-    }
 
   /* Encode the NDD bit of the instruction promoted from the legacy
      space. ZU shares the same bit with NDD.  */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.