From 77636079f9e3661e3e2321b37a29c20284449f9e Mon Sep 17 00:00:00 2001 From: Richard Stallman Date: Wed, 25 Nov 1992 17:34:11 +0000 Subject: [PATCH] (expand_value_return): Don't emit move between differing modes when PROMOTE_FUNCTION_RETURN is defined... (expand_value_return): Don't emit move between differing modes when PROMOTE_FUNCTION_RETURN is defined; convert instead. From-SVN: r2795 --- gcc/stmt.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/stmt.c b/gcc/stmt.c index 44950b92312..6719a5c0cf6 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -2185,7 +2185,26 @@ expand_value_return (val) unless it's already there. */ if (return_reg != val) - emit_move_insn (return_reg, val); + { +#ifdef PROMOTE_FUNCTION_RETURN + enum machine_mode mode = DECL_MODE (DECL_RESULT (current_function_decl)); + tree type = TREE_TYPE (DECL_RESULT (current_function_decl)); + int unsignedp = TREE_UNSIGNED (type); + + if (TREE_CODE (type) == INTEGER_TYPE || TREE_CODE (type) == ENUMERAL_TYPE + || TREE_CODE (type) == BOOLEAN_TYPE || TREE_CODE (type) == CHAR_TYPE + || TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == POINTER_TYPE + || TREE_CODE (type) == OFFSET_TYPE) + { + PROMOTE_MODE (mode, unsignedp, type); + } + + if (GET_MODE (val) != VOIDmode && GET_MODE (val) != mode) + convert_to_mode (return_reg, val, unsignedp); + else +#endif + emit_move_insn (return_reg, val); + } if (GET_CODE (return_reg) == REG && REGNO (return_reg) < FIRST_PSEUDO_REGISTER) emit_insn (gen_rtx (USE, VOIDmode, return_reg)); -- 2.30.2