Commit d48ab010 by James Bowman Committed by James Bowman

ft32.c (ft32_setup_incoming_varargs, [...]): Handle pretend_args.

[gcc]
   * config/ft32/ft32.c (ft32_setup_incoming_varargs,
   ft32_expand_prolog, ft32_expand_epilogue):
   Handle pretend_args.
   * config/ft32/ft32.h: Remove OUTGOING_REG_PARM_STACK_SPACE.
   * config/ft32/ft32.md: Add pretend_returner.

From-SVN: r237116
parent 24673d55
2016-06-05 James Bowman <james.bowman@ftdichip.com>
* config/ft32/ft32.c (ft32_setup_incoming_varargs,
ft32_expand_prolog, ft32_expand_epilogue):
Handle pretend_args.
* config/ft32/ft32.h: Remove OUTGOING_REG_PARM_STACK_SPACE.
* config/ft32/ft32.md: Add pretend_returner.
2016-06-06 Uros Bizjak <ubizjak@gmail.com> 2016-06-06 Uros Bizjak <ubizjak@gmail.com>
PR target/71389 PR target/71389
......
...@@ -409,7 +409,7 @@ ft32_compute_frame (void) ...@@ -409,7 +409,7 @@ ft32_compute_frame (void)
cfun->machine->callee_saved_reg_size += 4; cfun->machine->callee_saved_reg_size += 4;
cfun->machine->size_for_adjusting_sp = cfun->machine->size_for_adjusting_sp =
crtl->args.pretend_args_size 0 // crtl->args.pretend_args_size
+ cfun->machine->local_vars_size + cfun->machine->local_vars_size
+ (ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : 0); + (ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : 0);
} }
...@@ -434,6 +434,23 @@ ft32_expand_prologue (void) ...@@ -434,6 +434,23 @@ ft32_expand_prologue (void)
ft32_compute_frame (); ft32_compute_frame ();
int args_to_push = crtl->args.pretend_args_size;
if (args_to_push)
{
int i;
insn = emit_insn (gen_movsi_pop ((gen_rtx_REG (Pmode, FT32_R29))));
for (i = 0; i < (args_to_push / 4); i++)
{
insn =
emit_insn (gen_movsi_push ((gen_rtx_REG (Pmode, FT32_R5 - i))));
RTX_FRAME_RELATED_P (insn) = 1;
}
insn = emit_insn (gen_movsi_push ((gen_rtx_REG (Pmode, FT32_R29))));
}
if (flag_stack_usage_info) if (flag_stack_usage_info)
current_function_static_stack_size = cfun->machine->size_for_adjusting_sp; current_function_static_stack_size = cfun->machine->size_for_adjusting_sp;
...@@ -488,10 +505,10 @@ ft32_expand_prologue (void) ...@@ -488,10 +505,10 @@ ft32_expand_prologue (void)
} }
else if (cfun->machine->size_for_adjusting_sp > 0) else if (cfun->machine->size_for_adjusting_sp > 0)
{ {
int adj = cfun->machine->size_for_adjusting_sp;
insn = emit_insn (gen_addsi3 (gen_rtx_REG (SImode, FT32_SP), insn = emit_insn (gen_addsi3 (gen_rtx_REG (SImode, FT32_SP),
gen_rtx_REG (SImode, FT32_SP), gen_rtx_REG (SImode, FT32_SP),
GEN_INT (-(cfun->machine-> GEN_INT (-adj)));
size_for_adjusting_sp))));
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
} }
} }
...@@ -500,6 +517,7 @@ void ...@@ -500,6 +517,7 @@ void
ft32_expand_epilogue (void) ft32_expand_epilogue (void)
{ {
int regno; int regno;
int pretend = crtl->args.pretend_args_size;
if (!must_link () if (!must_link ()
&& (cfun->machine->size_for_adjusting_sp == 24) && (cfun->machine->size_for_adjusting_sp == 24)
...@@ -533,7 +551,7 @@ ft32_expand_epilogue (void) ...@@ -533,7 +551,7 @@ ft32_expand_epilogue (void)
&& df_regs_ever_live_p (regno)) && df_regs_ever_live_p (regno))
{ {
rtx preg = gen_rtx_REG (Pmode, regno); rtx preg = gen_rtx_REG (Pmode, regno);
if (optimize_size) if (optimize_size && (pretend == 0))
{ {
if (epilog24) if (epilog24)
emit_insn (gen_jump_epilog24 (preg)); emit_insn (gen_jump_epilog24 (preg));
...@@ -546,6 +564,9 @@ ft32_expand_epilogue (void) ...@@ -546,6 +564,9 @@ ft32_expand_epilogue (void)
} }
} }
if (pretend != 0)
emit_jump_insn (gen_pretend_returner (GEN_INT (pretend)));
else
emit_jump_insn (gen_returner ()); emit_jump_insn (gen_returner ());
} }
...@@ -602,31 +623,20 @@ ft32_initial_elimination_offset (int from, int to) ...@@ -602,31 +623,20 @@ ft32_initial_elimination_offset (int from, int to)
static void static void
ft32_setup_incoming_varargs (cumulative_args_t cum_v, ft32_setup_incoming_varargs (cumulative_args_t cum_v,
enum machine_mode mode ATTRIBUTE_UNUSED, enum machine_mode mode,
tree type ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED,
int *pretend_size, int no_rtl) int *pretend_size, int no_rtl ATTRIBUTE_UNUSED)
{ {
CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v); CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
int regno; int named_size =
int regs = 8 - *cum; GET_MODE_SIZE (SImode) * (*cum - FT32_R0) + GET_MODE_SIZE (mode);
*pretend_size = regs < 0 ? 0 : GET_MODE_SIZE (SImode) * regs;
if (no_rtl)
return;
for (regno = *cum; regno < 8; regno++) if (named_size < 24)
{ *pretend_size = 24 - named_size;
rtx reg = gen_rtx_REG (SImode, regno); else
rtx slot = gen_rtx_PLUS (Pmode, *pretend_size = 0;
gen_rtx_REG (SImode, ARG_POINTER_REGNUM),
GEN_INT (UNITS_PER_WORD * (regno - FT32_R0)));
emit_move_insn (gen_rtx_MEM (SImode, slot), reg);
}
} }
/* Return the fixed registers used for condition codes. */ /* Return the fixed registers used for condition codes. */
static bool static bool
......
...@@ -256,15 +256,6 @@ enum reg_class ...@@ -256,15 +256,6 @@ enum reg_class
be allocated. */ be allocated. */
#define STARTING_FRAME_OFFSET 0 #define STARTING_FRAME_OFFSET 0
/* Define this if the above stack space is to be considered part of the
space allocated by the caller. */
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
/* #define STACK_PARMS_IN_REG_PARM_AREA */
/* Define this if it is the responsibility of the caller to allocate
the area reserved for arguments passed in registers. */
#define REG_PARM_STACK_SPACE(FNDECL) (6 * UNITS_PER_WORD)
/* Offset from the argument pointer register to the first argument's /* Offset from the argument pointer register to the first argument's
address. On some machines it may depend on the data type of the address. On some machines it may depend on the data type of the
function. */ function. */
......
...@@ -929,6 +929,14 @@ ...@@ -929,6 +929,14 @@
"reload_completed" "reload_completed"
"return") "return")
(define_insn "pretend_returner"
[(set (reg:SI SP_REG)
(plus:SI (reg:SI SP_REG)
(match_operand:SI 0)))
(return)]
"reload_completed"
"pop.l $cc\;add.l $sp,$sp,%0\;jmpi $cc")
(define_insn "returner24" (define_insn "returner24"
[ [
(set (reg:SI SP_REG) (set (reg:SI SP_REG)
......
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