sparc.md (pic): New attribute.

* config/sparc/sparc.md (pic): New attribute.
	(do_builtin_setjmp_setup): Save %fp, %i7 and %l7 for TARGET_V9
	into stack slots.
	(split after do_builtin_setjmp_setup): New.

From-SVN: r51869
This commit is contained in:
Jakub Jelinek 2002-04-04 22:54:02 +02:00 committed by Jakub Jelinek
parent dc25bcbeb9
commit ef8e745a4d
2 changed files with 39 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2002-04-04 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.md (pic): New attribute.
(do_builtin_setjmp_setup): Save %fp, %i7 and %l7 for TARGET_V9
into stack slots.
(split after do_builtin_setjmp_setup): New.
2002-04-04 Jakub Jelinek <jakub@redhat.com>
PR fortran/6106

View File

@ -93,6 +93,9 @@
(define_attr "branch_type" "none,icc,fcc,reg" (const_string "none"))
(define_attr "pic" "false,true"
(symbol_ref "flag_pic != 0"))
;; Length (in # of insns).
(define_attr "length" ""
(cond [(eq_attr "type" "uncond_branch,call,sibcall")
@ -8877,22 +8880,41 @@
DONE;
}")
;; ??? Should set length to zero when !current_function_calls_alloca,
;; ??? but there is no easy way to get at that definition. It would
;; ??? require including function.h into sparc-protos.h and that is
;; ??? likely not a good idea. -DaveM
(define_insn "do_builtin_setjmp_setup"
[(unspec_volatile [(const_int 0)] 5)]
""
"*
{
if (!current_function_calls_alloca)
return \"\";
if (TARGET_V9)
return \"flushw\";
return \"ta\\t3\";
if (! current_function_calls_alloca || ! TARGET_V9 || TARGET_FLAT)
return \"#\";
fputs (\"\tflushw\n\", asm_out_file);
if (flag_pic)
fprintf (asm_out_file, \"\tst%c\t%%l7, [%%sp+%d]\n\",
TARGET_ARCH64 ? 'x' : 'w',
SPARC_STACK_BIAS + 7 * UNITS_PER_WORD);
fprintf (asm_out_file, \"\tst%c\t%%fp, [%%sp+%d]\n\",
TARGET_ARCH64 ? 'x' : 'w',
SPARC_STACK_BIAS + 14 * UNITS_PER_WORD);
fprintf (asm_out_file, \"\tst%c\t%%i7, [%%sp+%d]\n\",
TARGET_ARCH64 ? 'x' : 'w',
SPARC_STACK_BIAS + 15 * UNITS_PER_WORD);
return \"\";
}"
[(set_attr "type" "misc")])
[(set_attr "type" "misc")
(set (attr "length") (if_then_else (eq_attr "pic" "true")
(const_int 4)
(const_int 3)))])
(define_split
[(unspec_volatile [(const_int 0)] 5)]
"! current_function_calls_alloca || ! TARGET_V9 || TARGET_FLAT"
[(const_int 0)]
"
{
if (current_function_calls_alloca)
emit_insn (gen_flush_register_windows ());
DONE;
}")
;; Pattern for use after a setjmp to store FP and the return register
;; into the stack area.