aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2007-02-12 10:46:16 -0800
committerRichard Henderson <rth@gcc.gnu.org>2007-02-12 10:46:16 -0800
commit7ab0aca2fecff07dbc2dd3cf01e6288bf4a18454 (patch)
tree6185ee35e148de63968ad0243f38271e107885d1 /gcc
parentd8d25baea642cfd4e4bcb4d4b9e3f2b12921ffac (diff)
downloadgcc-7ab0aca2fecff07dbc2dd3cf01e6288bf4a18454.zip
gcc-7ab0aca2fecff07dbc2dd3cf01e6288bf4a18454.tar.gz
gcc-7ab0aca2fecff07dbc2dd3cf01e6288bf4a18454.tar.bz2
calls.c (emit_library_call_value_1): If PROMOTE_MODE modifed the result mode of the libcall, convert back to outmode.
* calls.c (emit_library_call_value_1): If PROMOTE_MODE modifed the result mode of the libcall, convert back to outmode. From-SVN: r121852
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/calls.c21
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 486cd93..e23a321 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-02-12 Richard Henderson <rth@redhat.com>
+
+ * calls.c (emit_library_call_value_1): If PROMOTE_MODE modifed the
+ result mode of the libcall, convert back to outmode.
+
2007-02-12 Roger Sayle <roger@eyesopen.com>
* config/i386/i386.md (*bswapdi2_rex): Renamed from bswapdi2.
diff --git a/gcc/calls.c b/gcc/calls.c
index 53e4d3f..1f8ed60 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -3916,10 +3916,25 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
value = gen_reg_rtx (outmode);
emit_group_store (value, valreg, NULL_TREE, GET_MODE_SIZE (outmode));
}
- else if (value != 0)
- emit_move_insn (value, valreg);
else
- value = valreg;
+ {
+ /* Convert to the proper mode if PROMOTE_MODE has been active. */
+ if (GET_MODE (valreg) != outmode)
+ {
+ int unsignedp = TYPE_UNSIGNED (tfom);
+
+ gcc_assert (targetm.calls.promote_function_return (tfom));
+ gcc_assert (promote_mode (tfom, outmode, &unsignedp, 0)
+ == GET_MODE (valreg));
+
+ valreg = convert_modes (outmode, GET_MODE (valreg), valreg, 0);
+ }
+
+ if (value != 0)
+ emit_move_insn (value, valreg);
+ else
+ value = valreg;
+ }
}
if (ACCUMULATE_OUTGOING_ARGS)