Fix some problems that resulted in assmebler messages 'Error: pcrel too far'
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Mon, 20 Apr 1998 10:59:18 +0000 (10:59 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Mon, 20 Apr 1998 10:59:18 +0000 (11:59 +0100)
Fix some problems that resulted in assmebler messages 'Error: pcrel too far'
* sh.c (find_barrier): Fix bug in ADDR_DIFF_VEC handling.
(split_branches): Call init_insn_lengths.

From-SVN: r19339

gcc/ChangeLog
gcc/config/sh/sh.c

index 7ab8d1b8143d276c1d40df35801172de053f3660..bb392977ca32b5d09b9a5c1249c10f8a703aa7a6 100644 (file)
@@ -1,3 +1,8 @@
+Mon Apr 20 18:19:40 1998  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * sh.c (find_barrier): Fix bug in ADDR_DIFF_VEC handling.
+       (split_branches): Call init_insn_lengths.
+
 Mon Apr 20 07:37:49 1998  Michael Meissner  <meissner@cygnus.com>
 
        * i386.c: Include expr.h to get the change_address prototype
index a23990e9a21bbbc11eb92ee78122da6a73d33ab9..0c4231345c5fc67621005ac59b3f256662a1eecd 100644 (file)
@@ -1983,17 +1983,24 @@ find_barrier (num_mova, mova, from)
        {
          if (num_mova)
            num_mova--;
-         if (found_barrier == good_barrier)
+         if (barrier_align (next_real_insn (from)) == CACHE_LOG)
            {
              /* We have just passed the barrier in front front of the
-                ADDR_DIFF_VEC.  Since the ADDR_DIFF_VEC is accessed
-                as data, just like our pool constants, this is a good
-                opportunity to accommodate what we have gathered so far.
+                ADDR_DIFF_VEC, which is stored in found_barrier.  Since
+                the ADDR_DIFF_VEC is accessed as data, just like our pool
+                constants, this is a good opportunity to accommodate what
+                we have gathered so far.
                 If we waited any longer, we could end up at a barrier in
                 front of code, which gives worse cache usage for separated
                 instruction / data caches.  */
+             good_barrier = found_barrier;
              break;
            }
+         else
+           {
+             rtx body = PATTERN (from);
+             inc = XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body));
+           }
        }
 
       if (found_si)
@@ -3196,6 +3203,10 @@ split_branches (first)
        delete_insn (far_branch_list->far_label);
       far_branch_list = far_branch_list->prev;
     }
+
+  /* Instruction length information is no longer valid due to the new
+     instructions that have been generated.  */
+  init_insn_lengths ();
 }
 
 /* Dump out instruction addresses, which is useful for debugging the