mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 22:48:57 +08:00
x86: make PUSH/POP disassembly uniform
Irrespective of their encoding the resulting output should look the same. Therefore wire the handling of PUSH/POP with GPR operands encoded in the main opcode byte to the same logic used for other operands. This frees up yet another macro character.
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
2020-07-15 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* i386-dis.c (dis386): Adjust 'V' description. Use P-based
|
||||||
|
construct for push/pop of register.
|
||||||
|
(putop): Honor cond when handling 'P'. Drop handling of plain
|
||||||
|
'V'.
|
||||||
|
|
||||||
2020-07-15 Jan Beulich <jbeulich@suse.com>
|
2020-07-15 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* i386-dis.c (dis386): Adjust 'P', 'T', 'U', and '@'
|
* i386-dis.c (dis386): Adjust 'P', 'T', 'U', and '@'
|
||||||
|
@ -1747,8 +1747,7 @@ struct dis386 {
|
|||||||
'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
|
'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
|
||||||
prefix or if suffix_always is true.
|
prefix or if suffix_always is true.
|
||||||
'U' unused.
|
'U' unused.
|
||||||
'V' => print 'q' in 64bit mode if instruction has no operand size
|
'V' unused.
|
||||||
prefix and behave as 'S' otherwise
|
|
||||||
'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
|
'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
|
||||||
'X' => print 's', 'd' depending on data16 prefix (for XMM)
|
'X' => print 's', 'd' depending on data16 prefix (for XMM)
|
||||||
'Y' unused.
|
'Y' unused.
|
||||||
@ -1877,23 +1876,23 @@ static const struct dis386 dis386[] = {
|
|||||||
{ "dec{S|}", { RMeSI }, 0 },
|
{ "dec{S|}", { RMeSI }, 0 },
|
||||||
{ "dec{S|}", { RMeDI }, 0 },
|
{ "dec{S|}", { RMeDI }, 0 },
|
||||||
/* 50 */
|
/* 50 */
|
||||||
{ "pushV", { RMrAX }, 0 },
|
{ "push{!P|}", { RMrAX }, 0 },
|
||||||
{ "pushV", { RMrCX }, 0 },
|
{ "push{!P|}", { RMrCX }, 0 },
|
||||||
{ "pushV", { RMrDX }, 0 },
|
{ "push{!P|}", { RMrDX }, 0 },
|
||||||
{ "pushV", { RMrBX }, 0 },
|
{ "push{!P|}", { RMrBX }, 0 },
|
||||||
{ "pushV", { RMrSP }, 0 },
|
{ "push{!P|}", { RMrSP }, 0 },
|
||||||
{ "pushV", { RMrBP }, 0 },
|
{ "push{!P|}", { RMrBP }, 0 },
|
||||||
{ "pushV", { RMrSI }, 0 },
|
{ "push{!P|}", { RMrSI }, 0 },
|
||||||
{ "pushV", { RMrDI }, 0 },
|
{ "push{!P|}", { RMrDI }, 0 },
|
||||||
/* 58 */
|
/* 58 */
|
||||||
{ "popV", { RMrAX }, 0 },
|
{ "pop{!P|}", { RMrAX }, 0 },
|
||||||
{ "popV", { RMrCX }, 0 },
|
{ "pop{!P|}", { RMrCX }, 0 },
|
||||||
{ "popV", { RMrDX }, 0 },
|
{ "pop{!P|}", { RMrDX }, 0 },
|
||||||
{ "popV", { RMrBX }, 0 },
|
{ "pop{!P|}", { RMrBX }, 0 },
|
||||||
{ "popV", { RMrSP }, 0 },
|
{ "pop{!P|}", { RMrSP }, 0 },
|
||||||
{ "popV", { RMrBP }, 0 },
|
{ "pop{!P|}", { RMrBP }, 0 },
|
||||||
{ "popV", { RMrSI }, 0 },
|
{ "pop{!P|}", { RMrSI }, 0 },
|
||||||
{ "popV", { RMrDI }, 0 },
|
{ "pop{!P|}", { RMrDI }, 0 },
|
||||||
/* 60 */
|
/* 60 */
|
||||||
{ X86_64_TABLE (X86_64_60) },
|
{ X86_64_TABLE (X86_64_60) },
|
||||||
{ X86_64_TABLE (X86_64_61) },
|
{ X86_64_TABLE (X86_64_61) },
|
||||||
@ -10647,7 +10646,8 @@ putop (const char *in_template, int sizeflag)
|
|||||||
case 'P':
|
case 'P':
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
{
|
{
|
||||||
if (need_modrm && modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS))
|
if (((need_modrm && modrm.mod == 3) || !cond)
|
||||||
|
&& !(sizeflag & SUFFIX_ALWAYS))
|
||||||
break;
|
break;
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case 'T':
|
case 'T':
|
||||||
@ -10744,17 +10744,7 @@ putop (const char *in_template, int sizeflag)
|
|||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
{
|
abort ();
|
||||||
if (intel_syntax)
|
|
||||||
break;
|
|
||||||
if (address_mode == mode_64bit
|
|
||||||
&& ((sizeflag & DFLAG) || (rex & REX_W)))
|
|
||||||
{
|
|
||||||
if (sizeflag & SUFFIX_ALWAYS)
|
|
||||||
*obufp++ = 'q';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (l == 1 && last[0] == 'L')
|
else if (l == 1 && last[0] == 'L')
|
||||||
{
|
{
|
||||||
if (rex & REX_W)
|
if (rex & REX_W)
|
||||||
|
Reference in New Issue
Block a user