sparc.c (get_pc_symbol): Rename into add_pc_to_pic_symbol.
authorEric Botcazou <ebotcazou@libertysurf.fr>
Tue, 6 Jul 2004 12:51:03 +0000 (14:51 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 6 Jul 2004 12:51:03 +0000 (12:51 +0000)
* config/sparc/sparc.c (get_pc_symbol): Rename into
add_pc_to_pic_symbol.
(get_pc_symbol_name): Rename into add_pc_to_pic_symbol_name.
(load_pic_register): Account for previous changes.
Use reg_names.  Don't create the label twice.
* config/sparc/sparc.md (UNSPEC_GET_PC): Rename into
UNSPEC_LOAD_PCREL_SYM.
(get_pc): Rename into load_pcrel_sym.  Add predicate to
operands.  Remove condition.

From-SVN: r84151

gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.md

index bb5e6694c02088660486647ae7bbbb39e53b0d73..a14897b88ace2fd1d01cbbabe743764d78cb026c 100644 (file)
@@ -1,3 +1,15 @@
+2004-07-06  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * config/sparc/sparc.c (get_pc_symbol): Rename into
+       add_pc_to_pic_symbol.
+       (get_pc_symbol_name): Rename into add_pc_to_pic_symbol_name.
+       (load_pic_register): Account for previous changes.
+       Use reg_names.  Don't create the label twice.
+       * config/sparc/sparc.md (UNSPEC_GET_PC): Rename into
+       UNSPEC_LOAD_PCREL_SYM.
+       (get_pc): Rename into load_pcrel_sym.  Add predicate to
+       operands.  Remove condition.
+
 2004-07-06  Nathan Sidwell  <nathan@codesourcery.com>
 
        * dbxout.c (dbxout_type): Don't test whether the binfo slot of
index 6bbfb601a81d1f38767354595f606fa70c432a1f..64a207d46d4132e68c3019e02d3814727f23f2ce 100644 (file)
@@ -3059,8 +3059,8 @@ sparc_cannot_force_const_mem (rtx x)
 static GTY(()) rtx global_offset_table;
 
 /* The function we use to get at it.  */
-static GTY(()) rtx get_pc_symbol;
-static GTY(()) char get_pc_symbol_name[256];
+static GTY(()) rtx add_pc_to_pic_symbol;
+static GTY(()) char add_pc_to_pic_symbol_name[256];
 
 /* Ensure that we are not using patterns that are not OK with PIC.  */
 
@@ -3643,33 +3643,33 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
 static void
 load_pic_register (void)
 {
-  /* Labels to get the PC in the prologue of this function.  */
   int orig_flag_pic = flag_pic;
 
-  /* If we haven't emitted the special get_pc helper function, do so now.  */
-  if (get_pc_symbol_name[0] == 0)
+  /* If we haven't emitted the special helper function, do so now.  */
+  if (add_pc_to_pic_symbol_name[0] == 0)
     {
+      const char *pic_name = reg_names[REGNO (pic_offset_table_rtx)];
       int align;
 
-      ASM_GENERATE_INTERNAL_LABEL (get_pc_symbol_name, "LGETPC", 0);
+      ASM_GENERATE_INTERNAL_LABEL (add_pc_to_pic_symbol_name, "LADDPC", 0);
       text_section ();
 
       align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
       if (align > 0)
        ASM_OUTPUT_ALIGN (asm_out_file, align);
-      (*targetm.asm_out.internal_label) (asm_out_file, "LGETPC", 0);
-      fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file);
+      ASM_OUTPUT_LABEL (asm_out_file, add_pc_to_pic_symbol_name);
+      fprintf (asm_out_file, "\tjmp %%o7+8\n\t add\t%%o7, %s, %s\n",
+              pic_name, pic_name);
     }
 
   /* Initialize every time through, since we can't easily
      know this to be permanent.  */
   global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
-  get_pc_symbol = gen_rtx_SYMBOL_REF (Pmode, get_pc_symbol_name);
-  flag_pic = 0;
-
-  emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
-                        get_pc_symbol));
+  add_pc_to_pic_symbol = gen_rtx_SYMBOL_REF (Pmode, add_pc_to_pic_symbol_name);
 
+  flag_pic = 0;
+  emit_insn (gen_load_pcrel_sym (pic_offset_table_rtx, global_offset_table,
+                                add_pc_to_pic_symbol));
   flag_pic = orig_flag_pic;
 
   /* Need to emit this whether or not we obey regdecls,
index 622f7879cbc408c47d4c9c8e031521687c3b6ac2..021ddd164b1f3b11bdd1b7d6533be3157edb1511 100644 (file)
@@ -27,7 +27,7 @@
 (define_constants
   [(UNSPEC_MOVE_PIC            0)
    (UNSPEC_UPDATE_RETURN       1)
-   (UNSPEC_GET_PC              2)
+   (UNSPEC_LOAD_PCREL_SYM      2)
    (UNSPEC_MOVE_PIC_LABEL      5)
    (UNSPEC_SETH44              6)
    (UNSPEC_SETM44              7)
   [(set_attr "type" "branch")
    (set_attr "branch_type" "reg")])
 \f
-;; Load program counter insns.
+;; Load in operand 0 the (absolute) address of operand 1, which is a symbolic
+;; value subject to a PC-relative relocation.  Operand 2 is a helper function
+;; that adds the PC value at the call point to operand 0.
 
-(define_insn "get_pc"
-  [(clobber (reg:SI 15))
-   (set (match_operand 0 "register_operand" "=r")
-       (unspec [(match_operand 1 "" "") (match_operand 2 "" "")] UNSPEC_GET_PC))]
-  "flag_pic && REGNO (operands[0]) == 23"
+(define_insn "load_pcrel_sym"
+  [(set (match_operand 0 "register_operand" "=r")
+       (unspec [(match_operand 1 "symbolic_operand" "")
+                (match_operand 2 "call_operand_address" "")] UNSPEC_LOAD_PCREL_SYM))
+   (clobber (reg:SI 15))]
+  ""
   "sethi\t%%hi(%a1-4), %0\n\tcall\t%a2\n\tadd\t%0, %%lo(%a1+4), %0"
   [(set_attr "type" "multi")
    (set_attr "length" "3")])
-
 \f
 ;; Move instructions