From: Richard Stallman Date: Wed, 25 Nov 1992 17:34:11 +0000 (+0000) Subject: (expand_value_return): Don't emit move between differing modes when PROMOTE_FUNCTION_... X-Git-Tag: misc/cutover-egcs-0~11136 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=77636079f9e3661e3e2321b37a29c20284449f9e;p=gcc.git (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 --- diff --git a/gcc/stmt.c b/gcc/stmt.c index 44950b92312f..6719a5c0cf65 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));