mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
4b462d7786
commit
666e3cebe1
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
15
gcc/stmt.c
15
gcc/stmt.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue