x86: corrections to CPU attribute/flags splitting
authorJan Beulich <jbeulich@suse.com>
Fri, 5 Jan 2024 07:20:23 +0000 (08:20 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 5 Jan 2024 07:20:23 +0000 (08:20 +0100)
There are a number of issues with 734dfd1cc966 ("x86: pack CPU flags in
opcode table"):
- the condition when two array slots need writing wasn't correct (with
  enough new Cpu* added an out of bounds array access would validly have
  been complained about by the compiler),
- table generation didn't take into account CpuAttrUnused and CpuUnused
  being independent, and hence there not always (not) being an "unused"
  bitfield member in both structures,
- cpu_flags_from_attr() wasn't ready for use on big-endian hosts,
- there were two style violations.

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

index 172b051..f4feca0 100644 (file)
@@ -1702,21 +1702,34 @@ static i386_cpu_flags cpu_flags_from_attr (i386_cpu_attr a)
   const unsigned int bps = sizeof (a.array[0]) * CHAR_BIT;
   i386_cpu_flags f = { .array[0] = 0 };
 
-  switch (ARRAY_SIZE(a.array))
+  switch (ARRAY_SIZE (a.array))
     {
     case 1:
       f.array[CpuAttrEnums / bps]
-        |= (a.array[0] >> CpuIsaBits) << (CpuAttrEnums % bps);
-      if (CpuAttrEnums % bps > CpuIsaBits)
+#ifndef WORDS_BIGENDIAN
+       |= (a.array[0] >> CpuIsaBits) << (CpuAttrEnums % bps);
+#else
+       |= (a.array[0] << CpuIsaBits) >> (CpuAttrEnums % bps);
+#endif
+      if (CpuMax / bps > CpuAttrEnums / bps)
        f.array[CpuAttrEnums / bps + 1]
+#ifndef WORDS_BIGENDIAN
          = (a.array[0] >> CpuIsaBits) >> (bps - CpuAttrEnums % bps);
+#else
+         = (a.array[0] << CpuIsaBits) << (bps - CpuAttrEnums % bps);
+#endif
       break;
+
     default:
       abort ();
     }
 
   if (a.bitfield.isa)
+#ifndef WORDS_BIGENDIAN
     f.array[(a.bitfield.isa - 1) / bps] |= 1u << ((a.bitfield.isa - 1) % bps);
+#else
+    f.array[(a.bitfield.isa - 1) / bps] |= 1u << (~(a.bitfield.isa - 1) % bps);
+#endif
 
   return f;
 }
index 09b0ccc..a54635e 100644 (file)
@@ -856,7 +856,16 @@ output_cpu_flags (FILE *table, bitfield *flags, unsigned int size,
        active_cpu_flags.array[i / 32] |= 1U << (i % 32);
     }
 
-  fprintf (table, "%d } }%s\n", flags[i].value, comma);
+#if defined(CpuAttrUnused) != defined(CpuUnused)
+  if (mode <= 0)
+# ifdef CpuUnused
+    fprintf (table, " } }%s\n", comma);
+# else
+    fprintf (table, "%d, 0 } }%s\n", flags[i].value, comma);
+# endif
+  else
+#endif
+    fprintf (table, "%d } }%s\n", flags[i].value, comma);
 }
 
 static void