x86: make I disassembler macro available for new use
authorJan Beulich <jbeulich@suse.com>
Fri, 26 Jun 2020 14:44:31 +0000 (16:44 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 26 Jun 2020 14:44:31 +0000 (16:44 +0200)
The {Q|Q} construct on lgdt/lidt and the slightly different {Q|IQ}
struck me as odd when encountering. Realizing they both have the same
effect, let's free up the I macro by using the former form of construct
where needed (there aren't that many uses overall).

With there now being several multi-character macros also re-do "alt"
handling slightly: Terminate it when finding the closing brace, rather
than after the next single character. Also set the flag only when
actually in Intel syntax mode.

opcodes/ChangeLog
opcodes/i386-dis.c

index dfc94fbfbbeeaa012704ddd55947428964416479..8cb59605217b417c80a6ccd530e7c82ada6f328b 100644 (file)
@@ -1,3 +1,10 @@
+2020-06-26  Jan Beulich  <jbeulich@suse.com>
+
+       * i386-dis.c: Adjust description of I macro.
+       (x86_64_table): Drop use of I.
+       (float_mem): Replace use of I.
+       (putop): Remove handling of I. Adjust setting/clearing of "alt".
+
 2020-06-26  Jan Beulich  <jbeulich@suse.com>
 
        * i386-dis.c: (print_insn): Avoid straight assignment to
index f57409dd17a89a2326f3a1689763dfec47682641..e1ebb485535a84b2a03aa68a9fbba175149cf69e 100644 (file)
@@ -2250,8 +2250,7 @@ struct dis386 {
    'F' => print 'w' or 'l' depending on address size prefix (loop insns)
    'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
    'H' => print ",pt" or ",pn" branch hint
-   'I' => honor following macro letter even in Intel mode (implemented only
-         for some of the macro letters)
+   'I' unused.
    'J' unused.
    'K' => print 'd' or 'q' if rex prefix is present.
    'L' => print 'l' if suffix_always is true
@@ -6918,13 +6917,13 @@ static const struct dis386 x86_64_table[][2] = {
 
   /* X86_64_0F01_REG_0 */
   {
-    { "sgdt{Q|IQ}", { M }, 0 },
+    { "sgdt{Q|Q}", { M }, 0 },
     { "sgdt", { M }, 0 },
   },
 
   /* X86_64_0F01_REG_1 */
   {
-    { "sidt{Q|IQ}", { M }, 0 },
+    { "sidt{Q|Q}", { M }, 0 },
     { "sidt", { M }, 0 },
   },
 
@@ -12323,9 +12322,9 @@ static const char *float_mem[] = {
   "(bad)",
   "fst{s|}",
   "fstp{s|}",
-  "fldenvIC",
+  "fldenv{C|C}",
   "fldcw",
-  "fNstenvIC",
+  "fNstenv{C|C}",
   "fNstcw",
   /* da */
   "fiadd{l|}",
@@ -12359,9 +12358,9 @@ static const char *float_mem[] = {
   "fisttp{ll|}",
   "fst{l||}",
   "fstp{l|}",
-  "frstorIC",
+  "frstor{C|C}",
   "(bad)",
-  "fNsaveIC",
+  "fNsave{C|C}",
   "fNstsw",
   /* de */
   "fiadd{s|}",
@@ -12735,11 +12734,9 @@ putop (const char *in_template, int sizeflag)
              while (*++p != '|')
                if (*p == '}' || *p == '\0')
                  abort ();
+             alt = 1;
            }
-         /* Fall through.  */
-       case 'I':
-         alt = 1;
-         continue;
+         break;
        case '|':
          while (*++p != '}')
            {
@@ -12748,6 +12745,7 @@ putop (const char *in_template, int sizeflag)
            }
          break;
        case '}':
+         alt = 0;
          break;
        case 'A':
          if (intel_syntax)
@@ -13283,7 +13281,6 @@ putop (const char *in_template, int sizeflag)
            }
          break;
        }
-      alt = 0;
     }
   *obufp = 0;
   mnemonicendp = obufp;