[binutils-gdb] x86: FMA insns aren't eligible to VEX2 encoding

Jan Beulich jbeulich@sourceware.org
Tue Jan 9 12:50:45 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7440781b67631ebdf1b0587724f5d77c3748b034

commit 7440781b67631ebdf1b0587724f5d77c3748b034
Author: Jan Beulich <jbeulich@suse.com>
Date:   Tue Jan 9 13:49:48 2024 +0100

    x86: FMA insns aren't eligible to VEX2 encoding
    
    PR gas/31178
    
    In da0784f961d8 ("x86: fold FMA VEX and EVEX templates") I overlooked
    that C aliases StaticRounding, and hence build_vex_prefix() now needs to
    be aware of that aliasing. Disambiguation is easy, as StaticRounding is
    only ever used together with SAE (hence why the overlaying works in the
    first place).

Diff:
---
 gas/config/tc-i386.c                        | 2 ++
 gas/testsuite/gas/i386/x86-64-optimize-2.d  | 1 +
 gas/testsuite/gas/i386/x86-64-optimize-2.s  | 3 +++
 gas/testsuite/gas/i386/x86-64-optimize-2a.d | 1 +
 gas/testsuite/gas/i386/x86-64-optimize-2b.d | 1 +
 gas/testsuite/gas/i386/x86-64-optimize-2c.d | 1 +
 gas/testsuite/gas/i386/x86-64-optimize-5.d  | 1 +
 gas/testsuite/gas/i386/x86-64-optimize-6.d  | 1 +
 8 files changed, 11 insertions(+)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 27d0742c6c8..f7276c12c52 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -3801,6 +3801,8 @@ build_vex_prefix (const insn_template *t)
       && i.reg_operands == i.operands - i.imm_operands
       && i.tm.opcode_modifier.vex
       && i.tm.opcode_modifier.commutative
+      /* .commutative aliases .staticrounding; disambiguate.  */
+      && !i.tm.opcode_modifier.sae
       && (i.tm.opcode_modifier.sse2avx
 	  || (optimize > 1 && !i.no_optimize))
       && i.rex == REX_B
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-2.d b/gas/testsuite/gas/i386/x86-64-optimize-2.d
index 87bf3edfbaa..518b5c0b2e5 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-2.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-2.d
@@ -222,4 +222,5 @@ Disassembly of section .text:
  +[a-f0-9]+:	66 .*	pxor   %xmm12,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-2.s b/gas/testsuite/gas/i386/x86-64-optimize-2.s
index 1d1b8e14782..b20b795809a 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-2.s
+++ b/gas/testsuite/gas/i386/x86-64-optimize-2.s
@@ -248,3 +248,6 @@ _start:
 	pcmpgtq		%xmm12, %xmm12
 	vpcmpgtq	%xmm2, %xmm2, %xmm8
 	vpcmpgtq	%ymm12, %ymm12, %ymm1
+
+	# PR gas/31178
+	vfnmadd231sd	%xmm9, %xmm2, %xmm0
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-2a.d b/gas/testsuite/gas/i386/x86-64-optimize-2a.d
index f12507b8f55..b42b1ad4a77 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-2a.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-2a.d
@@ -223,4 +223,5 @@ Disassembly of section .text:
  +[a-f0-9]+:	66 .*	pxor   %xmm12,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-2b.d b/gas/testsuite/gas/i386/x86-64-optimize-2b.d
index e572491a9da..2d21eccef34 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-2b.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-2b.d
@@ -222,4 +222,5 @@ Disassembly of section .text:
  +[a-f0-9]+:	66 .*	pxor   %xmm12,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-2c.d b/gas/testsuite/gas/i386/x86-64-optimize-2c.d
index 73a50a35b74..7523149dbc9 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-2c.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-2c.d
@@ -223,4 +223,5 @@ Disassembly of section .text:
  +[a-f0-9]+:	c5 .*	vpxor  %xmm0,%xmm0,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-5.d b/gas/testsuite/gas/i386/x86-64-optimize-5.d
index 5b272aa0945..837edc7699c 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-5.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-5.d
@@ -222,6 +222,7 @@ Disassembly of section .text:
  +[a-f0-9]+:	66 .*	pxor   %xmm12,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
  +[a-f0-9]+:	62 f1 f5 08 55 e9    	\{evex\} vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:	62 f1 f5 08 55 e9    	\{evex\} vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:	62 f1 7d 28 6f d1    	vmovdqa32 %ymm1,%ymm2
diff --git a/gas/testsuite/gas/i386/x86-64-optimize-6.d b/gas/testsuite/gas/i386/x86-64-optimize-6.d
index 48105c3063e..809717454d4 100644
--- a/gas/testsuite/gas/i386/x86-64-optimize-6.d
+++ b/gas/testsuite/gas/i386/x86-64-optimize-6.d
@@ -222,6 +222,7 @@ Disassembly of section .text:
  +[a-f0-9]+:	66 .*	pxor   %xmm12,%xmm12
  +[a-f0-9]+:	c5 .*	vpxor  %xmm2,%xmm2,%xmm8
  +[a-f0-9]+:	c5 .*	vpxor  %ymm0,%ymm0,%ymm1
+ +[a-f0-9]+:	c4 .*	vfnmadd231sd %xmm9,%xmm2,%xmm0
  +[a-f0-9]+:	62 f1 f5 08 55 e9    	\{evex\} vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:	62 f1 f5 08 55 e9    	\{evex\} vandnpd %xmm1,%xmm1,%xmm5
  +[a-f0-9]+:	62 f1 7d 28 6f d1    	vmovdqa32 %ymm1,%ymm2


More information about the Binutils-cvs mailing list