target-insns.def (untyped_call, [...]): New targetm instruction patterns.
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 5 Jul 2015 07:49:16 +0000 (07:49 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 5 Jul 2015 07:49:16 +0000 (07:49 +0000)
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
gcc/builtins.c
gcc/target-insns.def

index bcc35c046dd4b01875b4dd0f68b01a4ff69b0721..da88d10d24a12c70cef6807fc616c4acb32f778e 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-05  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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  <richard.sandiford@arm.com>
 
        * target-insns.def (builtin_longjmp, builtin_setjmp_receiver)
index c5a79803517a534aa8c7941e4964ed0a4764fd70..f35469493d6e6f2cffb55776612c08b194b862c3 100644 (file)
@@ -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;
index bc4aa4d5f7c620b06422715924dab90090810a11..61ec9a7de3b56d80c888d68281c8ae518fc8aefb 100644 (file)
@@ -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))