* [committed] Use target-insns.def for save/restore stack
@ 2015-07-05 7:52 Richard Sandiford
0 siblings, 0 replies; only message in thread
From: Richard Sandiford @ 2015-07-05 7:52 UTC (permalink / raw)
To: gcc-patches
Bootstrapped & regression-tested on x86_64-linux-gnu and aarch64-linux-gnu.
Also tested via config-list.mk. Committed as preapproved.
Thanks,
Richard
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.
Index: gcc/target-insns.def
===================================================================
--- gcc/target-insns.def 2015-07-05 08:51:23.963477604 +0100
+++ gcc/target-insns.def 2015-07-05 08:51:23.955477687 +0100
@@ -46,7 +46,13 @@ DEF_TARGET_INSN (nonlocal_goto, (rtx x0,
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))
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c 2015-07-05 08:51:23.963477604 +0100
+++ gcc/builtins.c 2015-07-05 08:51:23.955477687 +0100
@@ -1611,11 +1611,9 @@ expand_builtin_apply (rtx function, rtx
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
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);
Index: gcc/explow.c
===================================================================
--- gcc/explow.c 2015-07-05 08:51:23.963477604 +0100
+++ gcc/explow.c 2015-07-05 08:51:23.955477687 +0100
@@ -973,30 +973,24 @@ emit_stack_save (enum save_level save_le
{
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 @@ emit_stack_save (enum save_level save_le
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
/* 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;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2015-07-05 7:52 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-05 7:52 [committed] Use target-insns.def for save/restore stack Richard Sandiford
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).