diff options
author | Richard Henderson <rth@redhat.com> | 2007-03-01 08:30:38 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2007-03-01 08:30:38 -0800 |
commit | ceca734e8f8b368ab4087ce3970118775735f593 (patch) | |
tree | b6d11fc471a5238e81dafa6b6bd684ff01ef7366 /gcc/expr.c | |
parent | 5f81370d9f02d82b58964b104eb60197b7e773ef (diff) | |
download | gcc-ceca734e8f8b368ab4087ce3970118775735f593.zip gcc-ceca734e8f8b368ab4087ce3970118775735f593.tar.gz gcc-ceca734e8f8b368ab4087ce3970118775735f593.tar.bz2 |
expr.c (emit_move_complex_push): Export.
* expr.c (emit_move_complex_push): Export.
(emit_move_complex_parts): Split out from ...
(emit_move_complex): ... here.
* expr.h (emit_move_complex_push, emit_move_complex_parts): Declare.
* config/i386/i386.md (movcdi): New.
From-SVN: r122432
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 32 |
1 files changed, 21 insertions, 11 deletions
@@ -2987,7 +2987,7 @@ emit_move_resolve_push (enum machine_mode mode, rtx x) X is known to satisfy push_operand, and MODE is known to be complex. Returns the last instruction emitted. */ -static rtx +rtx emit_move_complex_push (enum machine_mode mode, rtx x, rtx y) { enum machine_mode submode = GET_MODE_INNER (mode); @@ -3027,6 +3027,25 @@ emit_move_complex_push (enum machine_mode mode, rtx x, rtx y) read_complex_part (y, !imag_first)); } +/* A subroutine of emit_move_complex. Perform the move from Y to X + via two moves of the parts. Returns the last instruction emitted. */ + +rtx +emit_move_complex_parts (rtx x, rtx y) +{ + /* Show the output dies here. This is necessary for SUBREGs + of pseudos since we cannot track their lifetimes correctly; + hard regs shouldn't appear here except as return values. */ + if (!reload_completed && !reload_in_progress + && REG_P (x) && !reg_overlap_mentioned_p (x, y)) + emit_insn (gen_rtx_CLOBBER (VOIDmode, x)); + + write_complex_part (x, read_complex_part (y, false), false); + write_complex_part (x, read_complex_part (y, true), true); + + return get_last_insn (); +} + /* A subroutine of emit_move_insn_1. Generate a move from Y into X. MODE is known to be complex. Returns the last instruction emitted. */ @@ -3081,16 +3100,7 @@ emit_move_complex (enum machine_mode mode, rtx x, rtx y) return ret; } - /* Show the output dies here. This is necessary for SUBREGs - of pseudos since we cannot track their lifetimes correctly; - hard regs shouldn't appear here except as return values. */ - if (!reload_completed && !reload_in_progress - && REG_P (x) && !reg_overlap_mentioned_p (x, y)) - emit_insn (gen_rtx_CLOBBER (VOIDmode, x)); - - write_complex_part (x, read_complex_part (y, false), false); - write_complex_part (x, read_complex_part (y, true), true); - return get_last_insn (); + return emit_move_complex_parts (x, y); } /* A subroutine of emit_move_insn_1. Generate a move from Y into X. |