Commit ef573211 by Eric Botcazou Committed by Eric Botcazou

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
parent fddabb2c
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> 2004-07-06 Nathan Sidwell <nathan@codesourcery.com>
* dbxout.c (dbxout_type): Don't test whether the binfo slot of * dbxout.c (dbxout_type): Don't test whether the binfo slot of
......
...@@ -3059,8 +3059,8 @@ sparc_cannot_force_const_mem (rtx x) ...@@ -3059,8 +3059,8 @@ sparc_cannot_force_const_mem (rtx x)
static GTY(()) rtx global_offset_table; static GTY(()) rtx global_offset_table;
/* The function we use to get at it. */ /* The function we use to get at it. */
static GTY(()) rtx get_pc_symbol; static GTY(()) rtx add_pc_to_pic_symbol;
static GTY(()) char get_pc_symbol_name[256]; static GTY(()) char add_pc_to_pic_symbol_name[256];
/* Ensure that we are not using patterns that are not OK with PIC. */ /* 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) ...@@ -3643,33 +3643,33 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
static void static void
load_pic_register (void) load_pic_register (void)
{ {
/* Labels to get the PC in the prologue of this function. */
int orig_flag_pic = flag_pic; int orig_flag_pic = flag_pic;
/* If we haven't emitted the special get_pc helper function, do so now. */ /* If we haven't emitted the special helper function, do so now. */
if (get_pc_symbol_name[0] == 0) if (add_pc_to_pic_symbol_name[0] == 0)
{ {
const char *pic_name = reg_names[REGNO (pic_offset_table_rtx)];
int align; 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 (); text_section ();
align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT); align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
if (align > 0) if (align > 0)
ASM_OUTPUT_ALIGN (asm_out_file, align); ASM_OUTPUT_ALIGN (asm_out_file, align);
(*targetm.asm_out.internal_label) (asm_out_file, "LGETPC", 0); ASM_OUTPUT_LABEL (asm_out_file, add_pc_to_pic_symbol_name);
fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file); 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 /* Initialize every time through, since we can't easily
know this to be permanent. */ know this to be permanent. */
global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_"); global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
get_pc_symbol = gen_rtx_SYMBOL_REF (Pmode, get_pc_symbol_name); add_pc_to_pic_symbol = gen_rtx_SYMBOL_REF (Pmode, add_pc_to_pic_symbol_name);
flag_pic = 0;
emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
get_pc_symbol));
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; flag_pic = orig_flag_pic;
/* Need to emit this whether or not we obey regdecls, /* Need to emit this whether or not we obey regdecls,
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
(define_constants (define_constants
[(UNSPEC_MOVE_PIC 0) [(UNSPEC_MOVE_PIC 0)
(UNSPEC_UPDATE_RETURN 1) (UNSPEC_UPDATE_RETURN 1)
(UNSPEC_GET_PC 2) (UNSPEC_LOAD_PCREL_SYM 2)
(UNSPEC_MOVE_PIC_LABEL 5) (UNSPEC_MOVE_PIC_LABEL 5)
(UNSPEC_SETH44 6) (UNSPEC_SETH44 6)
(UNSPEC_SETM44 7) (UNSPEC_SETM44 7)
...@@ -1664,18 +1664,20 @@ ...@@ -1664,18 +1664,20 @@
[(set_attr "type" "branch") [(set_attr "type" "branch")
(set_attr "branch_type" "reg")]) (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" (define_insn "load_pcrel_sym"
[(clobber (reg:SI 15)) [(set (match_operand 0 "register_operand" "=r")
(set (match_operand 0 "register_operand" "=r") (unspec [(match_operand 1 "symbolic_operand" "")
(unspec [(match_operand 1 "" "") (match_operand 2 "" "")] UNSPEC_GET_PC))] (match_operand 2 "call_operand_address" "")] UNSPEC_LOAD_PCREL_SYM))
"flag_pic && REGNO (operands[0]) == 23" (clobber (reg:SI 15))]
""
"sethi\t%%hi(%a1-4), %0\n\tcall\t%a2\n\tadd\t%0, %%lo(%a1+4), %0" "sethi\t%%hi(%a1-4), %0\n\tcall\t%a2\n\tadd\t%0, %%lo(%a1+4), %0"
[(set_attr "type" "multi") [(set_attr "type" "multi")
(set_attr "length" "3")]) (set_attr "length" "3")])
;; Move instructions ;; Move instructions
(define_expand "movqi" (define_expand "movqi"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment