+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