diff options
| author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-26 09:06:36 +0000 |
|---|---|---|
| committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-26 09:06:36 +0000 |
| commit | 40651bac66a5f7ae99dc4afecaf3e552d3ca6d58 (patch) | |
| tree | 05229dbe977068726b1fe2d56cd11dea707cc8ec | |
| parent | 1a3e3a668a56cb30c95aec3dd5fb5227f6d6544f (diff) | |
| download | ppe42-gcc-40651bac66a5f7ae99dc4afecaf3e552d3ca6d58.tar.gz ppe42-gcc-40651bac66a5f7ae99dc4afecaf3e552d3ca6d58.zip | |
* calls.c (emit_library_call_value_1): Handle return values
in a PARALLEL.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61826 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 3 | ||||
| -rw-r--r-- | gcc/calls.c | 19 |
2 files changed, 20 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c6e0278d13..ef9354b5bc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2003-01-26 Alexandre Oliva <aoliva@redhat.com> + * calls.c (emit_library_call_value_1): Handle return values + in a PARALLEL. + * rtl.c (get_mode_alignment): Moved to... * stor-layout.c: ... here. diff --git a/gcc/calls.c b/gcc/calls.c index d85e2388295..d6f68cdf767 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -4080,7 +4080,7 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) { rtx insns; - if (valreg == 0 || GET_CODE (valreg) == PARALLEL) + if (valreg == 0) { insns = get_insns (); end_sequence (); @@ -4089,9 +4089,18 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) else { rtx note = 0; - rtx temp = gen_reg_rtx (GET_MODE (valreg)); + rtx temp; int i; + if (GET_CODE (valreg) == PARALLEL) + { + temp = gen_reg_rtx (outmode); + emit_group_store (temp, valreg, outmode); + valreg = temp; + } + + temp = gen_reg_rtx (GET_MODE (valreg)); + /* Construct an "equal form" for the value which mentions all the arguments in order as well as the function name. */ for (i = 0; i < nargs; i++) @@ -4125,6 +4134,12 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p) if (value != mem_value) emit_move_insn (value, mem_value); } + else if (GET_CODE (valreg) == PARALLEL) + { + if (value == 0) + value = gen_reg_rtx (outmode); + emit_group_store (value, valreg, outmode); + } else if (value != 0) emit_move_insn (value, valreg); else |

