diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2005-05-17 17:26:27 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2005-05-17 17:26:27 +0000 |
commit | fc3ab699092349e7567ea846f264e1e7e166338d (patch) | |
tree | 2d722f958ed0e3cdb4b6ed50a72ce61d95be2740 /bfd/elfxx-ia64.c | |
parent | 5e27d42770ef937b86823315224cbbff12d7c856 (diff) | |
download | gdb-fc3ab699092349e7567ea846f264e1e7e166338d.zip gdb-fc3ab699092349e7567ea846f264e1e7e166338d.tar.gz gdb-fc3ab699092349e7567ea846f264e1e7e166338d.tar.bz2 |
2005-05-17 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-ia64.c (elfNN_ia64_relax_brl): Undo the change made on
2005-02-16.
Diffstat (limited to 'bfd/elfxx-ia64.c')
-rw-r--r-- | bfd/elfxx-ia64.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 0a906ec..bbf6296 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -822,39 +822,33 @@ elfNN_ia64_relax_br (bfd_byte *contents, bfd_vma off) static void elfNN_ia64_relax_brl (bfd_byte *contents, bfd_vma off) { - unsigned int template, t0, t1, t2, t3; + int template; bfd_byte *hit_addr; + bfd_vma t0, t1, i0, i1, i2; hit_addr = (bfd_byte *) (contents + off); hit_addr -= (long) hit_addr & 0x3; - t0 = bfd_getl32 (hit_addr + 0); - t1 = bfd_getl32 (hit_addr + 4); - t2 = bfd_getl32 (hit_addr + 8); - t3 = bfd_getl32 (hit_addr + 12); - - /* Turn a MLX bundle into a MBB bundle with the same stop-bit - variety. */ - template = 0x12; - if ((t0 & 0x1f) == 5) - template += 1; + t0 = bfd_getl64 (hit_addr); + t1 = bfd_getl64 (hit_addr + 8); /* Keep the instruction in slot 0. */ - t0 &= 0xffffffe0; - t1 &= 0x3fff; - - t0 |= template; - + i0 = (t0 >> 5) & 0x1ffffffffffLL; + /* Use nop.b for slot 1. */ + i1 = 0x4000000000LL; /* For slot 2, turn brl into br by masking out bit 40. */ - t2 &= 0xff800000; - t3 &= 0x7fffffff; + i2 = (t1 >> 23) & 0x0ffffffffffLL; - /* Use nop.b for slot 1. */ - t2 |= 0x100000; + /* Turn a MLX bundle into a MBB bundle with the same stop-bit + variety. */ + if (t0 & 0x1) + template = 0x13; + else + template = 0x12; + t0 = (i1 << 46) | (i0 << 5) | template; + t1 = (i2 << 23) | (i1 >> 18); - bfd_putl32 (t0, hit_addr); - bfd_putl32 (t1, hit_addr + 4); - bfd_putl32 (t2, hit_addr + 8); - bfd_putl32 (t3, hit_addr + 12); + bfd_putl64 (t0, hit_addr); + bfd_putl64 (t1, hit_addr + 8); } /* These functions do relaxation for IA-64 ELF. */ |