* elf32-h8300 (h8_relax_section): Add new relaxation of mov
authorNick Clifton <nickc@redhat.com>
Thu, 21 Mar 2013 16:08:07 +0000 (16:08 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 21 Mar 2013 16:08:07 +0000 (16:08 +0000)
@(disp:32,ERx) to mov @(disp:16,ERx).
(R_H8_DISP32A16): New reloc.
Comments added and corrected.
* reloc.c (BFD_RELOC_H8_DISP32A16): New reloc.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.

* ld.texinfo (H8/300): Add description of relaxation of
mov @(disp:32,ERx) to mov @(disp:16,ERx).

* ld-h8300/h8300.exp: Add new relax-7 test on ELF.
* ld-h8300/relax-2.s: Add other direction and .w/.l variants of
mov insns.
* ld-h8300/relax-2.d: Update expected disassembly.
* ld-h8300/relax-7a.s: New: tests for mov @(disp:32,ERx) -> mov
@(disp:16,ERx).
* ld-h8300/relax-7b.s: New: Likewise.
* ld-h8300/relax-7.d: New: expected disassembly.

* config/tc-h8300.c (do_a_fix_imm): Add relaxation of mov
@(disp:32,ERx) to mov @(disp:16,ERx) insns by new reloc
R_H8_DISP32A16.
* config/tc-h8300.h: Remove duplicated defines.

22 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/elf32-h8300.c
bfd/elflink.c
bfd/libbfd.h
bfd/reloc.c
gas/ChangeLog
gas/config/tc-h8300.c
gas/config/tc-h8300.h
include/elf/ChangeLog
include/elf/h8.h
include/opcode/ChangeLog
include/opcode/h8300.h
ld/ChangeLog
ld/ld.texinfo
ld/testsuite/ChangeLog
ld/testsuite/ld-h8300/h8300.exp
ld/testsuite/ld-h8300/relax-2.d
ld/testsuite/ld-h8300/relax-2.s
ld/testsuite/ld-h8300/relax-7.d [new file with mode: 0644]
ld/testsuite/ld-h8300/relax-7a.s [new file with mode: 0644]
ld/testsuite/ld-h8300/relax-7b.s [new file with mode: 0644]

index a7d29dc34d50f74f5279c0b040e5a7c8509d02b4..8439b55c656b89137c78507057ef36c075cf11d4 100644 (file)
@@ -1,3 +1,13 @@
+2013-03-21  Michael Schewe  <michael.schewe@gmx.net>
+
+       * elf32-h8300 (h8_relax_section): Add new relaxation of mov
+       @(disp:32,ERx) to mov @(disp:16,ERx).
+       (R_H8_DISP32A16): New reloc.
+       Comments added and corrected.
+       * reloc.c (BFD_RELOC_H8_DISP32A16): New reloc.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+
 2013-03-21  Kai Tietz  <ktietz@redhat.com>
 
        * coffgen.c (coff_real_object_p): Make global.
index 2f49b1db932f0b2cbb91605a347b2abdf86fc295..55ebb79959dd1e3e86a87d0efaf9206f82cbec2d 100644 (file)
@@ -4869,6 +4869,7 @@ a matching LO8XG part.  */
   BFD_RELOC_H8_DIR24A8,
   BFD_RELOC_H8_DIR24R8,
   BFD_RELOC_H8_DIR32A16,
+  BFD_RELOC_H8_DISP32A16,
 
 /* Sony Xstormy16 Relocations.  */
   BFD_RELOC_XSTORMY16_REL_12,
index 43ac16e551a3dcd4d07d85fd646a488176bdaea6..4cfc30e3ada6129e896c1f49e5899eed32c95a79 100644 (file)
@@ -1,6 +1,5 @@
 /* BFD back-end for Renesas H8/300 ELF binaries.
-   Copyright 1993, 1995, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006,
-   2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
+   Copyright 1993-2013 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -185,7 +184,21 @@ static reloc_howto_type h8_elf_howto_table[] =
         0,                     /* src_mask */
         0xffffffff,            /* dst_mask */
         FALSE),                /* pcrel_offset */
-#define R_H8_PCREL16_X (R_H8_DIR32A16_X + 1)
+#define R_H8_DISP32A16_X (R_H8_DIR32A16_X + 1)
+  HOWTO (R_H8_DISP32A16,       /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont,/* complain_on_overflow */
+        special,               /* special_function */
+        "R_H8_DISP32A16",      /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0xffffffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+#define R_H8_PCREL16_X (R_H8_DISP32A16_X + 1)
   HOWTO (R_H8_PCREL16,         /* type */
         0,                     /* rightshift */
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
@@ -234,6 +247,7 @@ static const struct elf_reloc_map h8_reloc_map[] = {
   { BFD_RELOC_H8_DIR24A8, R_H8_DIR24A8_X },
   { BFD_RELOC_H8_DIR24R8, R_H8_DIR24R8_X },
   { BFD_RELOC_H8_DIR32A16, R_H8_DIR32A16_X },
+  { BFD_RELOC_H8_DISP32A16, R_H8_DISP32A16_X },
   { BFD_RELOC_16_PCREL, R_H8_PCREL16_X },
   { BFD_RELOC_8_PCREL, R_H8_PCREL8_X },
 };
@@ -338,6 +352,7 @@ elf32_h8_final_link_relocate (unsigned long r_type, bfd *input_bfd,
 
     case R_H8_DIR32:
     case R_H8_DIR32A16:
+    case R_H8_DISP32A16:
     case R_H8_DIR24A8:
       value += addend;
       bfd_put_32 (input_bfd, value, hit_data);
@@ -670,7 +685,9 @@ elf32_h8_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
      bset:24/32             ->    bset:16                2 bytes
      (also applicable to other bit manipulation instructions)
 
-     mov.[bwl]:24/32 ->    mov.[bwl]:16           2 bytes */
+     mov.[bwl]:24/32 ->    mov.[bwl]:16           2 bytes
+
+     mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)  4 bytes.  */
 
 static bfd_boolean
 elf32_h8_relax_section (bfd *abfd, asection *sec,
@@ -725,13 +742,19 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
         some long jumps created by the compiler.  */
       if (irel != internal_relocs)
        last_reloc = irel - 1;
-
-      if (ELF32_R_TYPE (irel->r_info) != R_H8_DIR24R8
-         && ELF32_R_TYPE (irel->r_info) != R_H8_PCREL16
-         && ELF32_R_TYPE (irel->r_info) != R_H8_DIR16A8
-         && ELF32_R_TYPE (irel->r_info) != R_H8_DIR24A8
-         && ELF32_R_TYPE (irel->r_info) != R_H8_DIR32A16)
-       continue;
+      
+      switch(ELF32_R_TYPE (irel->r_info))
+       {
+       case R_H8_DIR24R8:
+       case R_H8_PCREL16:
+       case R_H8_DIR16A8:
+       case R_H8_DIR24A8:
+       case R_H8_DIR32A16:
+       case R_H8_DISP32A16:
+         break;
+       default:
+         continue;
+       }
 
       /* Get the section contents if we haven't done so already.  */
       if (contents == NULL)
@@ -807,8 +830,8 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
         the linker is run.  */
       switch (ELF32_R_TYPE (irel->r_info))
        {
-        /* Try to turn a 24-bit absolute branch/call into an 8-bit
-          pc-relative branch/call.  */
+         /* Try to turn a 24-bit absolute branch/call into an 8-bit
+            pc-relative branch/call.  */
        case R_H8_DIR24R8:
          {
            bfd_vma value = symval + irel->r_addend;
@@ -848,19 +871,19 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                   Only perform this optimisation for jumps (code 0x5a) not
                   subroutine calls, as otherwise it could transform:
 
-                                    mov.w   r0,r0
-                                    beq     .L1
-                                    jsr     @_bar
-                             .L1:   rts
-                             _bar:  rts
+                  mov.w   r0,r0
+                  beq     .L1
+                  jsr     @_bar
+                  .L1:   rts
+                  _bar:  rts
                   into:
-                                    mov.w   r0,r0
-                                    bne     _bar
-                                    rts
-                             _bar:  rts
+                  mov.w   r0,r0
+                  bne     _bar
+                  rts
+                  _bar:  rts
 
                   which changes the call (jsr) into a branch (bne).  */
-               if (code == 0x5a
+               if (code == 0x5a        /* jmp24.  */
                    && (int) gap <= 130
                    && (int) gap >= -128
                    && last_reloc
@@ -904,7 +927,7 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                        code ^= 1;
                        bfd_put_8 (abfd,
                                   code,
-                       contents + last_reloc->r_offset - 1);
+                                  contents + last_reloc->r_offset - 1);
 
                        /* Delete four bytes of data.  */
                        if (!elf32_h8_relax_delete_bytes (abfd, sec,
@@ -918,11 +941,11 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                  }
 
                if (code == 0x5e)
-                 /* This is jsr.  */
-                 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);
+                 /* This is jsr24  */
+                 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 1);        /* bsr8. */
                else if (code == 0x5a)
-                 /* This is jmp.  */
-                 bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);
+                 /* This is jmp24  */
+                 bfd_put_8 (abfd, 0x40, contents + irel->r_offset - 1);        /* bra8. */
                else
                  abort ();
 
@@ -942,8 +965,8 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
            break;
          }
 
-       /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
-          branch.  */
+         /* Try to turn a 16-bit pc-relative branch into a 8-bit pc-relative
+            branch.  */
        case R_H8_PCREL16:
          {
            bfd_vma value = symval + irel->r_addend;
@@ -980,18 +1003,18 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                       contains the condition code.  */
                    code = bfd_get_8 (abfd, contents + irel->r_offset - 1);
 
-                   /* Compute the fisrt byte of the relaxed
+                   /* Compute the first byte of the relaxed
                       instruction.  The original sequence 0x58 0xX0
                       is relaxed to 0x4X, where X represents the
                       condition code.  */
                    code &= 0xf0;
                    code >>= 4;
                    code |= 0x40;
-                   bfd_put_8 (abfd, code, contents + irel->r_offset - 2);
+                   bfd_put_8 (abfd, code, contents + irel->r_offset - 2); /* bCC:8.  */
                  }
-               else if (code == 0x5c)
+               else if (code == 0x5c)  /* bsr16.  */
                  /* This is bsr.  */
-                 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);
+                 bfd_put_8 (abfd, 0x55, contents + irel->r_offset - 2);  /* bsr8.  */
                else
                  /* Might be MOVSD.  */
                  break;
@@ -1013,15 +1036,15 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
            break;
          }
 
-       /* This is a 16-bit absolute address in one of the following
-          instructions:
+         /* This is a 16-bit absolute address in one of the following
+            instructions:
 
             "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
             "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
             "mov.b"
 
-          We may relax this into an 8-bit absolute address if it's in
-          the right range.  */
+            We may relax this into an 8-bit absolute address if it's in
+            the right range.  */
        case R_H8_DIR16A8:
          {
            bfd_vma value;
@@ -1101,15 +1124,15 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
            break;
          }
 
-       /* This is a 24-bit absolute address in one of the following
-          instructions:
+         /* This is a 24-bit absolute address in one of the following
+            instructions:
 
             "band", "bclr", "biand", "bild", "bior", "bist", "bixor",
             "bld", "bnot", "bor", "bset", "bst", "btst", "bxor", and
             "mov.b"
 
-          We may relax this into an 8-bit absolute address if it's in
-          the right range.  */
+            We may relax this into an 8-bit absolute address if it's in
+            the right range.  */
        case R_H8_DIR24A8:
          {
            bfd_vma value;
@@ -1176,7 +1199,7 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                                             R_H8_DIR8);
                irel->r_offset--;
 
-               /* Delete two bytes of data.  */
+               /* Delete four bytes of data.  */
                if (!elf32_h8_relax_delete_bytes (abfd, sec,
                                                  irel->r_offset + 1, 4))
                  goto error_return;
@@ -1193,9 +1216,9 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
          /* This is a 24-/32-bit absolute address in one of the
             following instructions:
 
-              "band", "bclr", "biand", "bild", "bior", "bist",
-              "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
-              "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
+            "band", "bclr", "biand", "bild", "bior", "bist",
+            "bixor", "bld", "bnot", "bor", "bset", "bst", "btst",
+            "bxor", "ldc.w", "stc.w" and "mov.[bwl]"
 
             We may relax this into an 16-bit absolute address if it's
             in the right range.  */
@@ -1218,7 +1241,7 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
 
                if (irel->r_offset >= 4)
                  {
-                   /* Check for 4-byte MOVA relaxation.  */
+                   /* Check for 4-byte MOVA relaxation (SH-specific).  */
                    int second_reloc = 0;
 
                    op_ptr = contents + irel->r_offset - 4;
@@ -1239,6 +1262,7 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                            second_reloc = 1;
                          }
                      }
+
                    if (irel + 1 < irelend)
                      {
                        Elf_Internal_Rela *next_reloc = irel + 1;
@@ -1284,7 +1308,7 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                      }
                  }
 
-               /* Now check for short version of MOVA.  */
+               /* Now check for short version of MOVA.  (SH-specific) */
                op_ptr = contents + irel->r_offset - 2;
                op0 = bfd_get_8 (abfd, op_ptr + 0);
                op1 = bfd_get_8 (abfd, op_ptr + 1);
@@ -1321,9 +1345,99 @@ elf32_h8_relax_section (bfd *abfd, asection *sec,
                   Note that this is not required, and it may be slow.  */
                *again = TRUE;
              }
-           break;
+           break;      /* case R_H8_DIR32A16 */
          }
 
+       case R_H8_DISP32A16:
+         /* mov.[bwl] @(displ:24/32+ERx) -> mov.[bwl] @(displ:16+ERx)  4 bytes
+            It is assured that instruction uses at least 4 bytes opcode before
+            reloc entry addressing mode "register indirect with displacement"
+            relaxing options (all saving 4 bytes):
+            0x78 0sss0000 0x6A 0010dddd disp:32  mov.b @(d:32,ERs),Rd  ->
+            0x6E 0sssdddd disp:16  mov.b @(d:16,ERs),Rd
+            0x78 0sss0000 0x6B 0010dddd disp:32  mov.w @(d:32,ERs),Rd  ->
+            0x6F 0sssdddd disp:16  mov.w @(d:16,ERs),Rd
+            0x01 0x00 0x78 0sss0000 0x6B 00100ddd disp:32  mov.l @(d:32,ERs),ERd ->
+            0x01 0x00 0x6F 0sss0ddd disp:16  mov.l @(d:16,ERs),ERd
+
+            0x78 0ddd0000 0x6A 1010ssss disp:32  mov.b Rs,@(d:32,ERd)  ->
+            0x6E 1dddssss disp:16  mov.b Rs,@(d:16,ERd)
+            0x78 0ddd0000 0x6B 1010ssss disp:32  mov.w Rs,@(d:32,ERd)  ->
+            0x6F 1dddssss disp:16  mov.w Rs,@(d:16,ERd)
+            0x01 0x00 0x78 xddd0000 0x6B 10100sss disp:32  mov.l ERs,@(d:32,ERd) ->
+            0x01 0x00 0x6F 1ddd0sss disp:16  mov.l ERs,@(d:16,ERd)
+            mov.l prefix 0x01 0x00 can be left as is and mov.l handled same
+            as mov.w/  */
+         {
+           bfd_vma value;
+
+           value = bfd_h8300_pad_address (abfd, symval + irel->r_addend);
+           if (value <= 0x7fff || value >= 0xffff8000u)
+             {
+               unsigned char op0, op1, op2, op3, op0n, op1n;
+               int relax = 0;
+
+               /* Note that we've changed the relocs, section contents,
+                  etc.  */
+               elf_section_data (sec)->relocs = internal_relocs;
+               elf_section_data (sec)->this_hdr.contents = contents;
+               symtab_hdr->contents = (unsigned char *) isymbuf;
+
+               if (irel->r_offset >= 4)
+                 {
+                   op0 = bfd_get_8 (abfd, contents + irel->r_offset - 4);
+                   op1 = bfd_get_8 (abfd, contents + irel->r_offset - 3);
+                   op2 = bfd_get_8 (abfd, contents + irel->r_offset - 2);
+                   op3 = bfd_get_8 (abfd, contents + irel->r_offset - 1);
+
+                   if (op0 == 0x78)
+                     {
+                       switch(op2)
+                         {
+                         case 0x6A:
+                           if ((op1 & 0x8F) == 0x00 && (op3 & 0x70) == 0x20)
+                             {
+                               /* mov.b.  */
+                               op0n = 0x6E;
+                               relax = 1;
+                             }
+                           break;
+                         case 0x6B:
+                           if ((op1 & 0x0F) == 0x00 && (op3 & 0x70) == 0x20)
+                             {
+                               /* mov.w/l.  */
+                               op0n = 0x6F;
+                               relax = 1;
+                             }
+                           break;
+                         default:
+                           break;
+                         }
+                     }
+                 }
+
+               if (relax)
+                 {
+                   op1n = (op3 & 0x8F) | (op1 & 0x70);
+                   bfd_put_8 (abfd, op0n, contents + irel->r_offset - 4);
+                   bfd_put_8 (abfd, op1n, contents + irel->r_offset - 3);
+
+                   /* Fix the relocation's type.  */
+                   irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_H8_DIR16);
+                   irel->r_offset -= 2;
+
+                   /* Delete four bytes of data.  */
+                   if (!elf32_h8_relax_delete_bytes (abfd, sec, irel->r_offset + 2, 4))
+                     goto error_return;
+
+                   /* That will change things, so, we should relax again.
+                      Note that this is not required, and it may be slow.  */
+                   *again = TRUE;
+                 }
+             }
+         }
+         break;
+
        default:
          break;
        }
index 6ccf625882f39d3baa90778dd01d4bc5f85e5e46..fa805bce213b36d1a4b7577bace5ea23401bc50e 100644 (file)
@@ -4498,6 +4498,7 @@ error_free_dyn:
                 --no-add-needed is used and the reference was not
                 a weak one.  */
              if (undef_bfd != NULL
+                 && h->ref_regular_nonweak
                  && (elf_dyn_lib_class (abfd) & DYN_NO_NEEDED) != 0)
                {
                  (*_bfd_error_handler)
index 857d1ea3b720bef11d79768973a037be0a2cb4b3..6a4b5724f9919823c5ca3e1e9a1d919e1e3f07d7 100644 (file)
@@ -2349,6 +2349,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
   "BFD_RELOC_H8_DIR24A8",
   "BFD_RELOC_H8_DIR24R8",
   "BFD_RELOC_H8_DIR32A16",
+  "BFD_RELOC_H8_DISP32A16",
   "BFD_RELOC_XSTORMY16_REL_12",
   "BFD_RELOC_XSTORMY16_12",
   "BFD_RELOC_XSTORMY16_24",
index b59ca00e971211b64717d16584921801fdbe0566..e93b3b9da9df243e6187535973688761f0bfd112 100644 (file)
@@ -1,8 +1,5 @@
 /* BFD support for handling relocation entries.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
-   2012
-   Free Software Foundation, Inc.
+   Copyright 1990-2013 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -5584,6 +5581,8 @@ ENUMX
   BFD_RELOC_H8_DIR24R8
 ENUMX
   BFD_RELOC_H8_DIR32A16
+ENUMX
+  BFD_RELOC_H8_DISP32A16
 ENUMDOC
   H8 elf Relocations.
 
index 4e09946371df970bd6113357c79011a7dfcaf6ab..c36941ae7eb7e4a46377d50bf211b18b9b5015ec 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-21  Michael Schewe  <michael.schewe@gmx.net>
+
+       * config/tc-h8300.c (do_a_fix_imm): Add relaxation of mov
+       @(disp:32,ERx) to mov @(disp:16,ERx) insns by new reloc
+       R_H8_DISP32A16.
+       * config/tc-h8300.h: Remove duplicated defines.
+
 2013-03-21  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        PR gas/15282
index bbf8c0e8c152a9e6a4d68d6f12ffb2ed3adf6e65..032831b6eba5b3faafe42fa9dce89552d71b5922 100644 (file)
@@ -1,7 +1,5 @@
 /* tc-h8300.c -- Assemble code for the Renesas H8/300
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012
-   Free Software Foundation, Inc.
+   Copyright 1991-2013 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -1396,7 +1394,12 @@ do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, cons
          bytes[3] |= operand->exp.X_add_number >> 0;
          if (relaxmode != 0)
            {
-             idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
+#ifdef OBJ_ELF
+             if ((operand->mode & MODE) == DISP && relaxmode == 1)
+               idx = BFD_RELOC_H8_DISP32A16;
+             else
+#endif
+               idx = (relaxmode == 2) ? R_MOV24B1 : R_MOVL1;
              fix_new_exp (frag_now, offset, 4, &operand->exp, 0, idx);
            }
          break;
@@ -1410,6 +1413,11 @@ do_a_fix_imm (int offset, int nibble, struct h8_op *operand, int relaxmode, cons
        case L_32:
          size = 4;
          where = (operand->mode & SIZE) == L_24 ? -1 : 0;
+#ifdef OBJ_ELF
+         if ((operand->mode & MODE) == DISP && relaxmode == 1)
+           idx = BFD_RELOC_H8_DISP32A16;
+         else
+#endif
          if (relaxmode == 2)
            idx = R_MOV24B1;
          else if (relaxmode == 1)
@@ -1616,7 +1624,7 @@ build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
   for (i = 0; i < this_try->length; i++)
     output[i] = (asnibbles[i * 2] << 4) | asnibbles[i * 2 + 1];
 
-  /* Note if this is a movb or a bit manipulation instruction
+  /* Note if this is a mov.b or a bit manipulation instruction
      there is a special relaxation which only applies.  */
   if (   this_try->opcode->how == O (O_MOV,   SB)
       || this_try->opcode->how == O (O_BCLR,  SB)
@@ -1642,10 +1650,17 @@ build_bytes (const struct h8_instruction *this_try, struct h8_op *operand)
       int x_mode = x & MODE;
 
       if (x_mode == IMM || x_mode == DISP)
-       do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
-                     op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
-                     this_try);
-
+       {
+#ifndef OBJ_ELF
+         /* Remove MEMRELAX flag added in h8300.h on mov with
+            addressing mode "register indirect with displacement".  */
+         if (x_mode == DISP)
+           x &= ~MEMRELAX;
+#endif
+         do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
+                       op_at[i] & 1, operand + i, (x & MEMRELAX) != 0,
+                       this_try);
+       }
       else if (x_mode == ABS)
        do_a_fix_imm (output - frag_now->fr_literal + op_at[i] / 2,
                      op_at[i] & 1, operand + i,
index f86cf94a3e844a4dbc5775f788a15b7f7ad859b8..0a2e8280f9f40b214c5af2b0495b4b2bd255b67e 100644 (file)
@@ -1,7 +1,5 @@
 /* This file is tc-h8300.h
-   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 2000, 2001, 2002, 2003, 2005, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright 1987-2013 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -60,8 +58,6 @@ struct internal_reloc;
    ports.  */
 #define R_MOV24B1 BFD_RELOC_H8_DIR24A8
 #define R_MOVL1 BFD_RELOC_H8_DIR32A16
-#define R_MOV24B1 BFD_RELOC_H8_DIR24A8
-#define R_MOVL1 BFD_RELOC_H8_DIR32A16
 #define R_RELLONG BFD_RELOC_32
 #define R_MOV16B1 BFD_RELOC_H8_DIR16A8
 #define R_RELWORD BFD_RELOC_16
index f08ca6bea98c578a370fd88da442d4113626610f..c726592077030206b0c9e4d642fccc0e94313ac9 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-21  Michael Schewe  <michael.schewe@gmx.net>
+
+       * h8.h: Add new reloc R_H8_DISP32A16 for relaxation of
+       mov @(disp:32,ERx) to mov @(disp:16,ERx).
+
 2013-03-08  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * common.h (NT_S390_TDB): Define.
index 36aef6a254f8dbc007a76417c3615e255a23a275..2a3d905ebec23b50f479b5e7a31c342e5a2c793d 100644 (file)
@@ -1,5 +1,5 @@
 /* H8300/h8500 ELF support for BFD.
-   Copyright 2001, 2003, 2010 Free Software Foundation, Inc.
+   Copyright 2001-2013 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -23,7 +23,7 @@
 #include "elf/reloc-macros.h"
 
 /* Relocations.  */
-/* Relocations 59..63 are GNU extensions.  */
+/* Relocations 59..64 are GNU extensions.  */
 START_RELOC_NUMBERS (elf_h8_reloc_type)
   RELOC_NUMBER (R_H8_NONE, 0)
   RELOC_NUMBER (R_H8_DIR32, 1)
@@ -65,6 +65,7 @@ START_RELOC_NUMBERS (elf_h8_reloc_type)
   RELOC_NUMBER (R_H8_DIR24A8, 61)
   RELOC_NUMBER (R_H8_DIR24R8, 62)
   RELOC_NUMBER (R_H8_DIR32A16, 63)
+  RELOC_NUMBER (R_H8_DISP32A16, 64)
   RELOC_NUMBER (R_H8_ABS32, 65)
   RELOC_NUMBER (R_H8_ABS32A16, 127)
   RELOC_NUMBER (R_H8_SYM, 128)
index cc7ef5fb19e5d294487fd3d9c91b959f86cb980d..bdf990ee2a9a5fabdea8c643ce375f7cf60473c8 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-21  Michael Schewe  <michael.schewe@gmx.net>
+
+       * h8300.h: Add MEMRELAX flag for mov.b/w/l @(d:32,ERs),Rd
+       and mov.b/w/l Rs,@(d:32,ERd).
+
 2013-03-20  Alexis Deruelle  <alexis.deruelle@gmail.com>
 
        PR gas/15082
index 81b1c089410bdc85aca13533daaf75fde6fb5d0a..3296debae1f51a17a1d0d88a20e1a24f0c1e70d4 100644 (file)
@@ -1,7 +1,5 @@
 /* Opcode table for the H8/300
-   Copyright 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, 2001, 2002,
-   2003, 2004, 2005, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright 1991-2013 Free Software Foundation, Inc.
    Written by Steve Chamberlain <sac@cygnus.com>.
    
    This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler.
@@ -553,7 +551,7 @@ struct h8_opcode
   {CODE, AV_H8,   6, NAME, {{SRC, RDPREDEC,  E}}, {{                              6, OP3, B31 | RDPREDEC,   SRC,                E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST,  E}}, {{PREFIX, B30 | B20 | DISP2DST, 6, OP1, B31 | DSTDISPREG, SRC,                E}}}, \
   {CODE, AV_H8,   6, NAME, {{SRC, DISP16DST, E}}, {{                              6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \
-  {CODE, AV_H8,   6, NAME, {{SRC, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 0,    6, OP2, 10,               SRC, DSTDISP32LIST, E}}}, \
+  {CODE, AV_H8,   6, NAME, {{SRC, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 0,    6, OP2, 10,               SRC, MEMRELAX | DSTDISP32LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, 1,                    6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, 2,                    6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, 3,                    6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \
@@ -571,7 +569,7 @@ struct h8_opcode
   {CODE, AV_H8SX, 0, NAME, {{RSPREDEC,  DST, E}}, {{PREFIX, 3,                    6, OP3, B30 | RSPREDEC,  DST,             E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{DISP2SRC,  DST, E}}, {{PREFIX, B30 | B20 | DISP2SRC, 6, OP1, B30 | DISPREG,   DST,             E}}}, \
   {CODE, AV_H8,   6, NAME, {{DISP16SRC, DST, E}}, {{                              6, OP4, B30 | DISPREG,   DST, DISP16LIST, E}}}, \
-  {CODE, AV_H8,   6, NAME, {{DISP32SRC, DST, E}}, {{7, 8, B30 | DISPREG, 0,       6, OP2, 2,               DST, DISP32LIST, E}}}, \
+  {CODE, AV_H8,   6, NAME, {{DISP32SRC, DST, E}}, {{7, 8, B30 | DISPREG, 0,       6, OP2, 2,               DST, MEMRELAX | DISP32LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{INDEXB16,  DST, E}}, {{PREFIX, 1,                    6, OP4, B30 | DISPREG,   DST, DISP16LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{INDEXW16,  DST, E}}, {{PREFIX, 2,                    6, OP4, B30 | DISPREG,   DST, DISP16LIST, E}}}, \
   {CODE, AV_H8SX, 0, NAME, {{INDEXL16,  DST, E}}, {{PREFIX, 3,                    6, OP4, B30 | DISPREG,   DST, DISP16LIST, E}}}, \
@@ -1518,8 +1516,8 @@ struct h8_opcode h8_opcodes[] =
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, DISP2DST,  E}}, {{PREFIX_010,  B30 | B20 | DISP2DST, 0x6, 0x9, B31 | DSTDISPREG,  RS32, E}}}, 
   {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{RS32, DISP16DST, E}}, {{PREFIX_0100,                       0x6, 0xf, B31 | DSTDISPREG,  RS32, DSTDISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{RS32, DISP32DST, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x0,   0x6, 0xb, 0xa,               RS32, DSTDISP32LIST, E}}},
-  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100,                       0x7, 0x8, B31 | DSTDISPREG, 0x0,   0x6, 0xb, 0xa,               RS32, DSTDISP32LIST, E}}},
-  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100,                       0x7, 0x8, DSTDISPREG, 0x0,   0x6, 0xb, 0xa,               RS32, DSTDISP32LIST, E}}},
+  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100,                       0x7, 0x8, B31 | DSTDISPREG, 0x0,   0x6, 0xb, 0xa,               RS32, MEMRELAX | DSTDISP32LIST, E}}},
+  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100,                       0x7, 0x8, DSTDISPREG, 0x0,   0x6, 0xb, 0xa,               RS32, MEMRELAX | DSTDISP32LIST, E}}},
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXB16D, E}}, {{PREFIX_0101,                       0x6, 0xf, B31 | DSTDISPREG,  RS32, DSTDISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXW16D, E}}, {{PREFIX_0102,                       0x6, 0xf, B31 | DSTDISPREG,  RS32, DSTDISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXL16D, E}}, {{PREFIX_0103,                       0x6, 0xf, B31 | DSTDISPREG,  RS32, DSTDISP16LIST, E}}}, 
@@ -1537,7 +1535,7 @@ struct h8_opcode h8_opcodes[] =
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{DISP2SRC,  RD32, E}}, {{PREFIX_010,  B30 | B20 | DISP2SRC, 0x6, 0x9, B30 | DISPREG,   RD32, E}}}, 
   {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{DISP16SRC, RD32, E}}, {{PREFIX_0100,                       0x6, 0xf, B30 | DISPREG,   RD32, SRC | DISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{DISP32SRC, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x0,      0x6, 0xb, 0x2,             RD32, SRC | DISP32LIST, E}}},
-  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{DISP32SRC, RD32, E}}, {{PREFIX_0100,                       0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xb, 0x2,             RD32, SRC | DISP32LIST, E}}},
+  {O (O_MOV, SL), AV_H8H,  6, "mov.l", {{DISP32SRC, RD32, E}}, {{PREFIX_0100,                       0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xb, 0x2,             RD32, MEMRELAX | SRC | DISP32LIST, E}}},
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXB16,  RD32, E}}, {{PREFIX_0101,                       0x6, 0xf, B30 | DISPREG,   RD32, SRC | DISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXW16,  RD32, E}}, {{PREFIX_0102,                       0x6, 0xf, B30 | DISPREG,   RD32, SRC | DISP16LIST, E}}}, 
   {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXL16,  RD32, E}}, {{PREFIX_0103,                       0x6, 0xf, B30 | DISPREG,   RD32, SRC | DISP16LIST, E}}}, 
index e73314721bc34f863be3ec1fef6a60223aafc723..93a52dc5f027a2a54a3af6488262cb13fd86562f 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-21  Michael Schewe  <michael.schewe@gmx.net>
+
+       * ld.texinfo (H8/300): Add description of relaxation of
+       mov @(disp:32,ERx) to mov @(disp:16,ERx).
+
 2013-03-21  Kai Tietz  <ktietz@redhat.com>
 
        * pe-dll.c (process_def_file_and_drectve): Don't handle VC
index 1f8e34db94f5b32d15ff8cd56bdbaa6c7a41a882..7fae2c242e9fe53ef30763873fcb7ed9add4950a 100644 (file)
@@ -6078,7 +6078,7 @@ respectively.
 
 @cindex synthesizing on H8/300
 @item synthesizing instructions
-@c FIXME: specifically mov.b, or any mov instructions really?
+@c FIXME: specifically mov.b, or any mov instructions really? -> mov.b only, at least on H8, H8H, H8S
 @command{ld} finds all @code{mov.b} instructions which use the
 sixteen-bit absolute address form, but refer to the top
 page of memory, and changes them to use the eight-bit address form.
@@ -6086,6 +6086,14 @@ page of memory, and changes them to use the eight-bit address form.
 @samp{mov.b @code{@@}@var{aa}:8} whenever the address @var{aa} is in the
 top page of memory).
 
+@command{ld} finds all @code{mov} instructions which use the register
+indirect with 32-bit displacement addressing mode, but use a small
+displacement inside 16-bit displacement range, and changes them to use
+the 16-bit displacement form.  (That is: the linker turns @samp{mov.b
+@code{@@}@var{d}:32,ERx} into @samp{mov.b @code{@@}@var{d}:16,ERx}
+whenever the displacement @var{d} is in the 16 bit signed integer
+range. Only implemented in ELF-format ld).
+
 @item bit manipulation instructions
 @command{ld} finds all bit manipulation instructions like @code{band, bclr,
 biand, bild, bior, bist, bixor, bld, bnot, bor, bset, bst, btst, bxor}
index c30e3cdaecdc8a5a987aa2099f16d3006dc10601..4c1cac7b193386cc64fe4469cffaa63bc3348d43 100644 (file)
@@ -1,3 +1,14 @@
+2013-02-02  Michael Schewe  <michael.schewe@gmx.net>
+
+       * ld-h8300/h8300.exp: Add new relax-7 test on ELF.
+       * ld-h8300/relax-2.s: Add other direction and .w/.l variants of
+       mov insns.
+       * ld-h8300/relax-2.d: Update expected disassembly.
+       * ld-h8300/relax-7a.s: New: tests for mov @(disp:32,ERx) -> mov
+       @(disp:16,ERx).
+       * ld-h8300/relax-7b.s: New: Likewise.
+       * ld-h8300/relax-7.d: New: expected disassembly.
+
 2013-03-20  Venkataramanan Kumar  <venkataramanan.kumar@linaro.org>
 
        * ld-elf/group8a.d (notarget): Remove aarch64*-*-*.
index 3604dfad8e9b68628796836462f34fa2258d1691..240c7c3ec27d3ca594a26a41afe381b8badfc628 100644 (file)
@@ -1,5 +1,5 @@
 # Expect script for ld-h8300 tests
-# Copyright 2002, 2003, 2004, 2005, 2007, 2010 Free Software Foundation, Inc.
+# Copyright 2002-2013 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -35,6 +35,7 @@ if [is_elf_format] {
     run_dump_test relax-4
     run_dump_test relax-5
     run_dump_test relax-6
+    run_dump_test relax-7
     run_dump_test gcsection    
 } else {
     run_dump_test relax-3-coff
index 963139d3c9ed1db6093a5df202d12f6c88365d01..b79f5c20fcb21f57278b906c4a1ae09296ffbb87 100644 (file)
@@ -7,5 +7,15 @@
 Disassembly of section .text:
 
 00000100 <_start>:
- *100: mov.b   @0x67:8,r0l
- *102: mov.b   @0x4321:16,r0l
+ 100:  mov.b   @0x64:8,r0l
+ 102:  mov.b   r0l,@0x64:8
+ 104:  mov.b   @0x4320:16,r0l
+ 108:  mov.b   r0l,@0x4320:16
+ 10c:  mov.w   @0xff64:16,r0
+ 110:  mov.w   r0,@0xff64:16
+ 114:  mov.w   @0x4320:16,r0
+ 118:  mov.w   r0,@0x4320:16
+ 11c:  mov.l   @0xff64:16,er0
+ 122:  mov.l   er0,@0xff64:16
+ 128:  mov.l   @0x4320:16,er0
+ 12e:  mov.l   er0,@0x4320:16
index aa82dba2bbeffe8ea9f9ba828f9db37e4c530580..8e096b83863eaf55a6ad9e588101ee92f609d50f 100644 (file)
@@ -2,7 +2,19 @@
        .globl  _start
 _start:
        mov.b   @foo:16,r0l
+       mov.b   r0l,@foo:16
        mov.b   @bar:32,r0l
+       mov.b   r0l,@bar:32
 
-       .equ    foo,0xffff67
-       .equ    bar,0x4321
+       mov.w   @foo:16,r0
+       mov.w   r0,@foo:16
+       mov.w   @bar:32,r0
+       mov.w   r0,@bar:32
+
+       mov.l   @foo:16,er0
+       mov.l   er0,@foo:16
+       mov.l   @bar:32,er0
+       mov.l   er0,@bar:32
+
+       .equ    foo,0xffff64
+       .equ    bar,0x4320
diff --git a/ld/testsuite/ld-h8300/relax-7.d b/ld/testsuite/ld-h8300/relax-7.d
new file mode 100644 (file)
index 0000000..ecf1a10
--- /dev/null
@@ -0,0 +1,81 @@
+# name: H8300 Relaxation Test 7
+# source: relax-7?.s
+# ld: --relax -m h8300self
+# objdump: -d -s --no-show-raw-insn
+
+.*:     file format .*-h8300
+
+Contents of section .text:
+ 0100 1a801aa2 7a01ffff 80000100 6f2201d0  [^\000]*
+ 0110 59206e0a ff016e8a ff016e1a 00016e9a  [^\000]*
+ 0120 00015470 6f02fff2 6f82fff2 6f120002  [^\000]*
+ 0130 6f920002 54700100 6f028004 01006f82  [^\000]*
+ 0140 80040100 6f120004 01006f92 00045470  [^\000]*
+ 0150 7a000100 78006b01 fff25470 78006a2a  [^\000]*
+ 0160 ffff7ff1 78006aaa ffff7ff1 78106a2a  [^\000]*
+ 0170 00008000 78106aaa 00008000 54707800  [^\000]*
+ 0180 6b22ffff 7ffa7800 6ba2ffff 7ffa7810  [^\000]*
+ 0190 6b220000 80007810 6ba20000 80005470  [^\000]*
+ 01a0 01007800 6b2200ff ff040100 78806ba2  [^\000]*
+ 01b0 00ffff04 01007810 6b220000 80000100  [^\000]*
+ 01c0 78906ba2 00008000 5470               [^\000]*
+Contents of section .rodata:
+ 01cc 00000112 00000124 00000136 0000015c  [^\000]*
+ 01dc 0000017e 000001a0 00000150 01007800  [^\000]*
+ 01ec 6b200000 01e80000                    [^\000]*
+
+Disassembly of section .text:
+
+00000100 <_start>:
+ 100:  sub.l   er0,er0
+ 102:  sub.l   er2,er2
+ 104:  mov.l   #0xffff8000,er1
+ 10a:  mov.l   @\(0x1d0:16,er2\),er2
+ 110:  jmp     @er2
+
+00000112 <.L20>:
+ 112:  mov.b   @\(0xff01:16,er0\),r2l
+ 116:  mov.b   r2l,@\(0xff01:16,er0\)
+ 11a:  mov.b   @\(0x1:16,er1\),r2l
+ 11e:  mov.b   r2l,@\(0x1:16,er1\)
+ 122:  rts[\t]*
+
+00000124 <.L21>:
+ 124:  mov.w   @\(0xfff2:16,er0\),r2
+ 128:  mov.w   r2,@\(0xfff2:16,er0\)
+ 12c:  mov.w   @\(0x2:16,er1\),r2
+ 130:  mov.w   r2,@\(0x2:16,er1\)
+ 134:  rts[\t]*
+
+00000136 <.L22>:
+ 136:  mov.l   @\(0x8004:16,er0\),er2
+ 13c:  mov.l   er2,@\(0x8004:16,er0\)
+ 142:  mov.l   @\(0x4:16,er1\),er2
+ 148:  mov.l   er2,@\(0x4:16,er1\)
+ 14e:  rts[\t]*
+
+00000150 <.L100Relax>:
+ 150:  mov.l   #0x1007800,er0
+ 156:  mov.w   @0xfff2:16,r1
+ 15a:  rts[\t]*
+
+0000015c <.L30noRelax>:
+ 15c:  mov.b   @\(0xffff7ff1:32,er0\),r2l
+ 164:  mov.b   r2l,@\(0xffff7ff1:32,er0\)
+ 16c:  mov.b   @\(0x8000:32,er1\),r2l
+ 174:  mov.b   r2l,@\(0x8000:32,er1\)
+ 17c:  rts[\t]*
+
+0000017e <.L31noRelax>:
+ 17e:  mov.w   @\(0xffff7ffa:32,er0\),r2
+ 186:  mov.w   r2,@\(0xffff7ffa:32,er0\)
+ 18e:  mov.w   @\(0x8000:32,er1\),r2
+ 196:  mov.w   r2,@\(0x8000:32,er1\)
+ 19e:  rts[\t]*
+
+000001a0 <.L32noRelax>:
+ 1a0:  mov.l   @\(0xffff04:32,er0\),er2
+ 1aa:  mov.l   er2,@\(0xffff04:32,er0\)
+ 1b4:  mov.l   @\(0x8000:32,er1\),er2
+ 1be:  mov.l   er2,@\(0x8000:32,er1\)
+ 1c8:  rts[\t]*
diff --git a/ld/testsuite/ld-h8300/relax-7a.s b/ld/testsuite/ld-h8300/relax-7a.s
new file mode 100644 (file)
index 0000000..915fb79
--- /dev/null
@@ -0,0 +1,66 @@
+       .h8300s
+# relax expected
+       .global _start
+       .section        .text.func1,"ax",@progbits
+       .align 1
+_start:
+       sub.l   er0,er0
+       sub.l   er2,er2
+       mov.l   #var3,er1
+       mov.l   @(table+4:32,er2),er2
+       jmp     @er2
+       .section        .rodata.tab,"a",@progbits
+       .align 2
+table:
+       .long   .L20
+       .long   .L21
+       .long   .L22
+       .long   .L30noRelax
+       .long   .L31noRelax
+       .long   .L32noRelax
+       .long   .L100Relax
+       .section        .text.func1
+.L20:
+       mov.b   @(var1+1:32,er0), r2l
+       mov.b   r2l,@(var1+1:32,er0)
+       mov.b   @(1:32,er1), r2l
+       mov.b   r2l,@(1:32,er1)
+       rts
+.L21:
+       mov.w   @(var2+2:32,er0), r2
+       mov.w   r2,@(var2+2:32,er0)
+       mov.w   @(2:32,er1), r2
+       mov.w   r2,@(2:32,er1)
+       rts
+.L22:
+       mov.l   @(var3+4:32,er0), er2
+       mov.l   er2,@(var3+4:32,er0)
+       mov.l   @(4:32,er1), er2
+       mov.l   er2,@(4:32,er1)
+       rts
+
+.L100Relax:
+       mov.l   #0x01007800,er0
+# part of MOV.L @(d:24,ERs),ERd opcode
+       mov.w   @var2+2:32,r1
+       rts
+
+# no relax allowed:
+.L30noRelax:
+       mov.b   @(var4+1:32,er0), r2l
+       mov.b   r2l,@(var4+1:32,er0)
+       mov.b   @(0x8000:32,er1), r2l
+       mov.b   r2l,@(0x8000:32,er1)
+       rts
+.L31noRelax:
+       mov.w   @(var5+2:32,er0), r2
+       mov.w   r2,@(var5+2:32,er0)
+       mov.w   @(0x8000:32,er1), r2
+       mov.w   r2,@(0x8000:32,er1)
+       rts
+.L32noRelax:
+       mov.l   @(var6+4:32,er0), er2
+       mov.l   er2,@(var6+4:32,er0)
+       mov.l   @(0x8000:32,er1), er2
+       mov.l   er2,@(0x8000:32,er1)
+       rts
diff --git a/ld/testsuite/ld-h8300/relax-7b.s b/ld/testsuite/ld-h8300/relax-7b.s
new file mode 100644 (file)
index 0000000..eea9cfd
--- /dev/null
@@ -0,0 +1,19 @@
+       .h8300s
+       .global var1,var2,var3,var4,var5,var6
+
+       .equ    var1,0xffffff00
+       .equ    var2,0xfffffff0
+       .equ    var3,0xffff8000
+
+       .equ    var4,0xffff7ff0
+       .equ    var5,0xffff7ff8
+       .equ    var6,0x00ffff00
+
+       .section        .rodata.tab2,"a",@progbits
+       .align 2
+table2:                # no relax in sections other than text expected:
+       .short  0x0100
+                       # MOV.L @(d:24,ERs),ERd opcodes
+       .short  0x7800
+       .short  0x6b20
+       .long   table2