vax.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New.
* config/vax/vax.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New. (TARGET_TRAMPOLINE_INIT): New. (vax_asm_trampoline_template, vax_trampoline_init): New. * config/vax/vax.h (TRAMPOLINE_TEMPLATE): Move code to vax_asm_trampoline_template. (INITIALIZE_TRAMPOLINE): Move code to vax_trampoline_init. From-SVN: r152016
This commit is contained in:
parent
e0c6c27329
commit
3814318d55
@ -285,6 +285,13 @@
|
||||
(INITIALIZE_TRAMPOLINE): Move code to v850_trampoline_init
|
||||
and adjust for target hook parameters.
|
||||
|
||||
* config/vax/vax.c (TARGET_ASM_TRAMPOLINE_TEMPLATE): New.
|
||||
(TARGET_TRAMPOLINE_INIT): New.
|
||||
(vax_asm_trampoline_template, vax_trampoline_init): New.
|
||||
* config/vax/vax.h (TRAMPOLINE_TEMPLATE): Move code to
|
||||
vax_asm_trampoline_template.
|
||||
(INITIALIZE_TRAMPOLINE): Move code to vax_trampoline_init.
|
||||
|
||||
2009-09-22 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes
|
||||
|
@ -57,6 +57,8 @@ static int vax_address_cost (rtx, bool);
|
||||
static bool vax_rtx_costs (rtx, int, int, int *, bool);
|
||||
static rtx vax_struct_value_rtx (tree, int);
|
||||
static rtx vax_builtin_setjmp_frame_value (void);
|
||||
static void vax_asm_trampoline_template (FILE *);
|
||||
static void vax_trampoline_init (rtx, tree, rtx);
|
||||
|
||||
/* Initialize the GCC target structure. */
|
||||
#undef TARGET_ASM_ALIGNED_HI_OP
|
||||
@ -101,6 +103,11 @@ static rtx vax_builtin_setjmp_frame_value (void);
|
||||
#undef TARGET_FRAME_POINTER_REQUIRED
|
||||
#define TARGET_FRAME_POINTER_REQUIRED hook_bool_void_true
|
||||
|
||||
#undef TARGET_ASM_TRAMPOLINE_TEMPLATE
|
||||
#define TARGET_ASM_TRAMPOLINE_TEMPLATE vax_asm_trampoline_template
|
||||
#undef TARGET_TRAMPOLINE_INIT
|
||||
#define TARGET_TRAMPOLINE_INIT vax_trampoline_init
|
||||
|
||||
struct gcc_target targetm = TARGET_INITIALIZER;
|
||||
|
||||
/* Set global variables as needed for the options enabled. */
|
||||
@ -2020,3 +2027,45 @@ adjacent_operands_p (rtx lo, rtx hi, enum machine_mode mode)
|
||||
return rtx_equal_p (lo, hi)
|
||||
&& hi_offset - lo_offset == GET_MODE_SIZE (mode);
|
||||
}
|
||||
|
||||
/* Output assembler code for a block containing the constant parts
|
||||
of a trampoline, leaving space for the variable parts. */
|
||||
|
||||
/* On the VAX, the trampoline contains an entry mask and two instructions:
|
||||
.word NN
|
||||
movl $STATIC,r0 (store the functions static chain)
|
||||
jmp *$FUNCTION (jump to function code at address FUNCTION) */
|
||||
|
||||
static void
|
||||
vax_asm_trampoline_template (FILE *f ATTRIBUTE_UNUSED)
|
||||
{
|
||||
assemble_aligned_integer (2, const0_rtx);
|
||||
assemble_aligned_integer (2, GEN_INT (0x8fd0));
|
||||
assemble_aligned_integer (4, const0_rtx);
|
||||
assemble_aligned_integer (1, GEN_INT (0x50 + STATIC_CHAIN_REGNUM));
|
||||
assemble_aligned_integer (2, GEN_INT (0x9f17));
|
||||
assemble_aligned_integer (4, const0_rtx);
|
||||
}
|
||||
|
||||
/* We copy the register-mask from the function's pure code
|
||||
to the start of the trampoline. */
|
||||
|
||||
static void
|
||||
vax_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
|
||||
{
|
||||
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, HImode, 0);
|
||||
emit_move_insn (mem, gen_const_mem (HImode, fnaddr));
|
||||
|
||||
mem = adjust_address (m_tramp, SImode, 4);
|
||||
emit_move_insn (mem, cxt);
|
||||
mem = adjust_address (m_tramp, SImode, 11);
|
||||
emit_move_insn (mem, plus_constant (fnaddr, 2));
|
||||
emit_insn (gen_sync_istream ());
|
||||
}
|
||||
|
||||
|
@ -428,44 +428,10 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
|
||||
|
||||
#define INITIAL_FRAME_POINTER_OFFSET(DEPTH) (DEPTH) = 0;
|
||||
|
||||
/* Output assembler code for a block containing the constant parts
|
||||
of a trampoline, leaving space for the variable parts. */
|
||||
|
||||
/* On the VAX, the trampoline contains an entry mask and two instructions:
|
||||
.word NN
|
||||
movl $STATIC,r0 (store the functions static chain)
|
||||
jmp *$FUNCTION (jump to function code at address FUNCTION) */
|
||||
|
||||
#define TRAMPOLINE_TEMPLATE(FILE) \
|
||||
{ \
|
||||
assemble_aligned_integer (2, const0_rtx); \
|
||||
assemble_aligned_integer (2, GEN_INT (0x8fd0)); \
|
||||
assemble_aligned_integer (4, const0_rtx); \
|
||||
assemble_aligned_integer (1, GEN_INT (0x50 + STATIC_CHAIN_REGNUM)); \
|
||||
assemble_aligned_integer (2, GEN_INT (0x9f17)); \
|
||||
assemble_aligned_integer (4, const0_rtx); \
|
||||
}
|
||||
|
||||
/* Length in units of the trampoline for entering a nested function. */
|
||||
|
||||
#define TRAMPOLINE_SIZE 15
|
||||
|
||||
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
||||
FNADDR is an RTX for the address of the function's pure code.
|
||||
CXT is an RTX for the static chain value for the function. */
|
||||
|
||||
/* We copy the register-mask from the function's pure code
|
||||
to the start of the trampoline. */
|
||||
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
||||
{ \
|
||||
emit_move_insn (gen_rtx_MEM (HImode, TRAMP), \
|
||||
gen_rtx_MEM (HImode, FNADDR)); \
|
||||
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT); \
|
||||
emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 11)), \
|
||||
plus_constant (FNADDR, 2)); \
|
||||
emit_insn (gen_sync_istream ()); \
|
||||
}
|
||||
|
||||
/* Byte offset of return address in a stack frame. The "saved PC" field
|
||||
is in element [4] when treating the frame as an array of longwords. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user