diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-02-12 18:46:16 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-02-12 18:46:16 +0000 |
| commit | 4e1a31691ae2d2568055ca860ef069e917dbe8f5 (patch) | |
| tree | 6185ee35e148de63968ad0243f38271e107885d1 | |
| parent | d179ab1f146f8dce7900942eaf796842147589c0 (diff) | |
| download | ppe42-gcc-4e1a31691ae2d2568055ca860ef069e917dbe8f5.tar.gz ppe42-gcc-4e1a31691ae2d2568055ca860ef069e917dbe8f5.zip | |
* calls.c (emit_library_call_value_1): If PROMOTE_MODE modifed the
result mode of the libcall, convert back to outmode.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121852 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/calls.c | 21 |
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 486cd9358f8..e23a321898a 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 53e4d3f073d..1f8ed60bf12 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) |

