x86: make I disassembler macro available for new use

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.
This commit is contained in:
Jan Beulich
2020-06-26 16:44:31 +02:00
parent 198e1db737
commit d1c361252b
2 changed files with 17 additions and 13 deletions

View 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> 2020-06-26 Jan Beulich <jbeulich@suse.com>
* i386-dis.c: (print_insn): Avoid straight assignment to * i386-dis.c: (print_insn): Avoid straight assignment to

View File

@ -2250,8 +2250,7 @@ struct dis386 {
'F' => print 'w' or 'l' depending on address size prefix (loop insns) '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) 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
'H' => print ",pt" or ",pn" branch hint 'H' => print ",pt" or ",pn" branch hint
'I' => honor following macro letter even in Intel mode (implemented only 'I' unused.
for some of the macro letters)
'J' unused. 'J' unused.
'K' => print 'd' or 'q' if rex prefix is present. 'K' => print 'd' or 'q' if rex prefix is present.
'L' => print 'l' if suffix_always is true '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 */ /* X86_64_0F01_REG_0 */
{ {
{ "sgdt{Q|IQ}", { M }, 0 }, { "sgdt{Q|Q}", { M }, 0 },
{ "sgdt", { M }, 0 }, { "sgdt", { M }, 0 },
}, },
/* X86_64_0F01_REG_1 */ /* X86_64_0F01_REG_1 */
{ {
{ "sidt{Q|IQ}", { M }, 0 }, { "sidt{Q|Q}", { M }, 0 },
{ "sidt", { M }, 0 }, { "sidt", { M }, 0 },
}, },
@ -12323,9 +12322,9 @@ static const char *float_mem[] = {
"(bad)", "(bad)",
"fst{s|}", "fst{s|}",
"fstp{s|}", "fstp{s|}",
"fldenvIC", "fldenv{C|C}",
"fldcw", "fldcw",
"fNstenvIC", "fNstenv{C|C}",
"fNstcw", "fNstcw",
/* da */ /* da */
"fiadd{l|}", "fiadd{l|}",
@ -12359,9 +12358,9 @@ static const char *float_mem[] = {
"fisttp{ll|}", "fisttp{ll|}",
"fst{l||}", "fst{l||}",
"fstp{l|}", "fstp{l|}",
"frstorIC", "frstor{C|C}",
"(bad)", "(bad)",
"fNsaveIC", "fNsave{C|C}",
"fNstsw", "fNstsw",
/* de */ /* de */
"fiadd{s|}", "fiadd{s|}",
@ -12735,11 +12734,9 @@ putop (const char *in_template, int sizeflag)
while (*++p != '|') while (*++p != '|')
if (*p == '}' || *p == '\0') if (*p == '}' || *p == '\0')
abort (); abort ();
alt = 1;
} }
/* Fall through. */ break;
case 'I':
alt = 1;
continue;
case '|': case '|':
while (*++p != '}') while (*++p != '}')
{ {
@ -12748,6 +12745,7 @@ putop (const char *in_template, int sizeflag)
} }
break; break;
case '}': case '}':
alt = 0;
break; break;
case 'A': case 'A':
if (intel_syntax) if (intel_syntax)
@ -13283,7 +13281,6 @@ putop (const char *in_template, int sizeflag)
} }
break; break;
} }
alt = 0;
} }
*obufp = 0; *obufp = 0;
mnemonicendp = obufp; mnemonicendp = obufp;