+2020-06-25  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.
+
 2020-06-25  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (build_evex_prefix): Drop early setting of
 
            {
              /* 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))
       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;
 
 .*: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 .*
 [      ]*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[   ]*
 
        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
 
 .*: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 .*
 [      ]*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
 
        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
 
 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
 
        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