diff options
author | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-04 10:38:50 +0000 |
---|---|---|
committer | nickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-04-04 10:38:50 +0000 |
commit | a184c07bf290e0d87103b3f4429437dfd78fa631 (patch) | |
tree | 07f10fcb7d4fb0071182c2d907b9da91bb3217cc /gcc/config/v850 | |
parent | 3aa7cd037523199636a6561bdb00859c8d860c61 (diff) | |
download | ppe42-gcc-a184c07bf290e0d87103b3f4429437dfd78fa631.tar.gz ppe42-gcc-a184c07bf290e0d87103b3f4429437dfd78fa631.zip |
(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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65236 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/v850')
-rw-r--r-- | gcc/config/v850/v850.c | 56 | ||||
-rw-r--r-- | gcc/config/v850/v850.md | 2 |
2 files changed, 32 insertions, 26 deletions
diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c index 01859dad7f4..879b1898a95 100644 --- a/gcc/config/v850/v850.c +++ b/gcc/config/v850/v850.c @@ -1713,13 +1713,10 @@ expand_prologue () /* Save arg registers to the stack if necessary. */ else if (current_function_args_info.anonymous_args) { - if (TARGET_PROLOG_FUNCTION) - { - if (TARGET_V850E && ! TARGET_DISABLE_CALLT) - emit_insn (gen_save_r6_r9_v850e ()); - else - emit_insn (gen_save_r6_r9 ()); - } + if (TARGET_PROLOG_FUNCTION && TARGET_V850E && !TARGET_DISABLE_CALLT) + emit_insn (gen_save_r6_r9_v850e ()); + else if (TARGET_PROLOG_FUNCTION && ! TARGET_LONG_CALLS) + emit_insn (gen_save_r6_r9 ()); else { offset = 0; @@ -1779,19 +1776,14 @@ expand_prologue () { save_all = gen_rtx_PARALLEL (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) = gen_rtx_SET (VOIDmode, stack_pointer_rtx, 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; for (i = 0; i < num_save; i++) { @@ -1804,6 +1796,16 @@ expand_prologue () 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); if (code >= 0) { @@ -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 src; @@ -2671,14 +2673,18 @@ pattern_is_ok_for_prologue (op, mode) } } - /* Make sure that the last entry in the vector is a clobber. */ - vector_element = XVECEXP (op, 0, i); - - if (GET_CODE (vector_element) != CLOBBER - || GET_CODE (XEXP (vector_element, 0)) != REG - || REGNO (XEXP (vector_element, 0)) != 10) - return 0; - + /* Make sure that the last entries in the vector are clobbers. */ + for (; i < count; i++) + { + vector_element = XVECEXP (op, 0, i); + + if (GET_CODE (vector_element) != CLOBBER + || 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; } @@ -2720,7 +2726,7 @@ construct_save_jarl (op) stack_bytes = INTVAL (XEXP (SET_SRC (XVECEXP (op, 0, 0)), 1)); /* 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. */ if (stack_bytes != 0 && stack_bytes != -16) @@ -2731,7 +2737,7 @@ construct_save_jarl (op) /* Now compute the bit mask of registers to push. */ 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); diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md index 811f87abfea..ba058a45e76 100644 --- a/gcc/config/v850/v850.md +++ b/gcc/config/v850/v850.md @@ -1663,7 +1663,7 @@ (set (mem:SI (plus:SI (reg:SI 3) (match_operand:SI 2 "immediate_operand" "i"))) (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])] - "TARGET_PROLOG_FUNCTION" + "TARGET_PROLOG_FUNCTION && TARGET_V850" "* return construct_save_jarl (operands[0]); " [(set (attr "length") (if_then_else (eq_attr "long_calls" "yes") |