[binutils-gdb] x86: correct implied-AVX512VL checking

Jan Beulich via Binutils-cvs <[email protected]> Fri, 24 Jul 2026 06:30:48 +0000 (GMT)
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D478111ec57ba=
51c61d32e2bf781aad8ab23103a4

commit 478111ec57ba51c61d32e2bf781aad8ab23103a4
Author: Jan Beulich <[email protected]>
Date:   Fri Jul 24 08:27:04 2026 +0200

    x86: correct implied-AVX512VL checking
   =20
    Templates specifying e.g. AVX2|AVX512F (i.e. providing all of AVX2,
    AVX512F, and AVX512VL form(s) at the same time) would presently bypass =
the
    operand size checking in check_VecOperands(). Both t->cpu and t->cpu_any
    need taking into account.

Diff:
---
 gas/config/tc-i386.c                    | 6 ++++--
 gas/testsuite/gas/i386/avx512vl-plain.l | 9 +++++++--
 gas/testsuite/gas/i386/avx512vl-plain.s | 6 +++++-
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index dd6d4381087..c5137e7d039 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -8796,9 +8796,11 @@ check_VecOperands (const insn_template *t)
      operand size is YMMword or XMMword.  Since this function runs after
      template matching, there's no need to check for YMMword/XMMword in
      the template.  */
-  cpu =3D cpu_flags_and (cpu_flags_from_attr (t->cpu), avx512);
+  cpu =3D cpu_flags_or (cpu_flags_from_attr (t->cpu),
+		      cpu_flags_from_attr (t->cpu_any));
+  cpu =3D cpu_flags_and (cpu, avx512);
   if (!cpu_flags_all_zero (&cpu)
-      && !is_cpu (t, CpuAVX512VL)
+      && !cpu.bitfield.cpuavx512vl
       && !cpu_arch_flags.bitfield.cpuavx512vl
       && (!t->opcode_modifier.vex || need_evex_encoding (t)))
     {
diff --git a/gas/testsuite/gas/i386/avx512vl-plain.l b/gas/testsuite/gas/i3=
86/avx512vl-plain.l
index c2dee22022e..248d2947424 100644
--- a/gas/testsuite/gas/i386/avx512vl-plain.l
+++ b/gas/testsuite/gas/i386/avx512vl-plain.l
@@ -2,6 +2,7 @@
 .*:5: Error: .*
 .*:6: Error: .*
 .*:7: Error: .*
+.*:20: Error: .*
 GAS LISTING .*
=20
=20
@@ -24,5 +25,9 @@ GAS LISTING .*
 [ 	]*15[ 	]+\.arch \.vpclmulqdq
 [ 	]*16[ 	]+\?\?\?\? 62F36D28[ 	]+\{evex\} vpclmulqdq[ 	]+\$0, %ymm1, %ymm=
2, %ymm3
 [ 	]*16[ 	]+44D900
-[ 	]*17[ 	]+\?\?\?\? 00000000 		\.p2align 4,0
-#...
+[ 	]*17[ 	]*
+[ 	]*18[ 	]+\.arch generic32
+[ 	]*19[ 	]+\.arch \.avx512f
+[ 	]*20[ 	]+\{evex\}[ 	]+vpermd[ 	]+%ymm1, %ymm2, %ymm3
+[ 	]*21[ 	]+\?\?\?\? C4E26D36[ 	]+vpermd[ 	]+%ymm1, %ymm2, %ymm3
+#pass
diff --git a/gas/testsuite/gas/i386/avx512vl-plain.s b/gas/testsuite/gas/i3=
86/avx512vl-plain.s
index 75e356158a7..a19e3eb5f4b 100644
--- a/gas/testsuite/gas/i386/avx512vl-plain.s
+++ b/gas/testsuite/gas/i386/avx512vl-plain.s
@@ -14,4 +14,8 @@ _start:
=20
 	.arch .vpclmulqdq
 	{evex} vpclmulqdq	$0, %ymm1, %ymm2, %ymm3
-	.p2align 4,0
+
+	.arch generic32
+	.arch .avx512f
+	{evex}	vpermd		%ymm1, %ymm2, %ymm3
+		vpermd		%ymm1, %ymm2, %ymm3