From 43c7dca8816e84a7b2d6caa10bed3c0a3c0c7e8e Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 5 Jul 2015 07:49:16 +0000 Subject: [PATCH] target-insns.def (untyped_call, [...]): New targetm instruction patterns. gcc/ * target-insns.def (untyped_call, untyped_return): New targetm instruction patterns. * builtins.c (expand_builtin_apply): Use them instead of HAVE_*/gen_* interface. (result_vector): Define unconditionally. From-SVN: r225423 --- gcc/ChangeLog | 8 ++++++++ gcc/builtins.c | 22 +++++++++------------- gcc/target-insns.def | 2 ++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bcc35c046dd..da88d10d24a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-07-05 Richard Sandiford + + * target-insns.def (untyped_call, untyped_return): New targetm + instruction patterns. + * builtins.c (expand_builtin_apply): Use them instead of + HAVE_*/gen_* interface. + (result_vector): Define unconditionally. + 2015-07-05 Richard Sandiford * target-insns.def (builtin_longjmp, builtin_setjmp_receiver) diff --git a/gcc/builtins.c b/gcc/builtins.c index c5a79803517..f35469493d6 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -104,9 +104,7 @@ static int target_char_cast (tree, char *); static rtx get_memory_rtx (tree, tree); static int apply_args_size (void); static int apply_result_size (void); -#if defined (HAVE_untyped_call) || defined (HAVE_untyped_return) static rtx result_vector (int, rtx); -#endif static void expand_builtin_prefetch (tree); static rtx expand_builtin_apply_args (void); static rtx expand_builtin_apply_args_1 (void); @@ -1448,7 +1446,6 @@ apply_result_size (void) return size; } -#if defined (HAVE_untyped_call) || defined (HAVE_untyped_return) /* Create a vector describing the result block RESULT. If SAVEP is true, the result block is used to save the values; otherwise it is used to restore the values. */ @@ -1477,7 +1474,6 @@ result_vector (int savep, rtx result) } return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelts, savevec)); } -#endif /* HAVE_untyped_call or HAVE_untyped_return */ /* Save the state required to perform an untyped call with the same arguments as were passed to the current function. */ @@ -1698,12 +1694,13 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize) function = memory_address (FUNCTION_MODE, function); /* Generate the actual call instruction and save the return value. */ -#ifdef HAVE_untyped_call - if (HAVE_untyped_call) - emit_call_insn (gen_untyped_call (gen_rtx_MEM (FUNCTION_MODE, function), - result, result_vector (1, result))); + if (targetm.have_untyped_call ()) + { + rtx mem = gen_rtx_MEM (FUNCTION_MODE, function); + emit_call_insn (targetm.gen_untyped_call (mem, result, + result_vector (1, result))); + } else -#endif #ifdef HAVE_call_value if (HAVE_call_value) { @@ -1767,14 +1764,13 @@ expand_builtin_return (rtx result) apply_result_size (); result = gen_rtx_MEM (BLKmode, result); -#ifdef HAVE_untyped_return - if (HAVE_untyped_return) + if (targetm.have_untyped_return ()) { - emit_jump_insn (gen_untyped_return (result, result_vector (0, result))); + rtx vector = result_vector (0, result); + emit_jump_insn (targetm.gen_untyped_return (result, vector)); emit_barrier (); return; } -#endif /* Restore the return value and note that each value is used. */ size = 0; diff --git a/gcc/target-insns.def b/gcc/target-insns.def index bc4aa4d5f7c..61ec9a7de3b 100644 --- a/gcc/target-insns.def +++ b/gcc/target-insns.def @@ -50,3 +50,5 @@ DEF_TARGET_INSN (sibcall_epilogue, (void)) DEF_TARGET_INSN (simple_return, (void)) DEF_TARGET_INSN (store_multiple, (rtx x0, rtx x1, rtx x2)) DEF_TARGET_INSN (tablejump, (rtx x0, rtx x1)) +DEF_TARGET_INSN (untyped_call, (rtx x0, rtx x1, rtx x2)) +DEF_TARGET_INSN (untyped_return, (rtx x0, rtx x1)) -- 2.30.2