From 4476e1a0be33ffe20597498e0e2549331ebbb2f9 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 5 Jul 2015 07:52:32 +0000 Subject: [PATCH] gcc/ * target-insns.def (restore_stack_block, restore_stack_function) (restore_stack_nonlocal, save_stack_block, save_stack_function) (save_stack_nonlocal): New targetm instruction patterns. * builtins.c (expand_builtin_apply): Use them instead of HAVE_*/gen_* interface. * explow.c (emit_stack_save, emit_stack_restore): Likewise. From-SVN: r225426 --- gcc/ChangeLog | 9 +++++++++ gcc/builtins.c | 8 ++------ gcc/explow.c | 40 ++++++++++++++-------------------------- gcc/target-insns.def | 6 ++++++ 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 848d4dbb68e..0185b6a987e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-07-05 Richard Sandiford + + * target-insns.def (restore_stack_block, restore_stack_function) + (restore_stack_nonlocal, save_stack_block, save_stack_function) + (save_stack_nonlocal): New targetm instruction patterns. + * builtins.c (expand_builtin_apply): Use them instead of + HAVE_*/gen_* interface. + * explow.c (emit_stack_save, emit_stack_restore): Likewise. + 2015-07-05 Richard Sandiford * target-insns.def (trap): New targetm instruction pattern. diff --git a/gcc/builtins.c b/gcc/builtins.c index d953c634800..3110d0ae30f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1611,11 +1611,9 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize) NO_DEFER_POP; /* Save the stack with nonlocal if available. */ -#ifdef HAVE_save_stack_nonlocal - if (HAVE_save_stack_nonlocal) + if (targetm.have_save_stack_nonlocal ()) emit_stack_save (SAVE_NONLOCAL, &old_stack_level); else -#endif emit_stack_save (SAVE_BLOCK, &old_stack_level); /* Allocate a block of memory onto the stack and copy the memory @@ -1732,11 +1730,9 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize) add_function_usage_to (call_insn, call_fusage); /* Restore the stack. */ -#ifdef HAVE_save_stack_nonlocal - if (HAVE_save_stack_nonlocal) + if (targetm.have_save_stack_nonlocal ()) emit_stack_restore (SAVE_NONLOCAL, old_stack_level); else -#endif emit_stack_restore (SAVE_BLOCK, old_stack_level); fixup_args_size_notes (call_insn, get_last_insn (), 0); diff --git a/gcc/explow.c b/gcc/explow.c index c2158f35f28..c64a3ee95d0 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -973,30 +973,24 @@ emit_stack_save (enum save_level save_level, rtx *psave) { rtx sa = *psave; /* The default is that we use a move insn and save in a Pmode object. */ - rtx (*fcn) (rtx, rtx) = gen_move_insn_uncast; + rtx_insn *(*fcn) (rtx, rtx) = gen_move_insn; machine_mode mode = STACK_SAVEAREA_MODE (save_level); /* See if this machine has anything special to do for this kind of save. */ switch (save_level) { -#ifdef HAVE_save_stack_block case SAVE_BLOCK: - if (HAVE_save_stack_block) - fcn = gen_save_stack_block; + if (targetm.have_save_stack_block ()) + fcn = targetm.gen_save_stack_block; break; -#endif -#ifdef HAVE_save_stack_function case SAVE_FUNCTION: - if (HAVE_save_stack_function) - fcn = gen_save_stack_function; + if (targetm.have_save_stack_function ()) + fcn = targetm.gen_save_stack_function; break; -#endif -#ifdef HAVE_save_stack_nonlocal case SAVE_NONLOCAL: - if (HAVE_save_stack_nonlocal) - fcn = gen_save_stack_nonlocal; + if (targetm.have_save_stack_nonlocal ()) + fcn = targetm.gen_save_stack_nonlocal; break; -#endif default: break; } @@ -1028,7 +1022,7 @@ void emit_stack_restore (enum save_level save_level, rtx sa) { /* The default is that we use a move insn. */ - rtx (*fcn) (rtx, rtx) = gen_move_insn_uncast; + rtx_insn *(*fcn) (rtx, rtx) = gen_move_insn; /* If stack_realign_drap, the x86 backend emits a prologue that aligns both STACK_POINTER and HARD_FRAME_POINTER. @@ -1047,24 +1041,18 @@ emit_stack_restore (enum save_level save_level, rtx sa) /* See if this machine has anything special to do for this kind of save. */ switch (save_level) { -#ifdef HAVE_restore_stack_block case SAVE_BLOCK: - if (HAVE_restore_stack_block) - fcn = gen_restore_stack_block; + if (targetm.have_restore_stack_block ()) + fcn = targetm.gen_restore_stack_block; break; -#endif -#ifdef HAVE_restore_stack_function case SAVE_FUNCTION: - if (HAVE_restore_stack_function) - fcn = gen_restore_stack_function; + if (targetm.have_restore_stack_function ()) + fcn = targetm.gen_restore_stack_function; break; -#endif -#ifdef HAVE_restore_stack_nonlocal case SAVE_NONLOCAL: - if (HAVE_restore_stack_nonlocal) - fcn = gen_restore_stack_nonlocal; + if (targetm.have_restore_stack_nonlocal ()) + fcn = targetm.gen_restore_stack_nonlocal; break; -#endif default: break; } diff --git a/gcc/target-insns.def b/gcc/target-insns.def index 33e112e9200..12994d36ed4 100644 --- a/gcc/target-insns.def +++ b/gcc/target-insns.def @@ -46,7 +46,13 @@ DEF_TARGET_INSN (nonlocal_goto, (rtx x0, rtx x1, rtx x2, rtx x3)) DEF_TARGET_INSN (nonlocal_goto_receiver, (void)) DEF_TARGET_INSN (prefetch, (rtx x0, rtx x1, rtx x2)) DEF_TARGET_INSN (prologue, (void)) +DEF_TARGET_INSN (restore_stack_block, (rtx x0, rtx x1)) +DEF_TARGET_INSN (restore_stack_function, (rtx x0, rtx x1)) +DEF_TARGET_INSN (restore_stack_nonlocal, (rtx x0, rtx x1)) DEF_TARGET_INSN (return, (void)) +DEF_TARGET_INSN (save_stack_block, (rtx x0, rtx x1)) +DEF_TARGET_INSN (save_stack_function, (rtx x0, rtx x1)) +DEF_TARGET_INSN (save_stack_nonlocal, (rtx x0, rtx x1)) DEF_TARGET_INSN (sibcall_epilogue, (void)) DEF_TARGET_INSN (simple_return, (void)) DEF_TARGET_INSN (store_multiple, (rtx x0, rtx x1, rtx x2)) -- 2.30.2