diff options
author | Richard Stallman <rms@gnu.org> | 1992-11-25 17:34:11 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-11-25 17:34:11 +0000 |
commit | 77636079f9e3661e3e2321b37a29c20284449f9e (patch) | |
tree | b1b3cbd8aa97fdbdf688c80916ddfa5c17fa0d03 | |
parent | 32436219b6f789d1400d15e1da117d741033bf2e (diff) | |
download | gcc-77636079f9e3661e3e2321b37a29c20284449f9e.zip gcc-77636079f9e3661e3e2321b37a29c20284449f9e.tar.gz gcc-77636079f9e3661e3e2321b37a29c20284449f9e.tar.bz2 |
(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
-rw-r--r-- | gcc/stmt.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -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)); |