]> gcc.gnu.org Git - gcc.git/commitdiff
(expand_value_return): Don't emit move between differing modes when PROMOTE_FUNCTION_...
authorRichard Stallman <rms@gnu.org>
Wed, 25 Nov 1992 17:34:11 +0000 (17:34 +0000)
committerRichard Stallman <rms@gnu.org>
Wed, 25 Nov 1992 17:34:11 +0000 (17:34 +0000)
(expand_value_return): Don't emit move between differing
modes when PROMOTE_FUNCTION_RETURN is defined; convert instead.

From-SVN: r2795

gcc/stmt.c

index 44950b92312f56206c9ab7f5d6df18abb878548e..6719a5c0cf65aa9187532463c5eb4f7736e26a18 100644 (file)
@@ -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));
This page took 0.06638 seconds and 5 git commands to generate.