alpha.c (struct machine_function): Add gp_save_rtx.
authorRichard Henderson <rth@redhat.com>
Fri, 2 Jul 2004 06:31:49 +0000 (23:31 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 2 Jul 2004 06:31:49 +0000 (23:31 -0700)
        * config/alpha/alpha.c (struct machine_function): Add gp_save_rtx.
        (alpha_gp_save_rtx): Use assign_stack_local instead of
        gen_mem_addressof.

From-SVN: r84015

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 28db08a6a9152852942f6e65ba78edc272509401..1987b5dec05e32e4798974f42b20b2f9a2ba8623 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-01  Richard Henderson  <rth@redhat.com>
+
+       * config/alpha/alpha.c (struct machine_function): Add gp_save_rtx.
+       (alpha_gp_save_rtx): Use assign_stack_local instead of
+       gen_mem_addressof.
+
 2004-07-01  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (struct alpha_rtx_cost_data): Add int_div.
index 66c8df184f76ce0abc5e22e992ab38d8090d7dc8..23f35ebf4f1034434e2a71f82b1bdc14569f9b69 100644 (file)
@@ -5189,6 +5189,9 @@ struct machine_function GTY(())
 
   /* For OSF.  */
   const char *some_ld_name;
+
+  /* For TARGET_LD_BUGGY_LDGP.  */
+  struct rtx_def *gp_save_rtx;
 };
 
 /* How to allocate a 'struct machine_function'.  */
@@ -5213,16 +5216,30 @@ alpha_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
   return get_hard_reg_initial_val (Pmode, REG_RA);
 }
 
-/* Return or create a pseudo containing the gp value for the current
+/* Return or create a memory slot containing the gp value for the current
    function.  Needed only if TARGET_LD_BUGGY_LDGP.  */
 
 rtx
 alpha_gp_save_rtx (void)
 {
-  rtx r = get_hard_reg_initial_val (DImode, 29);
-  if (GET_CODE (r) != MEM)
-    r = gen_mem_addressof (r, NULL_TREE, /*rescan=*/true);
-  return r;
+  rtx seq, m = cfun->machine->gp_save_rtx;
+
+  if (m == NULL)
+    {
+      start_sequence ();
+
+      m = assign_stack_local (DImode, UNITS_PER_WORD, BITS_PER_WORD);
+      m = validize_mem (m);
+      emit_move_insn (m, pic_offset_table_rtx);
+
+      seq = get_insns ();
+      end_sequence ();
+      emit_insn_after (seq, entry_of_function ());
+
+      cfun->machine->gp_save_rtx = m;
+    }
+
+  return m;
 }
 
 static int