Commit fdf3bb57 by Nick Clifton Committed by Nick Clifton

(expand_prologue): Only use register save helper functions if long calls are not being used.

(expand_prologue): Only use register save helper functions if long calls are
not being used.
Add a clobber of r11 id using long calls.
(prolog pattern): Do not use this pattern for v850e's.

From-SVN: r65236
parent ad3f5759
2003-04-04 Nick Clifton <nickc@redhat.com>
* config/v850/v850.c (expand_prologue): Only use register save
helper functions if long calls are not being used.
Add a clobber of r11 id using long calls.
(pattern_is_ok_for_prologue): Account for the extra clobber.
(construct_save_jarl): Likewise.
* config/v850/v850.md (prolog pattern): Do not use this pattern
for v850e's.
2003-04-04 Andreas Schwab <schwab@suse.de> 2003-04-04 Andreas Schwab <schwab@suse.de>
* stor-layout.c (layout_decl): Avoid syntax error in last change * stor-layout.c (layout_decl): Avoid syntax error in last change
......
...@@ -1713,13 +1713,10 @@ expand_prologue () ...@@ -1713,13 +1713,10 @@ expand_prologue ()
/* Save arg registers to the stack if necessary. */ /* Save arg registers to the stack if necessary. */
else if (current_function_args_info.anonymous_args) else if (current_function_args_info.anonymous_args)
{ {
if (TARGET_PROLOG_FUNCTION) if (TARGET_PROLOG_FUNCTION && TARGET_V850E && !TARGET_DISABLE_CALLT)
{ emit_insn (gen_save_r6_r9_v850e ());
if (TARGET_V850E && ! TARGET_DISABLE_CALLT) else if (TARGET_PROLOG_FUNCTION && ! TARGET_LONG_CALLS)
emit_insn (gen_save_r6_r9_v850e ()); emit_insn (gen_save_r6_r9 ());
else
emit_insn (gen_save_r6_r9 ());
}
else else
{ {
offset = 0; offset = 0;
...@@ -1779,19 +1776,14 @@ expand_prologue () ...@@ -1779,19 +1776,14 @@ expand_prologue ()
{ {
save_all = gen_rtx_PARALLEL save_all = gen_rtx_PARALLEL
(VOIDmode, (VOIDmode,
rtvec_alloc (num_save + (TARGET_V850 ? 2 : 1))); rtvec_alloc (num_save + 1
+ (TARGET_V850 ? (TARGET_LONG_CALLS ? 2 : 1) : 0)));
XVECEXP (save_all, 0, 0) XVECEXP (save_all, 0, 0)
= gen_rtx_SET (VOIDmode, = gen_rtx_SET (VOIDmode,
stack_pointer_rtx, stack_pointer_rtx,
plus_constant (stack_pointer_rtx, -alloc_stack)); plus_constant (stack_pointer_rtx, -alloc_stack));
if (TARGET_V850)
{
XVECEXP (save_all, 0, num_save+1)
= gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 10));
}
offset = - default_stack; offset = - default_stack;
for (i = 0; i < num_save; i++) for (i = 0; i < num_save; i++)
{ {
...@@ -1804,6 +1796,16 @@ expand_prologue () ...@@ -1804,6 +1796,16 @@ expand_prologue ()
offset -= 4; offset -= 4;
} }
if (TARGET_V850)
{
XVECEXP (save_all, 0, num_save + 1)
= gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 10));
if (TARGET_LONG_CALLS)
XVECEXP (save_all, 0, num_save + 2)
= gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 11));
}
code = recog (save_all, NULL_RTX, NULL); code = recog (save_all, NULL_RTX, NULL);
if (code >= 0) if (code >= 0)
{ {
...@@ -2631,7 +2633,7 @@ pattern_is_ok_for_prologue (op, mode) ...@@ -2631,7 +2633,7 @@ pattern_is_ok_for_prologue (op, mode)
*/ */
for (i = 2; i < count - 1; i++) for (i = 2; i < count - (TARGET_LONG_CALLS ? 2: 1); i++)
{ {
rtx dest; rtx dest;
rtx src; rtx src;
...@@ -2671,14 +2673,18 @@ pattern_is_ok_for_prologue (op, mode) ...@@ -2671,14 +2673,18 @@ pattern_is_ok_for_prologue (op, mode)
} }
} }
/* Make sure that the last entry in the vector is a clobber. */ /* Make sure that the last entries in the vector are clobbers. */
vector_element = XVECEXP (op, 0, i); for (; i < count; i++)
{
if (GET_CODE (vector_element) != CLOBBER vector_element = XVECEXP (op, 0, i);
|| GET_CODE (XEXP (vector_element, 0)) != REG
|| REGNO (XEXP (vector_element, 0)) != 10) if (GET_CODE (vector_element) != CLOBBER
return 0; || GET_CODE (XEXP (vector_element, 0)) != REG
|| !(REGNO (XEXP (vector_element, 0)) == 10
|| (TARGET_LONG_CALLS ? (REGNO (XEXP (vector_element, 0)) == 11) : 0 )))
return 0;
}
return 1; return 1;
} }
...@@ -2720,7 +2726,7 @@ construct_save_jarl (op) ...@@ -2720,7 +2726,7 @@ construct_save_jarl (op)
stack_bytes = INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)); stack_bytes = INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1));
/* Each push will put 4 bytes from the stack... */ /* Each push will put 4 bytes from the stack... */
stack_bytes += (count - 2) * 4; stack_bytes += (count - (TARGET_LONG_CALLS ? 3 : 2)) * 4;
/* Make sure that the amount we are popping either 0 or 16 bytes. */ /* Make sure that the amount we are popping either 0 or 16 bytes. */
if (stack_bytes != 0 && stack_bytes != -16) if (stack_bytes != 0 && stack_bytes != -16)
...@@ -2731,7 +2737,7 @@ construct_save_jarl (op) ...@@ -2731,7 +2737,7 @@ construct_save_jarl (op)
/* Now compute the bit mask of registers to push. */ /* Now compute the bit mask of registers to push. */
mask = 0; mask = 0;
for (i = 1; i < count - 1; i++) for (i = 1; i < count - (TARGET_LONG_CALLS ? 2 : 1); i++)
{ {
rtx vector_element = XVECEXP (op, 0, i); rtx vector_element = XVECEXP (op, 0, i);
......
...@@ -1663,7 +1663,7 @@ ...@@ -1663,7 +1663,7 @@
(set (mem:SI (plus:SI (reg:SI 3) (set (mem:SI (plus:SI (reg:SI 3)
(match_operand:SI 2 "immediate_operand" "i"))) (match_operand:SI 2 "immediate_operand" "i")))
(match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])] (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])]
"TARGET_PROLOG_FUNCTION" "TARGET_PROLOG_FUNCTION && TARGET_V850"
"* return construct_save_jarl (operands[0]); "* return construct_save_jarl (operands[0]);
" "
[(set (attr "length") (if_then_else (eq_attr "long_calls" "yes") [(set (attr "length") (if_then_else (eq_attr "long_calls" "yes")
......
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