pa.c (hppa_profile_hook): Split gen_call_profiler into separate insns.
* pa.c (hppa_profile_hook): Split gen_call_profiler into separate insns. Use the regular call expander for the call to the profiler. * pa.md (call_profiler): Delete. (load_offset_label_address): New insn to load the address of the current function for the profiler. (lcla1, lcla2): New insns to output a code label and load its address. Co-Authored-By: John David Anglin <dave.anglin@nrc-cnrc.gc.ca> From-SVN: r74004
This commit is contained in:
parent
a27b9e3c6f
commit
a3d4c92f8a
@ -1,3 +1,13 @@
|
|||||||
|
2003-11-27 Randolph Chung <tausq@debian.org>
|
||||||
|
John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||||
|
|
||||||
|
* pa.c (hppa_profile_hook): Split gen_call_profiler into separate
|
||||||
|
insns. Use the regular call expander for the call to the profiler.
|
||||||
|
* pa.md (call_profiler): Delete.
|
||||||
|
(load_offset_label_address): New insn to load the address of the
|
||||||
|
current function for the profiler.
|
||||||
|
(lcla1, lcla2): New insns to output a code label and load its address.
|
||||||
|
|
||||||
2003-11-27 Kazu Hirata <kazu@cs.umass.edu>
|
2003-11-27 Kazu Hirata <kazu@cs.umass.edu>
|
||||||
|
|
||||||
* final.c (final_scan_insn): Remove commented-out code.
|
* final.c (final_scan_insn): Remove commented-out code.
|
||||||
|
@ -4039,12 +4039,17 @@ hppa_pic_save_rtx (void)
|
|||||||
void
|
void
|
||||||
hppa_profile_hook (int label_no)
|
hppa_profile_hook (int label_no)
|
||||||
{
|
{
|
||||||
|
/* We use SImode for the address of the function in both 32 and
|
||||||
|
64-bit code to avoid having to provide DImode versions of the
|
||||||
|
lcla2 and load_offset_label_address insn patterns. */
|
||||||
|
rtx reg = gen_reg_rtx (SImode);
|
||||||
|
rtx label_rtx = gen_label_rtx ();
|
||||||
rtx begin_label_rtx, call_insn;
|
rtx begin_label_rtx, call_insn;
|
||||||
char begin_label_name[16];
|
char begin_label_name[16];
|
||||||
|
|
||||||
ASM_GENERATE_INTERNAL_LABEL (begin_label_name, FUNC_BEGIN_PROLOG_LABEL,
|
ASM_GENERATE_INTERNAL_LABEL (begin_label_name, FUNC_BEGIN_PROLOG_LABEL,
|
||||||
label_no);
|
label_no);
|
||||||
begin_label_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (begin_label_name));
|
begin_label_rtx = gen_rtx_SYMBOL_REF (SImode, ggc_strdup (begin_label_name));
|
||||||
|
|
||||||
if (TARGET_64BIT)
|
if (TARGET_64BIT)
|
||||||
emit_move_insn (arg_pointer_rtx,
|
emit_move_insn (arg_pointer_rtx,
|
||||||
@ -4053,6 +4058,18 @@ hppa_profile_hook (int label_no)
|
|||||||
|
|
||||||
emit_move_insn (gen_rtx_REG (word_mode, 26), gen_rtx_REG (word_mode, 2));
|
emit_move_insn (gen_rtx_REG (word_mode, 26), gen_rtx_REG (word_mode, 2));
|
||||||
|
|
||||||
|
/* The address of the function is loaded into %r25 with a instruction-
|
||||||
|
relative sequence that avoids the use of relocations. The sequence
|
||||||
|
is split so that the load_offset_label_address instruction can
|
||||||
|
occupy the delay slot of the call to _mcount. */
|
||||||
|
if (TARGET_PA_20)
|
||||||
|
emit_insn (gen_lcla2 (reg, label_rtx));
|
||||||
|
else
|
||||||
|
emit_insn (gen_lcla1 (reg, label_rtx));
|
||||||
|
|
||||||
|
emit_insn (gen_load_offset_label_address (gen_rtx_REG (SImode, 25),
|
||||||
|
reg, begin_label_rtx, label_rtx));
|
||||||
|
|
||||||
#ifndef NO_PROFILE_COUNTERS
|
#ifndef NO_PROFILE_COUNTERS
|
||||||
{
|
{
|
||||||
rtx count_label_rtx, addr, r24;
|
rtx count_label_rtx, addr, r24;
|
||||||
@ -4065,35 +4082,31 @@ hppa_profile_hook (int label_no)
|
|||||||
r24 = gen_rtx_REG (Pmode, 24);
|
r24 = gen_rtx_REG (Pmode, 24);
|
||||||
emit_move_insn (r24, addr);
|
emit_move_insn (r24, addr);
|
||||||
|
|
||||||
/* %r25 is set from within the output pattern. */
|
|
||||||
call_insn =
|
call_insn =
|
||||||
emit_call_insn (gen_call_profiler (gen_rtx_SYMBOL_REF (Pmode, "_mcount"),
|
emit_call_insn (gen_call (gen_rtx_MEM (Pmode,
|
||||||
GEN_INT (TARGET_64BIT ? 24 : 12),
|
gen_rtx_SYMBOL_REF (Pmode,
|
||||||
begin_label_rtx));
|
"_mcount")),
|
||||||
|
GEN_INT (TARGET_64BIT ? 24 : 12)));
|
||||||
|
|
||||||
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), r24);
|
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), r24);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* %r25 is set from within the output pattern. */
|
|
||||||
call_insn =
|
call_insn =
|
||||||
emit_call_insn (gen_call_profiler (gen_rtx_SYMBOL_REF (Pmode, "_mcount"),
|
emit_call_insn (gen_call (gen_rtx_MEM (Pmode,
|
||||||
GEN_INT (TARGET_64BIT ? 16 : 8),
|
gen_rtx_SYMBOL_REF (Pmode,
|
||||||
begin_label_rtx));
|
"_mcount")),
|
||||||
|
GEN_INT (TARGET_64BIT ? 16 : 8)));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 25));
|
||||||
|
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), gen_rtx_REG (SImode, 26));
|
||||||
|
|
||||||
/* Indicate the _mcount call cannot throw, nor will it execute a
|
/* Indicate the _mcount call cannot throw, nor will it execute a
|
||||||
non-local goto. */
|
non-local goto. */
|
||||||
REG_NOTES (call_insn)
|
REG_NOTES (call_insn)
|
||||||
= gen_rtx_EXPR_LIST (REG_EH_REGION, constm1_rtx, REG_NOTES (call_insn));
|
= gen_rtx_EXPR_LIST (REG_EH_REGION, constm1_rtx, REG_NOTES (call_insn));
|
||||||
|
|
||||||
if (flag_pic)
|
|
||||||
{
|
|
||||||
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
|
|
||||||
if (TARGET_64BIT)
|
|
||||||
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
|
|
||||||
|
|
||||||
emit_move_insn (pic_offset_table_rtx, hppa_pic_save_rtx ());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fetch the return address for the frame COUNT steps up from
|
/* Fetch the return address for the frame COUNT steps up from
|
||||||
|
@ -6152,35 +6152,48 @@
|
|||||||
DONE;
|
DONE;
|
||||||
}")
|
}")
|
||||||
|
|
||||||
;; Special because we use the value placed in %r2 by the bl instruction
|
; Used by hppa_profile_hook to load the starting address of the current
|
||||||
;; from within its delay slot to set the value for the 2nd parameter to
|
; function; operand 1 contains the address of the label in operand 3
|
||||||
;; the call.
|
(define_insn "load_offset_label_address"
|
||||||
(define_insn "call_profiler"
|
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||||
[(call (mem:SI (match_operand 0 "call_operand_address" ""))
|
(plus:SI (match_operand:SI 1 "register_operand" "r")
|
||||||
(match_operand 1 "" ""))
|
(minus:SI (match_operand:SI 2 "" "")
|
||||||
(use (match_operand 2 "" ""))
|
(label_ref:SI (match_operand 3 "" "")))))]
|
||||||
(use (reg:SI 25))
|
|
||||||
(use (reg:SI 26))
|
|
||||||
(clobber (reg:SI 2))]
|
|
||||||
""
|
""
|
||||||
|
"ldo %2-%l3(%1),%0"
|
||||||
|
[(set_attr "type" "multi")
|
||||||
|
(set_attr "length" "4")])
|
||||||
|
|
||||||
|
; Output a code label and load its address.
|
||||||
|
(define_insn "lcla1"
|
||||||
|
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||||
|
(label_ref:SI (match_operand 1 "" "")))
|
||||||
|
(const_int 0)]
|
||||||
|
"!TARGET_PA_20"
|
||||||
"*
|
"*
|
||||||
{
|
{
|
||||||
rtx xoperands[3];
|
output_asm_insn (\"bl .+8,%0\;depi 0,31,2,%0\", operands);
|
||||||
|
|
||||||
output_arg_descriptor (insn);
|
|
||||||
|
|
||||||
xoperands[0] = operands[0];
|
|
||||||
xoperands[1] = operands[2];
|
|
||||||
xoperands[2] = gen_label_rtx ();
|
|
||||||
output_asm_insn (\"{bl|b,l} %0,%%r2\;ldo %1-%2(%%r2),%%r25\", xoperands);
|
|
||||||
|
|
||||||
(*targetm.asm_out.internal_label) (asm_out_file, \"L\",
|
(*targetm.asm_out.internal_label) (asm_out_file, \"L\",
|
||||||
CODE_LABEL_NUMBER (xoperands[2]));
|
CODE_LABEL_NUMBER (operands[1]));
|
||||||
return \"\";
|
return \"\";
|
||||||
}"
|
}"
|
||||||
[(set_attr "type" "multi")
|
[(set_attr "type" "multi")
|
||||||
(set_attr "length" "8")])
|
(set_attr "length" "8")])
|
||||||
|
|
||||||
|
(define_insn "lcla2"
|
||||||
|
[(set (match_operand:SI 0 "register_operand" "=r")
|
||||||
|
(label_ref:SI (match_operand 1 "" "")))
|
||||||
|
(const_int 0)]
|
||||||
|
"TARGET_PA_20"
|
||||||
|
"*
|
||||||
|
{
|
||||||
|
(*targetm.asm_out.internal_label) (asm_out_file, \"L\",
|
||||||
|
CODE_LABEL_NUMBER (operands[1]));
|
||||||
|
return \"mfia %0\";
|
||||||
|
}"
|
||||||
|
[(set_attr "type" "move")
|
||||||
|
(set_attr "length" "4")])
|
||||||
|
|
||||||
(define_insn "blockage"
|
(define_insn "blockage"
|
||||||
[(unspec_volatile [(const_int 2)] 0)]
|
[(unspec_volatile [(const_int 2)] 0)]
|
||||||
""
|
""
|
||||||
|
Loading…
Reference in New Issue
Block a user