re PR rtl-optimization/20306 (FP complex modes moved via GPRs)

PR rtl-optimization/20306
        * expr.c (emit_move_complex): Set try_int false if mode is
        MODE_COMPLEX_FLOAT and mov_optab exists for inner mode.  Only try
        emit_block_move if try_int is true.

From-SVN: r96312
This commit is contained in:
David Edelsohn 2005-03-11 22:58:49 +00:00 committed by David Edelsohn
parent a96cf7633a
commit c6506442db
2 changed files with 24 additions and 11 deletions

View file

@ -1,3 +1,10 @@
2005-03-11 David Edelsohn <edelsohn@gnu.org>
PR rtl-optimization/20306
* expr.c (emit_move_complex): Set try_int false if mode is
MODE_COMPLEX_FLOAT and mov_optab exists for inner mode. Only try
emit_block_move if try_int is true.
2005-03-11 Richard Henderson <rth@redhat.com>
PR target/20415

View file

@ -2877,19 +2877,14 @@ emit_move_complex (enum machine_mode mode, rtx x, rtx y)
if (push_operand (x, mode))
return emit_move_complex_push (mode, x, y);
/* For memory to memory moves, optimal behavior can be had with the
existing block move logic. */
if (MEM_P (x) && MEM_P (y))
{
emit_block_move (x, y, GEN_INT (GET_MODE_SIZE (mode)),
BLOCK_OP_NO_LIBCALL);
return get_last_insn ();
}
/* See if we can coerce the target into moving both values at once. */
/* Move floating point as parts. */
if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
&& mov_optab->handlers[GET_MODE_INNER (mode)].insn_code != CODE_FOR_nothing)
try_int = false;
/* Not possible if the values are inherently not adjacent. */
if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
try_int = false;
/* Is possible if both are registers (or subregs of registers). */
else if (register_operand (x, mode) && register_operand (y, mode))
@ -2907,7 +2902,18 @@ emit_move_complex (enum machine_mode mode, rtx x, rtx y)
if (try_int)
{
rtx ret = emit_move_via_integer (mode, x, y);
rtx ret;
/* For memory to memory moves, optimal behavior can be had with the
existing block move logic. */
if (MEM_P (x) && MEM_P (y))
{
emit_block_move (x, y, GEN_INT (GET_MODE_SIZE (mode)),
BLOCK_OP_NO_LIBCALL);
return get_last_insn ();
}
ret = emit_move_via_integer (mode, x, y);
if (ret)
return ret;
}