diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-10-23 21:37:52 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-10-23 21:37:52 +0000 |
commit | c7d91a943bad9fb36dced38981ce5234082b7f72 (patch) | |
tree | 12397fd1edfe289ae3f5ac482f42562897224513 | |
parent | 7989e4dc2471b3073e73f5a95095caf2dab7aac1 (diff) | |
download | gcc-c7d91a943bad9fb36dced38981ce5234082b7f72.tar.gz |
re PR middle-end/12705 (: complex powers)
PR middle-end/12705
* optabs.c (expand_binop): When expanding complex operations
inline, always calculate result into a new temporary register.
Minor code clean-ups.
From-SVN: r72871
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/optabs.c | 29 |
2 files changed, 17 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b76df940944..e29d3bca7d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-10-23 Roger Sayle <roger@eyesopen.com> + + PR middle-end/12705 + * optabs.c (expand_binop): When expanding complex operations + inline, always calculate result into a new temporary register. + Minor code clean-ups. + 2003-10-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> * objc/lang-specs.h: Handle -print-objc-runtime-info. diff --git a/gcc/optabs.c b/gcc/optabs.c index a56c89fc516..1410ed2d209 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -1521,24 +1521,17 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, rtx real0 = 0, imag0 = 0; rtx real1 = 0, imag1 = 0; rtx realr, imagr, res; - rtx seq; - rtx equiv_value; + rtx seq, result; int ok = 0; /* Find the correct mode for the real and imaginary parts. */ - enum machine_mode submode = GET_MODE_INNER(mode); + enum machine_mode submode = GET_MODE_INNER (mode); if (submode == BLKmode) abort (); - if (! target) - target = gen_reg_rtx (mode); - start_sequence (); - realr = gen_realpart (submode, target); - imagr = gen_imagpart (submode, target); - if (GET_MODE (op0) == mode) { real0 = gen_realpart (submode, op0); @@ -1558,6 +1551,10 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, if (real0 == 0 || real1 == 0 || ! (imag0 != 0 || imag1 != 0)) abort (); + result = gen_reg_rtx (mode); + realr = gen_realpart (submode, result); + imagr = gen_imagpart (submode, result); + switch (binoptab->code) { case PLUS: @@ -1749,16 +1746,10 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1, if (ok) { - if (binoptab->code != UNKNOWN) - equiv_value - = gen_rtx_fmt_ee (binoptab->code, mode, - copy_rtx (op0), copy_rtx (op1)); - else - equiv_value = 0; - - emit_no_conflict_block (seq, target, op0, op1, equiv_value); - - return target; + rtx equiv = gen_rtx_fmt_ee (binoptab->code, mode, + copy_rtx (op0), copy_rtx (op1)); + emit_no_conflict_block (seq, result, op0, op1, equiv); + return result; } } |