]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86/APX: convert runtime special case to build-time one
authorJan Beulich <jbeulich@suse.com>
Fri, 17 Jan 2025 09:28:15 +0000 (10:28 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 17 Jan 2025 09:28:15 +0000 (10:28 +0100)
cpu_flags_match() is a hot path. Move the special casing that
b7267244a355 ("Support Intel AMX-MOVRS") added there to i386-gen, thus
affecting only build time performance.

gas/config/tc-i386.c
opcodes/i386-gen.c
opcodes/i386-tbl.h

index 87926192093b16942ef739f86adf21ed34f8a050..21217db7d467b938d010643cc5a1833d72851d97 100644 (file)
@@ -2262,14 +2262,6 @@ cpu_flags_match (const insn_template *t)
             the "if()" below.  */
          gas_assert (!cpu_flags_all_zero (&all));
 
-         /* For APX_F extension of multiple cpuid enabled insns, we could not
-            use APX_F(cpuid_A&cpuid_B) since the transformation could not be
-            done. Instead, we will use cpuid_A & APX_F(cpuid_B), then the
-            "any" bitfield would not be set for cpuid_A. Set cpuid_A for "any"
-            here since it is its original meaning.  */
-         if (all.bitfield.cpuamx_transpose && any.bitfield.cpuamx_movrs)
-           any.bitfield.cpuamx_transpose = 1;
-
          cpu = cpu_flags_and (all, any);
          gas_assert (cpu_flags_equal (&cpu, &all));
 
index d2d9b5de0063987aa664a9c21376b190bdc1ed96..e21cc79d62b630000cc31dc255c19654be3973a9 100644 (file)
@@ -1039,6 +1039,20 @@ process_i386_cpu_flag (FILE *table, char *flag,
          all[Cpu64].value = 1;
 
       output_cpu_flags(table, all, ARRAY_SIZE (all), -1, comma, indent, lineno);
+
+      /* For APX_F extension of multiple cpuid enabled insns, we cannot use
+        APX_F(cpuid_A&cpuid_B) in the opcode table, as the result would fail
+        to be parsed.  Furthermore, the result also wouldn't be quite valid.
+        However, the assembler's cpu_flags_match() will simply propagate "any"
+        to "all", zapping "any" afterwards altogether.  IOW in this situation
+        both masks have "&&" meaning.  Set the missing flag here.  */
+      if (all[CpuAMX_TRANSPOSE].value && all[CpuAMX_MOVRS].value)
+       {
+         if (!any[CpuAPX_F].value || !any[CpuAMX_MOVRS].value)
+           fail ("%s: %d: internal error: APX_F=%d AMX_MOVRS=%d\n",
+                 filename, lineno, any[CpuAPX_F].value, any[CpuAMX_MOVRS].value);
+         any[CpuAMX_TRANSPOSE].value = 1;
+       }
     }
 
   output_cpu_flags (table, any, ARRAY_SIZE (any), name != NULL,
index 8f74e305b8213f5f26d946c25166951b8ce76e66..e17f56b9147ce83a19c7a0d3c61a6a5b1f9e8616 100644 (file)
@@ -43193,7 +43193,7 @@ static const insn_template i386_optab[] =
       0, 0, 0, 1, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0 },
     { { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
     { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 1, 0 } },
       { { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43203,7 +43203,7 @@ static const insn_template i386_optab[] =
       0, 0, 0, 1, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0 },
     { { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
     { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 1, 0 } },
       { { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43213,7 +43213,7 @@ static const insn_template i386_optab[] =
       0, 0, 0, 1, 0, 1, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0 },
     { { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
     { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 1, 0 } },
       { { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43223,7 +43223,7 @@ static const insn_template i386_optab[] =
       0, 0, 0, 1, 0, 1, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0 },
     { { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+    { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
     { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 1, 0 } },
       { { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,