From ceca734e8f8b368ab4087ce3970118775735f593 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 1 Mar 2007 08:30:38 -0800 Subject: 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 --- gcc/expr.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'gcc/expr.c') diff --git a/gcc/expr.c b/gcc/expr.c index f624d95..1dc437c 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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. -- cgit v1.1