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";
}
&& 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));
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);
}
}
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);
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 ");
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)
{
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. */