[2/9] x86: also refuse data size prefix on SIMD insns

Message ID 4d0ac7a7-d9c8-7ae3-3585-d36265bbc5cf@suse.com
State New
Headers show
Series
  • x86: (mainly) prefix handling adjustments
Related show

Commit Message

Jan Beulich June 24, 2020, 12:11 p.m.
The data size prefix alters the meaning of legacy encoded SIMD insns,
and hence shouldn't be accepted there. Use of it also leads to
inconsistencies in SSE2AVX mode. Don't match insns with data size prefix 
against SSE2AVX templates.

gas/
2020-06-XX  Jan Beulich  <jbeulich@suse.com>

	* config/tc-i386.c (cpu_flags_match): Only match SSE2AVX
	templates when there's no data size prefix.
	(md_assemble): Reject data size prefix also for legacy encoded
	SIMD templates.
	* testsuite/gas/i386/prefix32.s, testsuite/gas/i386/prefix64.s:
	Uncomment previously not working line.
	* testsuite/gas/i386/sse2avx.s: Add ldmxcsr/stmxcsr cases with
	data16 prefix.
	* testsuite/gas/i386/prefix32.l, testsuite/gas/i386/prefix64.l,
	testsuite/gas/i386/sse2avx.d: Adjust expectations.

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1943,7 +1943,8 @@  cpu_flags_match (const insn_template *t)
 	    {
 	      /* We need to check a few extra flags with AVX.  */
 	      if (cpu.bitfield.cpuavx
-		  && (!t->opcode_modifier.sse2avx || sse2avx)
+		  && (!t->opcode_modifier.sse2avx
+		      || (sse2avx && !i.prefix[DATA_PREFIX]))
 		  && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
 		  && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
 		  && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
@@ -4786,8 +4787,11 @@  md_assemble (char *line)
       return;
     }
 
-  /* Check for data size prefix on VEX/XOP/EVEX encoded insns.  */
-  if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
+  /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns.  */
+  if (i.prefix[DATA_PREFIX]
+      && (is_any_vex_encoding (&i.tm)
+	  || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
+	  || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
     {
       as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
       return;
--- a/gas/testsuite/gas/i386/prefix32.l
+++ b/gas/testsuite/gas/i386/prefix32.l
@@ -5,7 +5,8 @@ 
 .*:9: Error: invalid .* `vaddss' after `repne'
 .*:14: Error: same type of prefix .*
 .*:15: Error: same type of prefix .*
-.*:19: Error: same type of prefix .*
+.*:18: Error: data size .* `addps'
+.*:19: Error: data size .* `addpd'
 .*:20: Error: data size .* `vaddps'
 .*:21: Error: data size .* `vaddpd'
 .*:25: Error: same type of prefix .*
@@ -28,9 +29,8 @@  GAS LISTING .*
 [ 	]*15[ 	]+rep bnd ret
 [ 	]*16[ 	]*
 [ 	]*17[ 	]+\.Ldata16:
-[ 	]*18[ 	]+#bogus	data16 addps	%xmm0, %xmm0
-[ 	]*19[ 	]+\?\?\?\? 660F58C0[ 	]+data16 addpd	%xmm0, %xmm0
-\*\*\*\*  Error: .*
+[ 	]*18[ 	]+data16 addps	%xmm0, %xmm0
+[ 	]*19[ 	]+data16 addpd	%xmm0, %xmm0
 [ 	]*20[ 	]+data16 vaddps	%xmm0, %xmm0, %xmm0
 [ 	]*21[ 	]+data16 vaddpd	%xmm0, %xmm0, %xmm0
 [ 	]*22[ 	]*
--- a/gas/testsuite/gas/i386/prefix32.s
+++ b/gas/testsuite/gas/i386/prefix32.s
@@ -15,7 +15,7 @@  prefix:
 	rep bnd ret
 
 .Ldata16:
-#bogus	data16 addps	%xmm0, %xmm0
+	data16 addps	%xmm0, %xmm0
 	data16 addpd	%xmm0, %xmm0
 	data16 vaddps	%xmm0, %xmm0, %xmm0
 	data16 vaddpd	%xmm0, %xmm0, %xmm0
--- a/gas/testsuite/gas/i386/prefix64.l
+++ b/gas/testsuite/gas/i386/prefix64.l
@@ -5,7 +5,8 @@ 
 .*:9: Error: invalid .* `vaddss' after `repne'
 .*:14: Error: same type of prefix .*
 .*:15: Error: same type of prefix .*
-.*:19: Error: same type of prefix .*
+.*:18: Error: data size .* `addps'
+.*:19: Error: data size .* `addpd'
 .*:20: Error: data size .* `vaddps'
 .*:21: Error: data size .* `vaddpd'
 GAS LISTING .*
@@ -27,10 +28,9 @@  GAS LISTING .*
 [ 	]*15[ 	]+rep bnd ret
 [ 	]*16[ 	]*
 [ 	]*17[ 	]+\.Ldata16:
-[ 	]*18[ 	]+#bogus	data16 addps	%xmm0, %xmm0
-[ 	]*19[ 	]+\?\?\?\? 660F58C0[ 	]+data16 addpd	%xmm0, %xmm0
-\*\*\*\*  Error: .*
+[ 	]*18[ 	]+data16 addps	%xmm0, %xmm0
+[ 	]*19[ 	]+data16 addpd	%xmm0, %xmm0
 [ 	]*20[ 	]+data16 vaddps	%xmm0, %xmm0, %xmm0
 [ 	]*21[ 	]+data16 vaddpd	%xmm0, %xmm0, %xmm0
 [ 	]*22[ 	]*
-[ 	]*23[ 	]*[\?]+ 0+[ \t]+\.p2align	4,0
+#pass
--- a/gas/testsuite/gas/i386/prefix64.s
+++ b/gas/testsuite/gas/i386/prefix64.s
@@ -15,7 +15,7 @@  prefix:
 	rep bnd ret
 
 .Ldata16:
-#bogus	data16 addps	%xmm0, %xmm0
+	data16 addps	%xmm0, %xmm0
 	data16 addpd	%xmm0, %xmm0
 	data16 vaddps	%xmm0, %xmm0, %xmm0
 	data16 vaddpd	%xmm0, %xmm0, %xmm0
--- a/gas/testsuite/gas/i386/sse2avx.d
+++ b/gas/testsuite/gas/i386/sse2avx.d
@@ -9,6 +9,8 @@  Disassembly of section .text:
 0+ <_start>:
 [ 	]*[a-f0-9]+:	c5 f8 ae 11          	vldmxcsr \(%ecx\)
 [ 	]*[a-f0-9]+:	c5 f8 ae 19          	vstmxcsr \(%ecx\)
+[ 	]*[a-f0-9]+:	66 0f ae 11          	data16 ldmxcsr \(%ecx\)
+[ 	]*[a-f0-9]+:	66 0f ae 19          	data16 stmxcsr \(%ecx\)
 [ 	]*[a-f0-9]+:	c5 f8 5b f4          	vcvtdq2ps %xmm4,%xmm6
 [ 	]*[a-f0-9]+:	c5 f8 5b 21          	vcvtdq2ps \(%ecx\),%xmm4
 [ 	]*[a-f0-9]+:	c5 fb e6 f4          	vcvtpd2dq %xmm4,%xmm6
--- a/gas/testsuite/gas/i386/sse2avx.s
+++ b/gas/testsuite/gas/i386/sse2avx.s
@@ -7,6 +7,10 @@  _start:
 	ldmxcsr (%ecx)
 	stmxcsr (%ecx)
 
+# These should not be converted
+	data16 ldmxcsr (%ecx)
+	data16 stmxcsr (%ecx)
+
 # Tests for op xmm/mem128, xmm
 	cvtdq2ps %xmm4,%xmm6
 	cvtdq2ps (%ecx),%xmm4