From: Eric Botcazou Date: Tue, 6 Jul 2004 12:51:03 +0000 (+0200) Subject: sparc.c (get_pc_symbol): Rename into add_pc_to_pic_symbol. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ef5732117a3c18e1ba3dc3670e6933f3c795dfcf;p=gcc.git sparc.c (get_pc_symbol): Rename into add_pc_to_pic_symbol. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bb5e6694c02..a14897b88ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2004-07-06 Eric Botcazou + + * 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 * dbxout.c (dbxout_type): Don't test whether the binfo slot of diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 6bbfb601a81..64a207d46d4 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -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, diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index 622f7879cbc..021ddd164b1 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -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) @@ -1664,17 +1664,19 @@ [(set_attr "type" "branch") (set_attr "branch_type" "reg")]) -;; 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")]) - ;; Move instructions