ld/testsuite/

2076-02-05  H.J. Lu  <hongjiu.lu@intel.com>

	* ld-i386/pcrel16.d: Undo the last change.
	* ld-x86-64/pcrel16.d: Likewise.

opcodes/

2076-02-05  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-dis.c (OP_J): Undo the last change. Properly handle 64K
	wrap around within the same segment in 16bit mode.
This commit is contained in:
H.J. Lu 2007-02-05 18:22:49 +00:00
parent f1ab23406b
commit 65ca155d27
5 changed files with 22 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2076-02-05 H.J. Lu <hongjiu.lu@intel.com>
* ld-i386/pcrel16.d: Undo the last change.
* ld-x86-64/pcrel16.d: Likewise.
2076-02-02 H.J. Lu <hongjiu.lu@intel.com> 2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
* ld-i386/pcrel16.d: Updated. * ld-i386/pcrel16.d: Updated.

View File

@ -12,4 +12,4 @@ Disassembly of section .text:
420: cd 42[ ]+int \$0x42 420: cd 42[ ]+int \$0x42
422: ca 02 00[ ]+lret \$0x2 422: ca 02 00[ ]+lret \$0x2
... ...
f065: e9 b8 13[ ]+jmp 10420 <__bss_start\+0x3b8> f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>

View File

@ -12,4 +12,4 @@ Disassembly of section .text:
420: cd 42[ ]+int \$0x42 420: cd 42[ ]+int \$0x42
422: ca 02 00[ ]+lret \$0x2 422: ca 02 00[ ]+lret \$0x2
... ...
f065: e9 b8 13[ ]+jmp 10420 <_start\+0x10420> f065: e9 b8 13[ ]+jmp 420 <_start\+0x420>

View File

@ -1,3 +1,8 @@
2076-02-05 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (OP_J): Undo the last change. Properly handle 64K
wrap around within the same segment in 16bit mode.
2076-02-02 H.J. Lu <hongjiu.lu@intel.com> 2076-02-02 H.J. Lu <hongjiu.lu@intel.com>
* i386-dis.c (OP_J): Mask to 16bit only if there is a data16 * i386-dis.c (OP_J): Mask to 16bit only if there is a data16

View File

@ -4901,6 +4901,7 @@ OP_J (int bytemode, int sizeflag)
{ {
bfd_vma disp; bfd_vma disp;
bfd_vma mask = -1; bfd_vma mask = -1;
bfd_vma segment = 0;
switch (bytemode) switch (bytemode)
{ {
@ -4918,11 +4919,14 @@ OP_J (int bytemode, int sizeflag)
disp = get16 (); disp = get16 ();
if ((disp & 0x8000) != 0) if ((disp & 0x8000) != 0)
disp -= 0x10000; disp -= 0x10000;
/* For some reason, a data16 prefix on a jump instruction /* In 16bit mode, address is wrapped around at 64k within
means that the pc is masked to 16 bits after the the same segment. Otherwise, a data16 prefix on a jump
displacement is added! */ instruction means that the pc is masked to 16 bits after
if ((prefixes & PREFIX_DATA) != 0) the displacement is added! */
mask = 0xffff; mask = 0xffff;
if ((prefixes & PREFIX_DATA) == 0)
segment = ((start_pc + codep - start_codep)
& ~((bfd_vma) 0xffff));
} }
used_prefixes |= (prefixes & PREFIX_DATA); used_prefixes |= (prefixes & PREFIX_DATA);
break; break;
@ -4930,7 +4934,7 @@ OP_J (int bytemode, int sizeflag)
oappend (INTERNAL_DISASSEMBLER_ERROR); oappend (INTERNAL_DISASSEMBLER_ERROR);
return; return;
} }
disp = (start_pc + codep - start_codep + disp) & mask; disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
set_op (disp, 0); set_op (disp, 0);
print_operand_value (scratchbuf, 1, disp); print_operand_value (scratchbuf, 1, disp);
oappend (scratchbuf); oappend (scratchbuf);