arm-protos.h (arm_load_pic_register): Update prototype.
authorPaul Brook <paul@codesourcery.com>
Wed, 13 Oct 2004 12:48:03 +0000 (12:48 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Wed, 13 Oct 2004 12:48:03 +0000 (12:48 +0000)
* config/arm/arm-protos.h (arm_load_pic_register): Update prototype.
* config/arm/arm.c (thumb_find_work_register): Update comments.
(arm_load_pic_register): Add argument for scratch register.
(arm_expand_prologue, thumb_expand_prologue): Pass extra argument.
* config/arm/arm.md (builtin_setjmp_receiver): Ditto.

From-SVN: r88982

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.md

index c1c84c5..57bdab3 100644 (file)
@@ -1,3 +1,11 @@
+2004-10-13  Paul Brook  <paul@codesourcery.com>
+
+       * config/arm/arm-protos.h (arm_load_pic_register): Update prototype.
+       * config/arm/arm.c (thumb_find_work_register): Update comments.
+       (arm_load_pic_register): Add argument for scratch register.
+       (arm_expand_prologue, thumb_expand_prologue): Pass extra argument.
+       * config/arm/arm.md (builtin_setjmp_receiver): Ditto.
+
 2004-10-13  Kazu Hirata  <kazu@cs.umass.edu>
 
        * tree-data-ref.c: Fix comment typos.
@@ -30,7 +38,7 @@
        * gcse.c (remove_reachable_equiv_notes): Use ei_container().
 
 2004-10-11  Sebastian Pop  <pop@cri.ensmp.fr>
+
        * Makefile.in (tree-ssa-loop-niter.o): Depends on tree-data-ref.h.
        * cfgloop.c (initialize_loops_parallel_p): New.
        (flow_loops_find): Initialize the parallel_p field to true for all 
index 7a75002..44a259f 100644 (file)
@@ -27,7 +27,7 @@
 extern void arm_override_options (void);
 extern int use_return_insn (int, rtx);
 extern int arm_regno_class (int);
-extern void arm_load_pic_register (void);
+extern void arm_load_pic_register (unsigned int);
 extern int arm_volatile_func (void);
 extern const char *arm_output_epilogue (rtx);
 extern void arm_expand_prologue (void);
index 3fe1d28..02ee7ca 100644 (file)
@@ -3023,7 +3023,8 @@ thumb_find_work_register (int live_regs_mask)
   if (!regs_ever_live[LAST_ARG_REGNUM])
     return LAST_ARG_REGNUM;
 
-  /* Look for a pushed register.  */
+  /* Look for a pushed register.  This is used before the frame pointer is
+     setup, so r7 is a candidate.  */
   for (reg = LAST_LO_REGNUM; reg >=0; reg--)
     if (live_regs_mask & (1 << reg))
       return reg;
@@ -3033,10 +3034,11 @@ thumb_find_work_register (int live_regs_mask)
 }
 
 
-/* Generate code to load the PIC register.  */
+/* Generate code to load the PIC register.  In thumb mode SCRATCH is a
+   low register.  */
 
 void
-arm_load_pic_register (void)
+arm_load_pic_register (unsigned int scratch)
 {
 #ifndef AOF_ASSEMBLER
   rtx l1, pic_tmp, pic_tmp2, pic_rtx;
@@ -3071,12 +3073,9 @@ arm_load_pic_register (void)
     {
       if (REGNO (pic_offset_table_rtx) > LAST_LO_REGNUM)
        {
-         int reg;
-
          /* We will have pushed the pic register, so should always be
             able to find a work register.  */
-         reg = thumb_find_work_register (thumb_compute_save_reg_mask ());
-         pic_tmp = gen_rtx_REG (SImode, reg);
+         pic_tmp = gen_rtx_REG (SImode, scratch);
          emit_insn (gen_pic_load_addr_thumb (pic_tmp, pic_rtx));
          emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp));
        }
@@ -10237,7 +10236,7 @@ arm_expand_prologue (void)
 
 
   if (flag_pic)
-    arm_load_pic_register ();
+    arm_load_pic_register (INVALID_REGNUM);
 
   /* If we are profiling, make sure no instructions are scheduled before
      the call to mcount.  Similarly if the user has requested no
@@ -12964,10 +12963,11 @@ thumb_expand_prologue (void)
       return;
     }
 
+  live_regs_mask = thumb_compute_save_reg_mask ();
   /* Load the pic register before setting the frame pointer, so we can use r7
      as a temporary work register.  */
   if (flag_pic)
-    arm_load_pic_register ();
+    arm_load_pic_register (thumb_find_work_register (live_regs_mask));
 
   offsets = arm_get_frame_offsets ();
 
@@ -12978,7 +12978,6 @@ thumb_expand_prologue (void)
       RTX_FRAME_RELATED_P (insn) = 1;
     }
 
-  live_regs_mask = thumb_compute_save_reg_mask ();
   amount = offsets->outgoing_args - offsets->saved_regs;
   if (amount)
     {
index 86113e7..6c07a85 100644 (file)
   "flag_pic"
   "
 {
-  arm_load_pic_register ();
+  /* r3 is clobbered by set/longjmp, so we can use it as a scratch
+     register.  */
+  arm_load_pic_register (3);
   DONE;
 }")