diff options
author | Nathan Sidwell <nathan@acm.org> | 2015-11-26 14:13:28 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2015-11-26 14:13:28 +0000 |
commit | 863af9a44a8f5995d57055054e84ff379a62440a (patch) | |
tree | 434630d2024f7693ad067fdab445822a10200ff8 /gcc/config/nvptx | |
parent | 5977cb070e54643f79b5a05a5378fe060e0319da (diff) | |
download | gcc-863af9a44a8f5995d57055054e84ff379a62440a.zip gcc-863af9a44a8f5995d57055054e84ff379a62440a.tar.gz gcc-863af9a44a8f5995d57055054e84ff379a62440a.tar.bz2 |
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
Diffstat (limited to 'gcc/config/nvptx')
-rw-r--r-- | gcc/config/nvptx/nvptx.c | 165 |
1 files changed, 58 insertions, 107 deletions
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index a0499ac..61030f2 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. */ |