fr30.c (TARGET_ASM_TRAMPOLINE_TEMPLATE, [...]): New.

* config/fr30/fr30.c (TARGET_ASM_TRAMPOLINE_TEMPLATE,
	TARGET_TRAMPOLINE_INIT, fr30_asm_trampoline_template,
	fr30_trampoline_init): New.
	* config/fr30/fr30.h (TRAMPOLINE_TEMPLATE): Move code to
	fr30_asm_trampoline_template.
	(INITIALIZE_TRAMPOLINE): Move code to fr30_trampoline_init;
	adjust for target hook parameters.

From-SVN: r151991
This commit is contained in:
Richard Henderson 2009-09-22 08:12:41 -07:00 committed by Richard Henderson
parent 956c97fc69
commit 98689f5ece
3 changed files with 59 additions and 36 deletions

View file

@ -89,6 +89,14 @@
* config/crx/crx.h (INITIALIZE_TRAMPOLINE): Remove.
* config/fr30/fr30.c (TARGET_ASM_TRAMPOLINE_TEMPLATE,
TARGET_TRAMPOLINE_INIT, fr30_asm_trampoline_template,
fr30_trampoline_init): New.
* config/fr30/fr30.h (TRAMPOLINE_TEMPLATE): Move code to
fr30_asm_trampoline_template.
(INITIALIZE_TRAMPOLINE): Move code to fr30_trampoline_init;
adjust for target hook parameters.
2009-09-22 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes

View file

@ -121,6 +121,8 @@ static int fr30_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
static bool fr30_frame_pointer_required (void);
static bool fr30_can_eliminate (const int, const int);
static void fr30_asm_trampoline_template (FILE *);
static void fr30_trampoline_init (rtx, tree, rtx);
#define FRAME_POINTER_MASK (1 << (FRAME_POINTER_REGNUM))
#define RETURN_POINTER_MASK (1 << (RETURN_POINTER_REGNUM))
@ -165,6 +167,11 @@ static bool fr30_can_eliminate (const int, const int);
#undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE fr30_can_eliminate
#undef TARGET_ASM_TRAMPOLINE_TEMPLATE
#define TARGET_ASM_TRAMPOLINE_TEMPLATE fr30_asm_trampoline_template
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT fr30_trampoline_init
struct gcc_target targetm = TARGET_INITIALIZER;
@ -923,6 +930,50 @@ fr30_frame_pointer_required (void)
return (flag_omit_frame_pointer == 0 || crtl->args.pretend_args_size > 0);
}
/*}}}*/
/*{{{ Trampoline Output Routines */
/* Implement TARGET_ASM_TRAMPOLINE_TEMPLATE.
On the FR30, the trampoline is:
nop
ldi:32 STATIC, r12
nop
ldi:32 FUNCTION, r0
jmp @r0
The no-ops are to guarantee that the static chain and final
target are 32 bit aligned within the trampoline. That allows us to
initialize those locations with simple SImode stores. The alternative
would be to use HImode stores. */
static void
fr30_asm_trampoline_template (FILE *f)
{
fprintf (f, "\tnop\n");
fprintf (f, "\tldi:32\t#0, %s\n", reg_names [STATIC_CHAIN_REGNUM]);
fprintf (f, "\tnop\n");
fprintf (f, "\tldi:32\t#0, %s\n", reg_names [COMPILER_SCRATCH_REGISTER]);
fprintf (f, "\tjmp\t@%s\n", reg_names [COMPILER_SCRATCH_REGISTER]);
}
/* Implement TARGET_TRAMPOLINE_INIT. */
static void
fr30_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
{
rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
rtx mem;
emit_block_move (m_tramp, assemble_trampoline_template (),
GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
mem = adjust_address (m_tramp, SImode, 4);
emit_move_insn (mem, chain_value);
mem = adjust_address (m_tramp, SImode, 12);
emit_move_insn (mem, fnaddr);
}
/*}}}*/
/* Local Variables: */
/* folded-file: t */

View file

@ -730,31 +730,6 @@ enum reg_class
/*}}}*/
/*{{{ Trampolines for Nested Functions. */
/* On the FR30, the trampoline is:
nop
ldi:32 STATIC, r12
nop
ldi:32 FUNCTION, r0
jmp @r0
The no-ops are to guarantee that the static chain and final
target are 32 bit aligned within the trampoline. That allows us to
initialize those locations with simple SImode stores. The alternative
would be to use HImode stores. */
/* A C statement to output, on the stream FILE, assembler code for a block of
data that contains the constant parts of a trampoline. This code should not
include a label--the label is taken care of automatically. */
#define TRAMPOLINE_TEMPLATE(FILE) \
{ \
fprintf (FILE, "\tnop\n"); \
fprintf (FILE, "\tldi:32\t#0, %s\n", reg_names [STATIC_CHAIN_REGNUM]); \
fprintf (FILE, "\tnop\n"); \
fprintf (FILE, "\tldi:32\t#0, %s\n", reg_names [COMPILER_SCRATCH_REGISTER]); \
fprintf (FILE, "\tjmp\t@%s\n", reg_names [COMPILER_SCRATCH_REGISTER]); \
}
/* A C expression for the size in bytes of the trampoline, as an integer. */
#define TRAMPOLINE_SIZE 18
@ -763,17 +738,6 @@ enum reg_class
the trampoline is also aligned on a 32bit boundary. */
#define TRAMPOLINE_ALIGNMENT 32
/* A C statement to initialize the variable parts of a trampoline. ADDR is an
RTX for the address of the trampoline; FNADDR is an RTX for the address of
the nested function; STATIC_CHAIN is an RTX for the static chain value that
should be passed to the function when it is called. */
#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \
do \
{ \
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (ADDR, 4)), STATIC_CHAIN);\
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (ADDR, 12)), FNADDR); \
} while (0);
/*}}}*/
/*{{{ Addressing Modes. */