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 (untyped_call, untyped_return): New targetm instruction patterns. * builtins.c (expand_builtin_apply): Use them instead of HAVE_*/gen_* interface. (result_vector): Define unconditionally. Index: gcc/target-insns.def =================================================================== --- gcc/target-insns.def 2015-07-05 08:48:34.157410329 +0100 +++ gcc/target-insns.def 2015-07-05 08:48:34.157410329 +0100 @@ -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)) Index: gcc/builtins.c =================================================================== --- gcc/builtins.c 2015-07-05 08:48:34.157410329 +0100 +++ gcc/builtins.c 2015-07-05 08:48:34.153410375 +0100 @@ -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 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;