From e2f289f3c75abb5716f15cd7d3e0d78b0439f952 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 19 Oct 2010 10:26:31 +0000 Subject: [PATCH] rx.c (rx_function_value): Small integer types are promotes to SImode. * config/rx/rx.c (rx_function_value): Small integer types are promotes to SImode. (rx_promote_function_mode): New function. (TARGET_PROMOTE_FUNCTION_MODE): Define. From-SVN: r165690 --- gcc/ChangeLog | 7 +++++++ gcc/config/rx/rx.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d6ada9d4018..e124df79ed51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-10-19 Nick Clifton + + * config/rx/rx.c (rx_function_value): Small integer types are + promotes to SImode. + (rx_promote_function_mode): New function. + (TARGET_PROMOTE_FUNCTION_MODE): Define. + 2010-10-19 Nick Clifton * config/mep/mep.c (mep_print_operand): Use diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index f087c665d06b..2ce5f5895bc6 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -830,7 +830,32 @@ rx_function_value (const_tree ret_type, const_tree fn_decl_or_type ATTRIBUTE_UNUSED, bool outgoing ATTRIBUTE_UNUSED) { - return gen_rtx_REG (TYPE_MODE (ret_type), FUNC_RETURN_REGNUM); + enum machine_mode mode = TYPE_MODE (ret_type); + + /* RX ABI specifies that small integer types are + promoted to int when returned by a function. */ + if (GET_MODE_SIZE (mode) > 0 && GET_MODE_SIZE (mode) < 4) + return gen_rtx_REG (SImode, FUNC_RETURN_REGNUM); + + return gen_rtx_REG (mode, FUNC_RETURN_REGNUM); +} + +/* TARGET_PROMOTE_FUNCTION_MODE must behave in the same way with + regard to function returns as does TARGET_FUNCTION_VALUE. */ + +static enum machine_mode +rx_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, + enum machine_mode mode, + int * punsignedp, + const_tree funtype ATTRIBUTE_UNUSED, + int for_return) +{ + if (for_return != 1 + || GET_MODE_SIZE (mode) >= 4 + || GET_MODE_SIZE (mode) < 1) + return mode; + + return SImode; } static bool @@ -2825,6 +2850,9 @@ rx_memory_move_cost (enum machine_mode mode, enum reg_class regclass, bool in) #undef TARGET_OPTION_OVERRIDE #define TARGET_OPTION_OVERRIDE rx_option_override +#undef TARGET_PROMOTE_FUNCTION_MODE +#define TARGET_PROMOTE_FUNCTION_MODE rx_promote_function_mode + #undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE #define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE rx_override_options_after_change -- 2.43.5