mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-01 13:26:47 +08:00
x86: Clear modrm if not needed
The MODRM byte can be checked to display the instruction name only if the MODRM byte needed. Clear modrm if the MODRM byte isn't needed so that modrm field checks in putop like, modrm.mod == N with N != 0, can be done without checking need_modrm. gas/ PR binutils/26705 * testsuite/gas/i386/x86-64-suffix.s: Add "mov %rsp,%rbp" before sysretq. * testsuite/gas/i386/x86-64-suffix-intel.d: Updated. * testsuite/gas/i386/x86-64-suffix.d: Likewise. opcodes/ PR binutils/26705 * i386-dis.c (print_insn): Clear modrm if not needed. (putop): Check need_modrm for modrm.mod != 3. Don't check need_modrm for modrm.mod == 3.
This commit is contained in:
parent
b58e7f729e
commit
0e9f3bf126
@ -1,3 +1,11 @@
|
||||
2020-10-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR binutils/26705
|
||||
* testsuite/gas/i386/x86-64-suffix.s: Add "mov %rsp,%rbp" before
|
||||
sysretq.
|
||||
* testsuite/gas/i386/x86-64-suffix-intel.d: Updated.
|
||||
* testsuite/gas/i386/x86-64-suffix.d: Likewise.
|
||||
|
||||
2020-10-05 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 26253
|
||||
|
@ -18,11 +18,13 @@ Disassembly of section .text:
|
||||
[ ]*[a-f0-9]+: cf iretd
|
||||
[ ]*[a-f0-9]+: 48 cf iretq
|
||||
[ ]*[a-f0-9]+: 0f 07 sysretd
|
||||
[ ]*[a-f0-9]+: 48 89 e5 mov rbp,rsp
|
||||
[ ]*[a-f0-9]+: 48 0f 07 sysretq
|
||||
[ ]*[a-f0-9]+: 66 cf iretw
|
||||
[ ]*[a-f0-9]+: cf iretd
|
||||
[ ]*[a-f0-9]+: cf iretd
|
||||
[ ]*[a-f0-9]+: 48 cf iretq
|
||||
[ ]*[a-f0-9]+: 0f 07 sysretd
|
||||
[ ]*[a-f0-9]+: 48 89 e5 mov rbp,rsp
|
||||
[ ]*[a-f0-9]+: 48 0f 07 sysretq
|
||||
#pass
|
||||
|
@ -17,11 +17,13 @@ Disassembly of section .text:
|
||||
[ ]*[a-f0-9]+: cf iretl
|
||||
[ ]*[a-f0-9]+: 48 cf iretq
|
||||
[ ]*[a-f0-9]+: 0f 07 sysretl
|
||||
[ ]*[a-f0-9]+: 48 89 e5 movq %rsp,%rbp
|
||||
[ ]*[a-f0-9]+: 48 0f 07 sysretq
|
||||
[ ]*[a-f0-9]+: 66 cf iretw
|
||||
[ ]*[a-f0-9]+: cf iretl
|
||||
[ ]*[a-f0-9]+: cf iretl
|
||||
[ ]*[a-f0-9]+: 48 cf iretq
|
||||
[ ]*[a-f0-9]+: 0f 07 sysretl
|
||||
[ ]*[a-f0-9]+: 48 89 e5 movq %rsp,%rbp
|
||||
[ ]*[a-f0-9]+: 48 0f 07 sysretq
|
||||
#pass
|
||||
|
@ -14,6 +14,7 @@ foo:
|
||||
iretl
|
||||
iretq
|
||||
sysretl
|
||||
mov %rsp,%rbp
|
||||
sysretq
|
||||
|
||||
.intel_syntax noprefix
|
||||
@ -22,4 +23,5 @@ foo:
|
||||
iret
|
||||
iretq
|
||||
sysretd
|
||||
mov rbp,rsp
|
||||
sysretq
|
||||
|
@ -1,3 +1,10 @@
|
||||
2020-10-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR binutils/26705
|
||||
* i386-dis.c (print_insn): Clear modrm if not needed.
|
||||
(putop): Check need_modrm for modrm.mod != 3. Don't check
|
||||
need_modrm for modrm.mod == 3.
|
||||
|
||||
2020-09-28 Przemyslaw Wirkus <przemyslaw.wirkus@arm.com>
|
||||
|
||||
* aarch64-opc.c: Added ETMv4 system registers TRCACATRn, TRCACVRn,
|
||||
|
@ -9927,7 +9927,7 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
||||
FETCH_DATA (info, codep + 1);
|
||||
threebyte = *codep;
|
||||
dp = &dis386_twobyte[threebyte];
|
||||
need_modrm = twobyte_has_modrm[*codep];
|
||||
need_modrm = twobyte_has_modrm[threebyte];
|
||||
codep++;
|
||||
}
|
||||
else
|
||||
@ -9954,6 +9954,8 @@ print_insn (bfd_vma pc, disassemble_info *info)
|
||||
modrm.reg = (*codep >> 3) & 7;
|
||||
modrm.rm = *codep & 7;
|
||||
}
|
||||
else
|
||||
memset (&modrm, 0, sizeof (modrm));
|
||||
|
||||
need_vex = 0;
|
||||
memset (&vex, 0, sizeof (vex));
|
||||
@ -10644,7 +10646,8 @@ putop (const char *in_template, int sizeflag)
|
||||
case 'A':
|
||||
if (intel_syntax)
|
||||
break;
|
||||
if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
|
||||
if ((need_modrm && modrm.mod != 3)
|
||||
|| (sizeflag & SUFFIX_ALWAYS))
|
||||
*obufp++ = 'b';
|
||||
break;
|
||||
case 'B':
|
||||
@ -10796,7 +10799,7 @@ putop (const char *in_template, int sizeflag)
|
||||
case 'P':
|
||||
if (l == 0)
|
||||
{
|
||||
if (((need_modrm && modrm.mod == 3) || !cond)
|
||||
if ((modrm.mod == 3 || !cond)
|
||||
&& !(sizeflag & SUFFIX_ALWAYS))
|
||||
break;
|
||||
/* Fall through. */
|
||||
@ -10840,7 +10843,8 @@ putop (const char *in_template, int sizeflag)
|
||||
if (intel_syntax && !alt)
|
||||
break;
|
||||
USED_REX (REX_W);
|
||||
if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
|
||||
if ((need_modrm && modrm.mod != 3)
|
||||
|| (sizeflag & SUFFIX_ALWAYS))
|
||||
{
|
||||
if (rex & REX_W)
|
||||
*obufp++ = 'q';
|
||||
|
Loading…
Reference in New Issue
Block a user