+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>
* builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Delete.
nvptx_write_function_decl (s, name, decl);
fprintf (file, "%s", s.str().c_str());
- bool return_in_mem = false;
- if (TYPE_MODE (result_type) != VOIDmode)
- {
- machine_mode mode = TYPE_MODE (result_type);
- if (!RETURN_IN_REG_P (mode))
- return_in_mem = true;
- }
+ bool return_in_mem = (TYPE_MODE (result_type) != VOIDmode
+ && !RETURN_IN_REG_P (TYPE_MODE (result_type)));
fprintf (file, "\n{\n");
false, return_in_mem);
if (return_in_mem)
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",
nvptx_ptx_type_from_mode (mode, false));
}
const char *
nvptx_output_return (void)
{
- tree fntype = TREE_TYPE (current_function_decl);
- tree result_type = TREE_TYPE (fntype);
- if (TYPE_MODE (result_type) != VOIDmode)
+ machine_mode mode = (machine_mode)cfun->machine->ret_reg_mode;
+
+ if (mode != VOIDmode)
{
- machine_mode mode = TYPE_MODE (result_type);
- if (RETURN_IN_REG_P (mode))
- {
- mode = arg_promotion (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;";