nvptx.c (write_func_decl_from_insn): Replace callee arg with name.
authorNathan Sidwell <nathan@acm.org>
Thu, 26 Nov 2015 14:13:28 +0000 (14:13 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 26 Nov 2015 14:13:28 +0000 (14:13 +0000)
* config/nvptx/nvptx.c (write_func_decl_from_insn): Replace callee
arg with name.  Don't deal with split regs.  Tweak formatting.
(nvptx_expand_call): Adjust write_func_decl_from_insn call.
(nvptx_output_call_insn): Don't deal with split regs here.

testsuite/
* gcc.target/nvptx/proto-1.c: Adjust expected asm.

From-SVN: r230965

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/nvptx/proto-1.c

index 38c9436e51a5ac074fe56f3627a2b443f999c401..98bd3f685197934f1ccfc0990048732d0c16886d 100644 (file)
@@ -1,3 +1,10 @@
+2015-11-26  Nathan Sidwell  <nathan@acm.org>
+
+       * config/nvptx/nvptx.c (write_func_decl_from_insn): Replace callee
+       arg with name.  Don't deal with split regs.  Tweak formatting.
+       (nvptx_expand_call): Adjust write_func_decl_from_insn call.
+       (nvptx_output_call_insn): Don't deal with split regs here.
+
 2015-11-26  Matthew Wahab  <matthew.wahab@arm.com>
 
        * config/aarch64/aarch64-simd-builtins.def
index a0499ac83748715b365dfc5241f78da2daa6b1a5..61030f2f40a671e50fd7842ff46814b1d1fac179 100644 (file)
@@ -719,69 +719,46 @@ nvptx_output_return (void)
    generated by emit_library_call for which no decl exists.  */
 
 static void
-write_func_decl_from_insn (std::stringstream &s, rtx result, rtx pat,
-                          rtx callee)
+write_func_decl_from_insn (std::stringstream &s, const char *name,
+                          rtx result, rtx pat)
 {
-  bool callprototype = register_operand (callee, Pmode);
-  const char *name = "_";
-  if (!callprototype)
+  if (!name)
+    {
+      s << "\t.callprototype ";
+      name = "_";
+    }
+  else
     {
-      name = XSTR (callee, 0);
-      name = nvptx_name_replacement (name);
       s << "\n// BEGIN GLOBAL FUNCTION DECL: " << name << "\n";
+      s << "\t.extern .func ";
     }
-  s << (callprototype ? "\t.callprototype\t" : "\t.extern .func ");
 
   if (result != NULL_RTX)
-    {
-      s << "(.param";
-      s << nvptx_ptx_type_from_mode (arg_promotion (GET_MODE (result)),
-                                    false);
-      s << " ";
-      if (callprototype)
-       s << "_";
-      else
-       s << "%out_retval";
-      s << ")";
-    }
+    s << "(.param"
+      << nvptx_ptx_type_from_mode (arg_promotion (GET_MODE (result)), false)
+      << " %rval) ";
 
   s << name;
 
+  const char *sep = " (";
   int arg_end = XVECLEN (pat, 0);
-      
-  if (1 < arg_end)
+  for (int i = 1; i < arg_end; i++)
     {
-      const char *comma = "";
-      s << " (";
-      for (int i = 1; i < arg_end; i++)
-       {
-         rtx t = XEXP (XVECEXP (pat, 0, i), 0);
-         machine_mode mode = GET_MODE (t);
-         machine_mode split = maybe_split_mode (mode);
-         int count = 1;
-
-         if (split != VOIDmode)
-           {
-             mode = split;
-             count = 2;
-           }
-
-         while (count--)
-           {
-             s << comma << ".param";
-             s << nvptx_ptx_type_from_mode (mode, false);
-             s << " ";
-             if (callprototype)
-               s << "_";
-             else
-               s << "%arg" << i - 1;
-             if (mode == QImode || mode == HImode)
-               s << "[1]";
-             comma = ", ";
-           }
-       }
-      s << ")";
+      /* We don't have to deal with mode splitting here, as that was
+        already done when generating the call sequence.  */
+      machine_mode mode = GET_MODE (XEXP (XVECEXP (pat, 0, i), 0));
+
+      s << sep
+       << ".param"
+       << nvptx_ptx_type_from_mode (mode, false)
+       << " %arg"
+       << i;
+      if (mode == QImode || mode == HImode)
+       s << "[1]";
+      sep = ", ";
     }
+  if (arg_end != 1)
+    s << ")";
   s << ";\n";
 }
 
@@ -905,10 +882,7 @@ nvptx_expand_call (rtx retval, rtx address)
       && stdarg_p (cfun->machine->funtype))
     {
       varargs = gen_reg_rtx (Pmode);
-      if (Pmode == DImode)
-       emit_move_insn (varargs, stack_pointer_rtx);
-      else
-       emit_move_insn (varargs, stack_pointer_rtx);
+      emit_move_insn (varargs, stack_pointer_rtx);
       cfun->machine->has_call_with_varargs = true;
     }
   vec = rtvec_alloc (nargs + 1 + (varargs ? 1 : 0));
@@ -951,7 +925,11 @@ nvptx_expand_call (rtx retval, rtx address)
       if (*slot == NULL)
        {
          *slot = callee;
-         write_func_decl_from_insn (func_decls, retval, pat, callee);
+
+         const char *name = XSTR (callee, 0);
+         if (decl_type)
+           name = nvptx_name_replacement (name);
+         write_func_decl_from_insn (func_decls, name, retval, pat);
        }
     }
 
@@ -1798,7 +1776,7 @@ nvptx_assemble_undefined_decl (FILE *file, const char *name, const_tree decl)
 const char *
 nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee)
 {
-  char buf[256];
+  char buf[16];
   static int labelno;
   bool needs_tgt = register_operand (callee, Pmode);
   rtx pat = PATTERN (insn);
@@ -1825,36 +1803,22 @@ nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee)
       labelno++;
       ASM_OUTPUT_LABEL (asm_out_file, buf);
       std::stringstream s;
-      write_func_decl_from_insn (s, result, pat, callee);
+      write_func_decl_from_insn (s, NULL, result, pat);
       fputs (s.str().c_str(), asm_out_file);
     }
 
-  for (int i = 1, argno = 0; i < arg_end; i++)
+  for (int argno = 1; argno < arg_end; argno++)
     {
-      rtx t = XEXP (XVECEXP (pat, 0, i), 0);
+      rtx t = XEXP (XVECEXP (pat, 0, argno), 0);
       machine_mode mode = GET_MODE (t);
-      machine_mode split = maybe_split_mode (mode);
-      int count = 1;
-      
-      if (split != VOIDmode)
-       {
-         mode = split;
-         count = 2;
-       }
 
-      for (int n = 0; n != count; n++)
-       {
-         fprintf (asm_out_file, "\t\t.param%s %%out_arg%d%s;\n",
-                  nvptx_ptx_type_from_mode (mode, false), argno,
-                  mode == QImode || mode == HImode ? "[1]" : "");
-         fprintf (asm_out_file, "\t\tst.param%s [%%out_arg%d], %%r%d",
-                  nvptx_ptx_type_from_mode (mode, false), argno,
-                  REGNO (t));
-         if (split != VOIDmode)
-           fprintf (asm_out_file, "$%d", n);
-         fprintf (asm_out_file, ";\n");
-         argno++;
-       }
+      /* Mode splitting has already been done.  */
+      fprintf (asm_out_file, "\t\t.param%s %%out_arg%d%s;\n",
+              nvptx_ptx_type_from_mode (mode, false), argno,
+              mode == QImode || mode == HImode ? "[1]" : "");
+      fprintf (asm_out_file, "\t\tst.param%s [%%out_arg%d], %%r%d;\n",
+              nvptx_ptx_type_from_mode (mode, false), argno,
+              REGNO (t));
     }
 
   fprintf (asm_out_file, "\t\tcall ");
@@ -1870,31 +1834,20 @@ nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee)
   else
     output_address (VOIDmode, callee);
 
-  if (arg_end > 1 || (decl && DECL_STATIC_CHAIN (decl)))
+  const char *open = "(";
+  for (int argno = 1; argno < arg_end; argno++)
     {
-      const char *comma = "";
-      
-      fprintf (asm_out_file, ", (");
-      for (int i = 1, argno = 0; i < arg_end; i++)
-       {
-         rtx t = XEXP (XVECEXP (pat, 0, i), 0);
-         machine_mode mode = GET_MODE (t);
-         machine_mode split = maybe_split_mode (mode);
-
-         if (split != VOIDmode)
-           {
-             fprintf (asm_out_file, "%s%%out_arg%d", comma, argno++);
-             comma = ", ";
-           }
-         fprintf (asm_out_file, "%s%%out_arg%d", comma, argno++);
-         comma = ", ";
-       }
-      if (decl && DECL_STATIC_CHAIN (decl))
-       fprintf (asm_out_file, "%s%s", comma,
-                reg_names [OUTGOING_STATIC_CHAIN_REGNUM]);
-
-      fprintf (asm_out_file, ")");
+      fprintf (asm_out_file, ", %s%%out_arg%d", open, argno);
+      open = "";
     }
+  if (decl && DECL_STATIC_CHAIN (decl))
+    {
+      fprintf (asm_out_file, ", %s%s", open,
+              reg_names [OUTGOING_STATIC_CHAIN_REGNUM]);
+      open = "";
+    }
+  if (!open[0])
+    fprintf (asm_out_file, ")");
 
   if (needs_tgt)
     {
@@ -1902,10 +1855,8 @@ nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee)
       assemble_name (asm_out_file, buf);
     }
   fprintf (asm_out_file, ";\n");
-  if (result != NULL_RTX)
-    return "\tld.param%t0\t%0, [%%retval_in];\n\t}";
 
-  return "}";
+  return result != NULL_RTX ? "\tld.param%t0\t%0, [%%retval_in];\n\t}" : "}";
 }
 
 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P.  */
index cf4f4863aa6442354e08bb8de68b20dd8bae075b..46810e8191ff6b16fecd0f1933665c748b96ed0e 100644 (file)
@@ -1,3 +1,7 @@
+2015-11-26  Nathan Sidwell  <nathan@acm.org>
+
+       * gcc.target/nvptx/proto-1.c: Adjust expected asm.
+
 2015-11-26  Richard Biener  <rguenther@suse.de>
 
        PR testsuite/68555
index 5f7735928fed0fb2f1b6030bf8b6c8d9942b2e80..6245d915ed4afb99b061a50516d48f162918d628 100644 (file)
@@ -6,8 +6,8 @@ int f(void)
 
   /* Check that without an explicit prototype, we deduce from call site the
      signature for the (mandatory in PTX) prototype.  */
-  /* extern int acc_on_device_(int *); */
+  /* extern int foo (int *); */
   /* { dg-final { scan-assembler-not "\\\.callprototype" } } */
-  /* { dg-final { scan-assembler "\\\.extern \\\.func \\\(\[^,\n\r\]+\\\)acc_on_device_ \\\(\[^,\n\r\]+\\\);" } } */
-  return !acc_on_device_(&dev);
+  /* { dg-final { scan-assembler "\\\.extern \\\.func \\\(\[^,\n\r\]+\\\) foo \\\(\[^,\n\r\]+\\\);" } } */
+  return !foo(&dev);
 }