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:
H.J. Lu 2020-10-05 05:23:29 -07:00
parent b58e7f729e
commit 0e9f3bf126
6 changed files with 29 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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';