tm.texi (TARGET_PROMOTE_FUNCTION_MODE): Add documentation for for_return == 2.

2009-08-12  Paolo Bonzini  <bonzini@gnu.org>

	* doc/tm.texi (TARGET_PROMOTE_FUNCTION_MODE): Add documentation
	for for_return == 2.
	* function.c (assign_parm_setup_reg): Use for_return == 2, improve
	comments.
	* calls.c (expand_call): Fix typo.
	* explow.c (promote_decl_mode): Use for_return == 2 for RESULT_DECL
	and PARM_DECL.
	* stmt.c (expand_value_return): Use promote_function_mode to copy out
	of pseudo.
	* targhooks.c (default_promote_function_mode): Handle for_return == 2.
	* config/cris/cris.c (cris_promote_function_mode): Likewise.
	* config/mmix/mmix.c (mmix_promote_function_mode): Likewise.
	* config/pa/pa.c (pa_promote_function_mode): Likewise.

From-SVN: r150700
This commit is contained in:
Paolo Bonzini 2009-08-12 16:23:12 +00:00 committed by Paolo Bonzini
parent 4b462d7786
commit 666e3cebe1
10 changed files with 46 additions and 28 deletions

View File

@ -1,3 +1,19 @@
2009-08-12 Paolo Bonzini <bonzini@gnu.org>
* doc/tm.texi (TARGET_PROMOTE_FUNCTION_MODE): Add documentation
for for_return == 2.
* function.c (assign_parm_setup_reg): Use for_return == 2, improve
comments.
* calls.c (expand_call): Fix typo.
* explow.c (promote_decl_mode): Use for_return == 2 for RESULT_DECL
and PARM_DECL.
* stmt.c (expand_value_return): Use promote_function_mode to copy out
of pseudo.
* targhooks.c (default_promote_function_mode): Handle for_return == 2.
* config/cris/cris.c (cris_promote_function_mode): Likewise.
* config/mmix/mmix.c (mmix_promote_function_mode): Likewise.
* config/pa/pa.c (pa_promote_function_mode): Likewise.
2009-08-11 Andrew Haley <aph@redhat.com> 2009-08-11 Andrew Haley <aph@redhat.com>
* config/arm/arm.c (arm_init_libfuncs): Add __sync_synchronize. * config/arm/arm.c (arm_init_libfuncs): Add __sync_synchronize.

View File

@ -2353,9 +2353,9 @@ expand_call (tree exp, rtx target, int ignore)
&caller_unsignedp, &caller_unsignedp,
TREE_TYPE (current_function_decl), 1); TREE_TYPE (current_function_decl), 1);
callee_promoted_mode callee_promoted_mode
= promote_function_mode (TREE_TYPE (caller_res), callee_mode, = promote_function_mode (TREE_TYPE (funtype), callee_mode,
&callee_unsignedp, &callee_unsignedp,
TREE_TYPE (funtype), 1); funtype, 1);
if (caller_mode != VOIDmode if (caller_mode != VOIDmode
&& (caller_promoted_mode != callee_promoted_mode && (caller_promoted_mode != callee_promoted_mode
|| ((caller_mode != caller_promoted_mode || ((caller_mode != caller_promoted_mode

View File

@ -3771,7 +3771,7 @@ cris_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
/* Defining PROMOTE_FUNCTION_RETURN in gcc-2.7.2 uncovered bug 981110 (even /* Defining PROMOTE_FUNCTION_RETURN in gcc-2.7.2 uncovered bug 981110 (even
when modifying FUNCTION_VALUE to return the promoted mode). Maybe when modifying FUNCTION_VALUE to return the promoted mode). Maybe
pointless as of now, but let's keep the old behavior. */ pointless as of now, but let's keep the old behavior. */
if (for_return) if (for_return == 1)
return mode; return mode;
return CRIS_PROMOTED_MODE (mode, *punsignedp, type); return CRIS_PROMOTED_MODE (mode, *punsignedp, type);
} }

View File

@ -2701,7 +2701,7 @@ mmix_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
{ {
/* Apparently not doing TRT if int < register-size. FIXME: Perhaps /* Apparently not doing TRT if int < register-size. FIXME: Perhaps
FUNCTION_VALUE and LIBCALL_VALUE needs tweaking as some ports say. */ FUNCTION_VALUE and LIBCALL_VALUE needs tweaking as some ports say. */
if (for_return) if (for_return == 1)
return mode; return mode;
/* Promotion of modes currently generates slow code, extending before /* Promotion of modes currently generates slow code, extending before

View File

@ -9199,7 +9199,7 @@ pa_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
const_tree fntype ATTRIBUTE_UNUSED, const_tree fntype ATTRIBUTE_UNUSED,
int for_return) int for_return)
{ {
if (!for_return) if (for_return == 0)
return mode; return mode;
return promote_mode (type, mode, punsignedp); return promote_mode (type, mode, punsignedp);
} }

View File

@ -1046,13 +1046,17 @@ and possibly change @code{*@var{punsignedp}} if the promotion should
change signedness. This function is called only for scalar @emph{or change signedness. This function is called only for scalar @emph{or
pointer} types. pointer} types.
@var{for_return} allows to distinguish the promotion of arguments and
return values. If it is @code{1}, a return value is being promoted and
@code{TARGET_FUNCTION_VALUE} must perform the same promotions done here.
If it is @code{2}, the returned mode should be that of the register in
which an incoming parameter is copied, or the outgoing result is computed;
then the hook should return the same mode as @code{promote_mode}, though
the signedness may be different.
The default is to not promote arguments and return values. You can The default is to not promote arguments and return values. You can
also define the hook to @code{default_promote_function_mode_always_promote} also define the hook to @code{default_promote_function_mode_always_promote}
if you would like to apply the same rules given by @code{PROMOTE_MODE}. if you would like to apply the same rules given by @code{PROMOTE_MODE}.
@var{for_return} allows to distinguish the promotion of arguments and
return values. If this target hook promotes return values,
@code{TARGET_FUNCTION_VALUE} must perform the same promotions done here.
@end deftypefn @end deftypefn
@defmac PARM_BOUNDARY @defmac PARM_BOUNDARY

View File

@ -825,12 +825,10 @@ promote_decl_mode (const_tree decl, int *punsignedp)
enum machine_mode mode = DECL_MODE (decl); enum machine_mode mode = DECL_MODE (decl);
enum machine_mode pmode; enum machine_mode pmode;
if (TREE_CODE (decl) == RESULT_DECL) if (TREE_CODE (decl) == RESULT_DECL
|| TREE_CODE (decl) == PARM_DECL)
pmode = promote_function_mode (type, mode, &unsignedp, pmode = promote_function_mode (type, mode, &unsignedp,
TREE_TYPE (current_function_decl), 1); TREE_TYPE (current_function_decl), 2);
else if (TREE_CODE (decl) == PARM_DECL)
pmode = promote_function_mode (type, mode, &unsignedp,
TREE_TYPE (current_function_decl), 0);
else else
pmode = promote_mode (type, mode, &unsignedp); pmode = promote_mode (type, mode, &unsignedp);

View File

@ -2770,13 +2770,11 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
bool did_conversion = false; bool did_conversion = false;
/* Store the parm in a pseudoregister during the function, but we may /* Store the parm in a pseudoregister during the function, but we may
need to do it in a wider mode. */ need to do it in a wider mode. Using 2 here makes the result
consistent with promote_decl_mode and thus expand_expr_real_1. */
/* This is not really promoting for a call. However we need to be
consistent with assign_parm_find_data_types and expand_expr_real_1. */
promoted_nominal_mode promoted_nominal_mode
= promote_function_mode (data->nominal_type, data->nominal_mode, &unsignedp, = promote_function_mode (data->nominal_type, data->nominal_mode, &unsignedp,
TREE_TYPE (current_function_decl), 0); TREE_TYPE (current_function_decl), 2);
parmreg = gen_reg_rtx (promoted_nominal_mode); parmreg = gen_reg_rtx (promoted_nominal_mode);
@ -2796,7 +2794,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
assign_parm_remove_parallels (data); assign_parm_remove_parallels (data);
/* Copy the value into the register. */ /* Copy the value into the register, thus bridging between
assign_parm_find_data_types and expand_expr_real_1. */
if (data->nominal_mode != data->passed_mode if (data->nominal_mode != data->passed_mode
|| promoted_nominal_mode != data->promoted_mode) || promoted_nominal_mode != data->promoted_mode)
{ {

View File

@ -1511,25 +1511,24 @@ expand_naked_return (void)
static void static void
expand_value_return (rtx val) expand_value_return (rtx val)
{ {
/* Copy the value to the return location /* Copy the value to the return location unless it's already there. */
unless it's already there. */
tree decl = DECL_RESULT (current_function_decl); tree decl = DECL_RESULT (current_function_decl);
rtx return_reg = DECL_RTL (decl); rtx return_reg = DECL_RTL (decl);
if (return_reg != val) if (return_reg != val)
{ {
int unsignedp; tree funtype = TREE_TYPE (current_function_decl);
tree type = TREE_TYPE (decl);
int unsignedp = TYPE_UNSIGNED (type);
enum machine_mode old_mode = DECL_MODE (decl); enum machine_mode old_mode = DECL_MODE (decl);
enum machine_mode mode = promote_decl_mode (decl, &unsignedp); enum machine_mode mode = promote_function_mode (type, old_mode,
&unsignedp, funtype, 1);
if (mode != old_mode) if (mode != old_mode)
val = convert_modes (mode, old_mode, val, unsignedp); val = convert_modes (mode, old_mode, val, unsignedp);
if (GET_CODE (return_reg) == PARALLEL) if (GET_CODE (return_reg) == PARALLEL)
{ emit_group_load (return_reg, val, type, int_size_in_bytes (type));
tree type = TREE_TYPE (decl);
emit_group_load (return_reg, val, type, int_size_in_bytes (type));
}
else else
emit_move_insn (return_reg, val); emit_move_insn (return_reg, val);
} }

View File

@ -119,6 +119,8 @@ default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
const_tree funtype ATTRIBUTE_UNUSED, const_tree funtype ATTRIBUTE_UNUSED,
int for_return ATTRIBUTE_UNUSED) int for_return ATTRIBUTE_UNUSED)
{ {
if (for_return == 2)
return promote_mode (type, mode, punsignedp);
return mode; return mode;
} }