Commit dbbdb385 by Richard Henderson Committed by Richard Henderson

mmix.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New.

        * gcc/config/mmix/mmix.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New.
        (TARGET_TRAMPOLINE_INIT): New.
        (mmix_trampoline_size): Remove.
        (mmix_asm_trampoline_template): Rename from mmix_trampoline_template;
        make static.  Remove out-of-date tetra vs octa comment.
        (mmix_trampoline_init): Rename from mmix_initialize_trampoline;
        make static; update for hook parameters.
        * config/mmix/mmix.h (TRAMPOLINE_TEMPLATE): Remove.
        (INITIALIZE_TRAMPOLINE): Remove.
        (TRAMPOLINE_SIZE): Use a constant instead of mmix_trampoline_size.
        (TRAMPOLINE_ALIGNMENT): New.
        * gcc/config/mmix/mmix-protos.h: Update.

From-SVN: r152002
parent a1d29c8c
...@@ -163,6 +163,19 @@ ...@@ -163,6 +163,19 @@
(INITIALIZE_TRAMPOLINE): Move code to mips_trampoline_init; (INITIALIZE_TRAMPOLINE): Move code to mips_trampoline_init;
update for hook parameters. update for hook parameters.
* gcc/config/mmix/mmix.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New.
(TARGET_TRAMPOLINE_INIT): New.
(mmix_trampoline_size): Remove.
(mmix_asm_trampoline_template): Rename from mmix_trampoline_template;
make static. Remove out-of-date tetra vs octa comment.
(mmix_trampoline_init): Rename from mmix_initialize_trampoline;
make static; update for hook parameters.
* config/mmix/mmix.h (TRAMPOLINE_TEMPLATE): Remove.
(INITIALIZE_TRAMPOLINE): Remove.
(TRAMPOLINE_SIZE): Use a constant instead of mmix_trampoline_size.
(TRAMPOLINE_ALIGNMENT): New.
* gcc/config/mmix/mmix-protos.h: Update.
2009-09-22 Jakub Jelinek <jakub@redhat.com> 2009-09-22 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes * config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes
......
...@@ -25,8 +25,6 @@ extern int mmix_initial_elimination_offset (int, int); ...@@ -25,8 +25,6 @@ extern int mmix_initial_elimination_offset (int, int);
extern int mmix_starting_frame_offset (void); extern int mmix_starting_frame_offset (void);
extern int mmix_function_arg_regno_p (int, int); extern int mmix_function_arg_regno_p (int, int);
extern void mmix_function_profiler (FILE *, int); extern void mmix_function_profiler (FILE *, int);
extern void mmix_trampoline_template (FILE *);
extern int mmix_trampoline_size;
extern int mmix_reversible_cc_mode (enum machine_mode); extern int mmix_reversible_cc_mode (enum machine_mode);
extern int mmix_register_move_cost extern int mmix_register_move_cost
(enum machine_mode, enum reg_class, enum reg_class); (enum machine_mode, enum reg_class, enum reg_class);
...@@ -80,7 +78,6 @@ extern rtx mmix_dynamic_chain_address (rtx); ...@@ -80,7 +78,6 @@ extern rtx mmix_dynamic_chain_address (rtx);
extern rtx mmix_return_addr_rtx (int, rtx); extern rtx mmix_return_addr_rtx (int, rtx);
extern rtx mmix_eh_return_stackadj_rtx (void); extern rtx mmix_eh_return_stackadj_rtx (void);
extern rtx mmix_eh_return_handler_rtx (void); extern rtx mmix_eh_return_handler_rtx (void);
extern void mmix_initialize_trampoline (rtx, rtx, rtx);
extern int mmix_constant_address_p (rtx); extern int mmix_constant_address_p (rtx);
extern int mmix_legitimate_constant_p (rtx); extern int mmix_legitimate_constant_p (rtx);
extern void mmix_print_operand (FILE *, rtx, int); extern void mmix_print_operand (FILE *, rtx, int);
......
...@@ -141,6 +141,8 @@ static enum machine_mode mmix_promote_function_mode (const_tree, ...@@ -141,6 +141,8 @@ static enum machine_mode mmix_promote_function_mode (const_tree,
static bool mmix_pass_by_reference (CUMULATIVE_ARGS *, static bool mmix_pass_by_reference (CUMULATIVE_ARGS *,
enum machine_mode, const_tree, bool); enum machine_mode, const_tree, bool);
static bool mmix_frame_pointer_required (void); static bool mmix_frame_pointer_required (void);
static void mmix_asm_trampoline_template (FILE *);
static void mmix_trampoline_init (rtx, tree, rtx);
/* Target structure macros. Listed by node. See `Using and Porting GCC' /* Target structure macros. Listed by node. See `Using and Porting GCC'
for a general description. */ for a general description. */
...@@ -212,6 +214,11 @@ static bool mmix_frame_pointer_required (void); ...@@ -212,6 +214,11 @@ static bool mmix_frame_pointer_required (void);
#undef TARGET_FRAME_POINTER_REQUIRED #undef TARGET_FRAME_POINTER_REQUIRED
#define TARGET_FRAME_POINTER_REQUIRED mmix_frame_pointer_required #define TARGET_FRAME_POINTER_REQUIRED mmix_frame_pointer_required
#undef TARGET_ASM_TRAMPOLINE_TEMPLATE
#define TARGET_ASM_TRAMPOLINE_TEMPLATE mmix_asm_trampoline_template
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT mmix_trampoline_init
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
/* Functions that are expansions for target macros. /* Functions that are expansions for target macros.
...@@ -886,46 +893,44 @@ mmix_setup_incoming_varargs (CUMULATIVE_ARGS *args_so_farp, ...@@ -886,46 +893,44 @@ mmix_setup_incoming_varargs (CUMULATIVE_ARGS *args_so_farp,
internal_error ("MMIX Internal: Last named vararg would not fit in a register"); internal_error ("MMIX Internal: Last named vararg would not fit in a register");
} }
/* TRAMPOLINE_SIZE. */ /* TARGET_ASM_TRAMPOLINE_TEMPLATE. */
/* Four 4-byte insns plus two 8-byte values. */
int mmix_trampoline_size = 32;
/* TRAMPOLINE_TEMPLATE. */
void static void
mmix_trampoline_template (FILE *stream) mmix_asm_trampoline_template (FILE *stream)
{ {
/* Read a value into the static-chain register and jump somewhere. The /* Read a value into the static-chain register and jump somewhere. The
static chain is stored at offset 16, and the function address is static chain is stored at offset 16, and the function address is
stored at offset 24. */ stored at offset 24. */
/* FIXME: GCC copies this using *intsize* (tetra), when it should use
register size (octa). */
fprintf (stream, "\tGETA $255,1F\n\t"); fprintf (stream, "\tGETA $255,1F\n\t");
fprintf (stream, "LDOU %s,$255,0\n\t", fprintf (stream, "LDOU %s,$255,0\n\t", reg_names[MMIX_STATIC_CHAIN_REGNUM]);
reg_names[MMIX_STATIC_CHAIN_REGNUM]);
fprintf (stream, "LDOU $255,$255,8\n\t"); fprintf (stream, "LDOU $255,$255,8\n\t");
fprintf (stream, "GO $255,$255,0\n"); fprintf (stream, "GO $255,$255,0\n");
fprintf (stream, "1H\tOCTA 0\n\t"); fprintf (stream, "1H\tOCTA 0\n\t");
fprintf (stream, "OCTA 0\n"); fprintf (stream, "OCTA 0\n");
} }
/* INITIALIZE_TRAMPOLINE. */ /* TARGET_TRAMPOLINE_INIT. */
/* Set the static chain and function pointer field in the trampoline. /* Set the static chain and function pointer field in the trampoline.
We also SYNCID here to be sure (doesn't matter in the simulator, but We also SYNCID here to be sure (doesn't matter in the simulator, but
some day it will). */ some day it will). */
void static void
mmix_initialize_trampoline (rtx trampaddr, rtx fnaddr, rtx static_chain) mmix_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
{ {
emit_move_insn (gen_rtx_MEM (DImode, plus_constant (trampaddr, 16)), rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
static_chain); rtx mem;
emit_move_insn (gen_rtx_MEM (DImode,
plus_constant (trampaddr, 24)), emit_block_move (m_tramp, assemble_trampoline_template (),
fnaddr); GEN_INT (2*UNITS_PER_WORD), BLOCK_OP_NORMAL);
emit_insn (gen_sync_icache (validize_mem (gen_rtx_MEM (DImode,
trampaddr)), mem = adjust_address (m_tramp, DImode, 2*UNITS_PER_WORD);
GEN_INT (mmix_trampoline_size - 1))); emit_move_insn (mem, static_chain);
mem = adjust_address (m_tramp, DImode, 3*UNITS_PER_WORD);
emit_move_insn (mem, fnaddr);
mem = adjust_address (m_tramp, DImode, 0);
emit_insn (gen_sync_icache (mem, GEN_INT (TRAMPOLINE_SIZE - 1)));
} }
/* We must exclude constant addresses that have an increment that is not a /* We must exclude constant addresses that have an increment that is not a
......
...@@ -651,13 +651,8 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS; ...@@ -651,13 +651,8 @@ typedef struct { int regs; int lib; } CUMULATIVE_ARGS;
/* Node: Trampolines */ /* Node: Trampolines */
#define TRAMPOLINE_TEMPLATE(FILE) \ #define TRAMPOLINE_SIZE (4*UNITS_PER_WORD)
mmix_trampoline_template (FILE) #define TRAMPOLINE_ALIGNMENT BITS_PER_WORD
#define TRAMPOLINE_SIZE mmix_trampoline_size
#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \
mmix_initialize_trampoline (ADDR, FNADDR, STATIC_CHAIN)
/* Node: Addressing Modes */ /* Node: Addressing Modes */
......
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