summaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2007-02-05 18:22:49 +0000
committerH.J. Lu <hjl@lucon.org>2007-02-05 18:22:49 +0000
commite5d622d0c0f4562eb278c7029307e819e9ce95a3 (patch)
treecfdbcf8c49516500281276ea8448fd8b37a21aba /opcodes
parentdaf6fcbda4422ae1aff9cf65d1ea5e2ae9fe8742 (diff)
downloadbinutils-redhat-e5d622d0c0f4562eb278c7029307e819e9ce95a3.tar.gz
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.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/i386-dis.c16
2 files changed, 15 insertions, 6 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 2321dfab3f..74f6d879c5 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -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>
* i386-dis.c (OP_J): Mask to 16bit only if there is a data16
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 5ecc143559..509cc5d38a 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -4901,6 +4901,7 @@ OP_J (int bytemode, int sizeflag)
{
bfd_vma disp;
bfd_vma mask = -1;
+ bfd_vma segment = 0;
switch (bytemode)
{
@@ -4918,11 +4919,14 @@ OP_J (int bytemode, int sizeflag)
disp = get16 ();
if ((disp & 0x8000) != 0)
disp -= 0x10000;
- /* For some reason, a data16 prefix on a jump instruction
- means that the pc is masked to 16 bits after the
- displacement is added! */
- if ((prefixes & PREFIX_DATA) != 0)
- mask = 0xffff;
+ /* In 16bit mode, address is wrapped around at 64k within
+ the same segment. Otherwise, a data16 prefix on a jump
+ instruction means that the pc is masked to 16 bits after
+ the displacement is added! */
+ mask = 0xffff;
+ if ((prefixes & PREFIX_DATA) == 0)
+ segment = ((start_pc + codep - start_codep)
+ & ~((bfd_vma) 0xffff));
}
used_prefixes |= (prefixes & PREFIX_DATA);
break;
@@ -4930,7 +4934,7 @@ OP_J (int bytemode, int sizeflag)
oappend (INTERNAL_DISASSEMBLER_ERROR);
return;
}
- disp = (start_pc + codep - start_codep + disp) & mask;
+ disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
set_op (disp, 0);
print_operand_value (scratchbuf, 1, disp);
oappend (scratchbuf);