aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-11-25 17:34:11 +0000
committerRichard Stallman <rms@gnu.org>1992-11-25 17:34:11 +0000
commit77636079f9e3661e3e2321b37a29c20284449f9e (patch)
treeb1b3cbd8aa97fdbdf688c80916ddfa5c17fa0d03
parent32436219b6f789d1400d15e1da117d741033bf2e (diff)
downloadgcc-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.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 44950b9..6719a5c 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));