public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] x86: corrections to CPU attribute/flags splitting
@ 2023-12-22 11:26 Jan Beulich
  0 siblings, 0 replies; only message in thread
From: Jan Beulich @ 2023-12-22 11:26 UTC (permalink / raw)
  To: Binutils; +Cc: H.J. Lu

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.
---
The big endian part of the change is untested; I hope it's at least
getting close enough, but I have nowhere to test. Of course I'd more
than welcome any suggestions towards removing the endianness dependency,
as long as resulting code remains simple enough (no explicit dealing
with individual .cpu* members) and compiles to a reasonably short
sequence of insns (it's used on a hot path, after all).

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1689,21 +1689,34 @@ static i386_cpu_flags cpu_flags_from_att
   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;
 }
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -851,7 +851,16 @@ output_cpu_flags (FILE *table, bitfield
 	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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-12-22 11:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-22 11:26 [PATCH] x86: corrections to CPU attribute/flags splitting Jan Beulich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).