From 54538b800ae6054114672fe4e8bb433559e1d235 Mon Sep 17 00:00:00 2001 From: rth Date: Tue, 22 Sep 2009 15:12:41 +0000 Subject: * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151991 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/fr30/fr30.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ gcc/config/fr30/fr30.h | 36 ----------------------------------- 2 files changed, 51 insertions(+), 36 deletions(-) (limited to 'gcc/config/fr30') diff --git a/gcc/config/fr30/fr30.c b/gcc/config/fr30/fr30.c index 431af8f63f9..faa637cddec 100644 --- a/gcc/config/fr30/fr30.c +++ b/gcc/config/fr30/fr30.c @@ -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 */ diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h index f055a1a05dc..20e157173d8 100644 --- a/gcc/config/fr30/fr30.h +++ b/gcc/config/fr30/fr30.h @@ -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. */ -- cgit v1.2.1