Fix the partial disassembly of a broken three byte instruction at the end of a function.

opcodes	* i386-dis.c (print_insn): Fix decoding of three byte operands.

tests	* gas/i386/intel.s: Add test of disassembly of a potential
	three byte instuction at the end of a function.
	* gas/i386/intel.d: Update expected disassembly.
This commit is contained in:
Jan Stancek 2015-08-24 14:50:15 +01:00 committed by Nick Clifton
parent 77c365df78
commit 5f40e14d76
5 changed files with 29 additions and 2 deletions

View file

@ -1,3 +1,9 @@
2015-08-24 Jan Stancek <jstancek@redhat.com>
* gas/i386/intel.s: Add test of disassembly of a potential
three byte instuction at the end of a function.
* gas/i386/intel.d: Update expected disassembly.
2015-08-21 Nick Clifton <nickc@redhat.com>
PR gas/18581

View file

@ -698,4 +698,8 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%edx
[ ]*[a-f0-9]+: 66 0f 4a 90 90 90 90 90 cmovp -0x6f6f6f70\(%eax\),%dx
[ ]*[a-f0-9]+: 66 0f 4b 90 90 90 90 90 cmovnp -0x6f6f6f70\(%eax\),%dx
[ ]*[a-f0-9]+: 24 2f and \$0x2f,%al
[ ]*[a-f0-9]+: 0f \.byte 0xf
[a-f0-9]+ <barn>:
[ ]*[a-f0-9]+: 0f ba e2 03 bt \$0x3,%edx
#pass

View file

@ -698,3 +698,14 @@ fidivr dword ptr [ebx]
cmovpo edx, 0x90909090[eax]
cmovpe dx, 0x90909090[eax]
cmovpo dx, 0x90909090[eax]
# Test that disassembly of a partial instruction shows the partial byte:
# https://www.sourceware.org/ml/binutils/2015-08/msg00226.html
.byte 0x24
.byte 0x2f
.byte 0x0f
barn:
.byte 0x0f
.byte 0xba
.byte 0xe2
.byte 0x03

View file

@ -1,3 +1,7 @@
2015-08-24 Jan Stancek <jstancek@redhat.com>
* i386-dis.c (print_insn): Fix decoding of three byte operands.
2015-08-21 Alexander Fomin <alexander.fomin@intel.com>
PR binutils/18257

View file

@ -13438,8 +13438,10 @@ print_insn (bfd_vma pc, disassemble_info *info)
if (*codep == 0x0f)
{
unsigned char threebyte;
FETCH_DATA (info, codep + 2);
threebyte = *++codep;
codep++;
FETCH_DATA (info, codep + 1);
threebyte = *codep;
dp = &dis386_twobyte[threebyte];
need_modrm = twobyte_has_modrm[*codep];
codep++;