Commit 25662751 by Nathan Sidwell Committed by Nathan Sidwell

nvptx.h (struct machine_function): Add comment.

	* config/nvptx/nvptx.h (struct machine_function): Add comment.
	* config/nvptx/nvptx.c (nvptx_declare_function_name): Functions
	may return pointer as well as in memory.
	(nvptx_output_return): Likewise.

From-SVN: r228618
parent 4835c978
2015-10-08 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx.h (struct machine_function): Add comment.
* config/nvptx/nvptx.c (nvptx_declare_function_name): Functions
may return pointer as well as in memory.
(nvptx_output_return): Likewise.
2015-10-08 Richard Sandiford <richard.sandiford@arm.com> 2015-10-08 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Delete. * builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Delete.
...@@ -531,13 +531,8 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl) ...@@ -531,13 +531,8 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
nvptx_write_function_decl (s, name, decl); nvptx_write_function_decl (s, name, decl);
fprintf (file, "%s", s.str().c_str()); fprintf (file, "%s", s.str().c_str());
bool return_in_mem = false; bool return_in_mem = (TYPE_MODE (result_type) != VOIDmode
if (TYPE_MODE (result_type) != VOIDmode) && !RETURN_IN_REG_P (TYPE_MODE (result_type)));
{
machine_mode mode = TYPE_MODE (result_type);
if (!RETURN_IN_REG_P (mode))
return_in_mem = true;
}
fprintf (file, "\n{\n"); fprintf (file, "\n{\n");
...@@ -547,9 +542,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl) ...@@ -547,9 +542,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
false, return_in_mem); false, return_in_mem);
if (return_in_mem) if (return_in_mem)
fprintf (file, "\t.reg.u%d %%ar1;\n", GET_MODE_BITSIZE (Pmode)); fprintf (file, "\t.reg.u%d %%ar1;\n", GET_MODE_BITSIZE (Pmode));
else if (TYPE_MODE (result_type) != VOIDmode)
/* C++11 ABI causes us to return a reference to the passed in
pointer for return_in_mem. */
if (cfun->machine->ret_reg_mode != VOIDmode)
{ {
machine_mode mode = arg_promotion (TYPE_MODE (result_type)); machine_mode mode = arg_promotion
((machine_mode)cfun->machine->ret_reg_mode);
fprintf (file, "\t.reg%s %%retval;\n", fprintf (file, "\t.reg%s %%retval;\n",
nvptx_ptx_type_from_mode (mode, false)); nvptx_ptx_type_from_mode (mode, false));
} }
...@@ -635,17 +634,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl) ...@@ -635,17 +634,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
const char * const char *
nvptx_output_return (void) nvptx_output_return (void)
{ {
tree fntype = TREE_TYPE (current_function_decl); machine_mode mode = (machine_mode)cfun->machine->ret_reg_mode;
tree result_type = TREE_TYPE (fntype);
if (TYPE_MODE (result_type) != VOIDmode) if (mode != VOIDmode)
{ {
machine_mode mode = TYPE_MODE (result_type); mode = arg_promotion (mode);
if (RETURN_IN_REG_P (mode)) fprintf (asm_out_file, "\tst.param%s\t[%%out_retval], %%retval;\n",
{ nvptx_ptx_type_from_mode (mode, false));
mode = arg_promotion (mode);
fprintf (asm_out_file, "\tst.param%s\t[%%out_retval], %%retval;\n",
nvptx_ptx_type_from_mode (mode, false));
}
} }
return "ret;"; return "ret;";
......
...@@ -228,7 +228,7 @@ struct GTY(()) machine_function ...@@ -228,7 +228,7 @@ struct GTY(()) machine_function
bool has_call_with_varargs; bool has_call_with_varargs;
bool has_call_with_sc; bool has_call_with_sc;
HOST_WIDE_INT outgoing_stdarg_size; HOST_WIDE_INT outgoing_stdarg_size;
int ret_reg_mode; int ret_reg_mode; /* machine_mode not defined yet. */
int punning_buffer_size; int punning_buffer_size;
}; };
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment