From 863af9a44a8f5995d57055054e84ff379a62440a Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 26 Nov 2015 14:13:28 +0000 Subject: [PATCH] nvptx.c (write_func_decl_from_insn): Replace callee arg with name. * 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 | 7 + gcc/config/nvptx/nvptx.c | 165 ++++++++--------------- gcc/testsuite/ChangeLog | 4 + gcc/testsuite/gcc.target/nvptx/proto-1.c | 6 +- 4 files changed, 72 insertions(+), 110 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38c9436e51a..98bd3f68519 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-11-26 Nathan Sidwell + + * 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 * config/aarch64/aarch64-simd-builtins.def diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index a0499ac8374..61030f2f40a 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cf4f4863aa6..46810e8191f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-11-26 Nathan Sidwell + + * gcc.target/nvptx/proto-1.c: Adjust expected asm. + 2015-11-26 Richard Biener PR testsuite/68555 diff --git a/gcc/testsuite/gcc.target/nvptx/proto-1.c b/gcc/testsuite/gcc.target/nvptx/proto-1.c index 5f7735928fe..6245d915ed4 100644 --- a/gcc/testsuite/gcc.target/nvptx/proto-1.c +++ b/gcc/testsuite/gcc.target/nvptx/proto-1.c @@ -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); } -- 2.30.2