x86: record register use for SIMD insns without respective explicit operands
authorJan Beulich <jbeulich@suse.com>
Tue, 16 Feb 2021 10:32:18 +0000 (11:32 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 16 Feb 2021 10:32:18 +0000 (11:32 +0100)
VZERO{ALL,UPPER} modify YMM registers despite having no operands.

While {,V}{LD,ST}MXCSR don't modify XMM registers, MXCSR and XMMn
collectively form underlying machine state.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/property-ldmxcsr.d [new file with mode: 0644]
gas/testsuite/gas/i386/property-ldmxcsr.s [new file with mode: 0644]
gas/testsuite/gas/i386/property-vldmxcsr.d [new file with mode: 0644]
gas/testsuite/gas/i386/property-vldmxcsr.s [new file with mode: 0644]
gas/testsuite/gas/i386/property-vzeroall.d [new file with mode: 0644]
gas/testsuite/gas/i386/property-vzeroall.s [new file with mode: 0644]

index 12ce28b8db741fd02971d873551ab8affede7c17..a269303e0805337353b2542276d0f84d4c03044f 100644 (file)
@@ -1,3 +1,15 @@
+2021-02-16  Jan Beulich  <jbeulich@suse.com>
+
+       * config/tc-i386.c (output_insn): Handle ldmxcsr, stmxcsr,
+       vldmxcsr, vstmxcsr, vzeroall, and vzeroupper.
+       * testsuite/gas/i386/property-ldmxcsr.s,
+       testsuite/gas/i386/property-ldmxcsr.d,
+       testsuite/gas/i386/property-vldmxcsr.s,
+       testsuite/gas/i386/property-vldmxcsr.d,
+       testsuite/gas/i386/property-vzeroall.s,
+       testsuite/gas/i386/property-vzeroall.d: New.
+       * testsuite/gas/i386/i386.exp: Run new tests.
+
 2021-02-16  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/i386.exp: Move bitness-independent property
index b0140e1128abc270188535875dd328e7f5791899..94783f51550fa3bebe6ff39916a61662eae0d54d 100644 (file)
@@ -9208,10 +9208,12 @@ output_insn (void)
          || i.tm.cpu_flags.bitfield.cpu687
          || i.tm.cpu_flags.bitfield.cpufisttp)
        x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
+
       if ((i.xstate & xstate_mmx)
          || i.tm.base_opcode == 0xf77 /* emms */
          || i.tm.base_opcode == 0xf0e /* femms */)
        x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
+
       if (i.index_reg)
        {
          if (i.index_reg->reg_type.bitfield.zmmword)
@@ -9221,10 +9223,20 @@ output_insn (void)
          else if (i.index_reg->reg_type.bitfield.xmmword)
            i.xstate |= xstate_xmm;
        }
+
+      /* vzeroall / vzeroupper */
+      if (i.tm.base_opcode == 0x77 && i.tm.cpu_flags.bitfield.cpuavx)
+       i.xstate |= xstate_ymm;
+
       if ((i.xstate & xstate_xmm)
+         /* ldmxcsr / stmxcsr */
+         || (i.tm.base_opcode == 0xfae && i.tm.cpu_flags.bitfield.cpusse)
+         /* vldmxcsr / vstmxcsr */
+         || (i.tm.base_opcode == 0xae && i.tm.cpu_flags.bitfield.cpuavx)
          || i.tm.cpu_flags.bitfield.cpuwidekl
          || i.tm.cpu_flags.bitfield.cpukl)
        x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
+
       if ((i.xstate & xstate_ymm) == xstate_ymm)
        x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
       if ((i.xstate & xstate_zmm) == xstate_zmm)
index 5a481a4c47a8f2bd0936d992628b6036291546b3..89f62b3aeca04cada0073650a61c6df14b3a1b04 100644 (file)
@@ -725,6 +725,9 @@ if {[is_elf_format] || [istarget "*-*-vxworks*"]} then {
     run_dump_test "property-11"
     run_dump_test "property-12"
     run_dump_test "property-13"
+    run_dump_test "property-ldmxcsr"
+    run_dump_test "property-vldmxcsr"
+    run_dump_test "property-vzeroall"
 
     if {![istarget "*-*-dragonfly*"]
        && ![istarget "*-*-gnu*"]
diff --git a/gas/testsuite/gas/i386/property-ldmxcsr.d b/gas/testsuite/gas/i386/property-ldmxcsr.d
new file mode 100644 (file)
index 0000000..7fb546e
--- /dev/null
@@ -0,0 +1,9 @@
+#name: i386 property ldmxcsr
+#as: -mx86-used-note=yes --generate-missing-build-notes=no
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: x86-64-baseline
+       x86 feature used: x86, XMM
diff --git a/gas/testsuite/gas/i386/property-ldmxcsr.s b/gas/testsuite/gas/i386/property-ldmxcsr.s
new file mode 100644 (file)
index 0000000..8a8a399
--- /dev/null
@@ -0,0 +1,2 @@
+       .text
+       ldmxcsr (%eax)
diff --git a/gas/testsuite/gas/i386/property-vldmxcsr.d b/gas/testsuite/gas/i386/property-vldmxcsr.d
new file mode 100644 (file)
index 0000000..b913b11
--- /dev/null
@@ -0,0 +1,9 @@
+#name: i386 property vldmxcsr
+#as: -mx86-used-note=yes --generate-missing-build-notes=no
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: x86-64-baseline, x86-64-v3
+       x86 feature used: x86, XMM
diff --git a/gas/testsuite/gas/i386/property-vldmxcsr.s b/gas/testsuite/gas/i386/property-vldmxcsr.s
new file mode 100644 (file)
index 0000000..69071fe
--- /dev/null
@@ -0,0 +1,2 @@
+       .text
+       vldmxcsr (%eax)
diff --git a/gas/testsuite/gas/i386/property-vzeroall.d b/gas/testsuite/gas/i386/property-vzeroall.d
new file mode 100644 (file)
index 0000000..e1faee4
--- /dev/null
@@ -0,0 +1,9 @@
+#name: i386 property vzeroall
+#as: -mx86-used-note=yes --generate-missing-build-notes=no
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 ISA used: x86-64-baseline, x86-64-v3
+       x86 feature used: x86, XMM, YMM
diff --git a/gas/testsuite/gas/i386/property-vzeroall.s b/gas/testsuite/gas/i386/property-vzeroall.s
new file mode 100644 (file)
index 0000000..ec83d6b
--- /dev/null
@@ -0,0 +1,2 @@
+       .text
+       vzeroall